# ExitWorktree

ออกจากเซสชัน worktree ที่สร้างขึ้นก่อนหน้านี้โดย `EnterWorktree` และคืนค่าเซสชันกลับสู่ไดเรกทอรีทำงานเดิม เครื่องมือนี้ทำงานเฉพาะกับ worktree ที่สร้างโดย `EnterWorktree` ในเซสชันปัจจุบันเท่านั้น หากไม่มีเซสชันดังกล่าวที่ใช้งานอยู่ การเรียกใช้จะไม่มีผลใดๆ

## เมื่อใดควรใช้

- งานใน worktree แบบแยกส่วนเสร็จสิ้นแล้ว และต้องการกลับสู่ไดเรกทอรีทำงานหลัก
- งานใน worktree ของสาขาฟีเจอร์เสร็จสิ้นและทำ merge แล้ว ต้องการลบสาขาและไดเรกทอรีทิ้ง
- ต้องการเก็บ worktree ไว้ใช้งานภายหลัง โดยเพียงแค่กลับสู่ไดเรกทอรีเดิมโดยไม่ลบสิ่งใด
- ต้องการละทิ้งสาขาเชิงทดลองหรือสาขาชั่วคราวโดยไม่ทิ้ง artifact ไว้บนดิสก์
- ต้องการเริ่มเซสชัน `EnterWorktree` ใหม่ ซึ่งต้องออกจากเซสชันปัจจุบันก่อน

## พารามิเตอร์

- `action` (string, จำเป็น): `"keep"` เก็บไดเรกทอรี worktree และสาขาไว้บนดิสก์เพื่อให้กลับมาได้ในภายหลัง; `"remove"` ลบทั้งไดเรกทอรีและสาขาเพื่อออกอย่างสะอาด
- `discard_changes` (boolean, ไม่บังคับ, ค่าเริ่มต้น `false`): มีความหมายเฉพาะเมื่อ `action` เป็น `"remove"` เท่านั้น หาก worktree มีไฟล์ที่ยังไม่ได้ commit หรือ commit ที่ไม่มีในสาขาเดิม เครื่องมือจะปฏิเสธการลบ เว้นแต่จะตั้ง `discard_changes` เป็น `true` การตอบกลับข้อผิดพลาดจะแสดงรายการการเปลี่ยนแปลงที่เกี่ยวข้อง เพื่อให้สามารถยืนยันกับผู้ใช้ก่อนเรียกใช้ซ้ำ

## ตัวอย่าง

### ตัวอย่างที่ 1: ออกอย่างสะอาดหลังจาก merge การเปลี่ยนแปลง

หลังจากเสร็จงานใน worktree และ merge สาขาเข้า main แล้ว ให้เรียก `ExitWorktree` ด้วย `action: "remove"` เพื่อลบไดเรกทอรี worktree และสาขา แล้วกลับสู่ไดเรกทอรีทำงานเดิม

```
ExitWorktree(action: "remove")
```

### ตัวอย่างที่ 2: ทิ้ง worktree ชั่วคราวที่มีโค้ดเชิงทดลองที่ยังไม่ได้ commit

หาก worktree มีการเปลี่ยนแปลงเชิงทดลองที่ยังไม่ได้ commit ซึ่งต้องการทิ้งทั้งหมด ให้ลอง `action: "remove"` ก่อน เครื่องมือจะปฏิเสธและแสดงรายการการเปลี่ยนแปลงที่ยังไม่ได้ commit หลังจากได้รับการยืนยันจากผู้ใช้ว่าสามารถทิ้งได้ ให้เรียกใช้อีกครั้งด้วย `discard_changes: true`

```
ExitWorktree(action: "remove", discard_changes: true)
```

## หมายเหตุ

- เครื่องมือนี้ทำงานเฉพาะกับ worktree ที่สร้างโดย `EnterWorktree` ในเซสชันปัจจุบันเท่านั้น จะไม่กระทบต่อ worktree ที่สร้างด้วย `git worktree add`, worktree จากเซสชันก่อนหน้า หรือไดเรกทอรีทำงานปกติหากไม่เคยเรียก `EnterWorktree` เลย — ในกรณีเหล่านี้การเรียกใช้จะไม่มีผลใดๆ
- `action: "remove"` จะถูกปฏิเสธหาก worktree มีการเปลี่ยนแปลงที่ยังไม่ได้ commit หรือ commit ที่ไม่มีในสาขาเดิม เว้นแต่จะระบุ `discard_changes: true` อย่างชัดเจน ควรยืนยันกับผู้ใช้เสมอก่อนตั้งค่า `discard_changes: true` เนื่องจากข้อมูลไม่สามารถกู้คืนได้
- หาก worktree มีเซสชัน tmux แนบอยู่: เมื่อ `remove` เซสชันจะถูกยุติ; เมื่อ `keep` เซสชันยังคงทำงานอยู่และจะส่งคืนชื่อเซสชันเพื่อให้ผู้ใช้สามารถเชื่อมต่อกลับในภายหลัง
- หลังจาก `ExitWorktree` เสร็จสิ้น สามารถเรียก `EnterWorktree` อีกครั้งเพื่อเริ่มเซสชัน worktree ใหม่

