วิธีการใช้งาน Git Stash
git stash
คือการนำสิ่งที่เรากำลังทำงานอยู่ใน Working Area(ไฟล์ถูกเปลี่ยนแปลงหรือสร้างขึ้นมาใหม่แล้วยังไม่ได้ git add
) และ Stage ออกไปไว้ข้างนอกชั่วคราว(stash
แปลว่า ซ่อนไว้) เพื่อให้เราสามารถ Pull code ใหม่ลงมาหรือเปลี่ยนไปทำงานใน Branch ได้โดยไม่ต้อง Commit
การทำงานของ git stash
สิ่งที่เกิดขึ้นหลังจาก run คำสั่ง git stash
คือ
- เก็บการเปลี่ยนแปลงไว้ใน “stash” (เหมือนเป็นที่พักชั่วคราว)
- เปลี่ยน Working area กลับไปเป็น Commit ล่าสุด
โดยที่ในแต่ละ Item จะเรียกว่า WIP หรือ Work in Progress และมี Reference โดย Index เช่น stash@{0}
เมื่อไหร่ที่จะใช้ git stash
สมมุติว่าคุณกำลังแก้ไฟล์อยู่ใน branch หนึ่ง แล้วต้อง Switch กลับไปแก้ไข Bug แต่เราสิ่งที่เรากำลังเขียนอยู่ยังไม่เสร็จ เราจึงไม่สามารถ Commit code ได้
ตัวอย่างการใช้งาน git stash
สมมุติว่าคุณกำลังทำงานอยู่บน branch feature/a
(feature branch) และกำลังแก้ไขไฟล์ app.js
อยู่(Code ยังไม่สามารถทำงานได้)
แต่มีงานด่วนเข้ามาเราต้องรีบเข้าไปแก้ไข Bug ก่อน เราจึงต้องสร้าง branch hotfix
ในสถานการณ์นี้เราจึงต้องใช้ git stash
โดยต้องมีขึ้นตอนดังนี้
1. ตรวจสอบสถานะของไฟล์ด้วย git status
เราต้องตรวจสอบว่าสิ่งที่จะนำเข้าไปเก็บใน stash มีอะไรบ้าง โดยเราจะ run คำสั่ง
git status
ผลลัพธ์จะออกมาเป็น
On branch feature/a
Changes not staged for commit:
modified: app.js
2. เก็บการเปลี่ยนแปลงด้วยคำสั่ง git stash
เราจะนำการเปลี่ยนแปลงไปเก็บไว้ใน git stash ด้วยคำสั่ง
git stash
ผลลัพธ์จะออกมาเป็น
Saved working directory and index state WIP on feature/a: XXXXX commit message
ตอนนี้ Git จะซ่อนการเปลี่ยนแปลงไว้(stash) และเปลี่ยน Working Area กลับไปเป็น commit ล่าสุดเราสามารถตรวจสอบ WIP ที่อยู่ใน stash ด้วยคำสั่ง
git stash list
ผลลัพธ์จะออกมาเป็น
stash@{0}: WIP on feature/a: XXXXXX commit message
3. สร้าง branch hotfix
หลังจากซ่อนหรือเก็บการเปลี่ยนแปลงไว้แล้ว เราก็สร้าง branch hotfix เพื่อแก้ไข bug ได้ทันที โดยเราจะใช้คำสั่ง
git branch -c hotfix/a
หลังจากนั้นแก้ Bug ที่ได้รับมอบหมายให้เสร็จเรียบร้อย แล้วก็ Commit code เข้ามาด้วยคำสั่ง
git add .
git commit -am "Fix urgent bug"
git push -u origin hotfix/a
4. กลับมาทำงานต่อที่ branch เดิม
หลังจากที่เรา Commit และ Push code ขึ้นไปเรียบร้อย หลังจากนั้นเราจะกลับมาทำงานที่ feature/a ต่อเราก็จะกลับมาที่ branch feature/a ด้วยคำสั่ง
git switch feature/a
แต่ ณ ตอนนี้ Code ของเราจะยังเป็น Commit ล่าสุดของ branch feature/a หลังจากนี้เราต้องนำการเปลี่ยนแปลงที่เราได้ซ่อนเก็บไว้ใน stash กลับมาด้วยคำสั่ง
git stash pop
ผลลัพธ์จะออกมาเป็น
Auto-merging app.js
Dropped refs/stash@{0} (xxx)
หรือถ้าเราต้องการดึงเอาการเปลี่ยนแปลง(WIP) ใน stash กลับมาโดยที่ไม่ลบ WIP ออกจาก stash ให้เราใช้คำสั่ง WIP
git stash apply
และถ้าต้องการระบุ stash ที่จะนำกลับมาให้เราใส่ Index ของ WIP เข้าไปเช่น ถ้าต้องการนำ stash@{0} กลับมาให้ระบุ Index เข้าไปหลัง apply
git stash apply 0
แต่ถ้าคุณต้องการลบ WIP ออกจาก stash โดยระบุ WIP ที่ต้องการลบออกด้วยคำสั่ง
# 0 คือ Index ของ stash มาจาก stash@{0}
git stash drop 0
ตอนนี้คุณจะได้ไฟล์ app.js
กลับมาเหมือนก่อนที่จะรันคำสั่ง git stash
แล้ว และ WIP ใน stash ก็ถูกลบออกจากรายการ
คำสั่งอื่นๆของ git stash
นอกจากคำสั่งหลักๆ ที่เราพูดถึงไปก่อนหน้านี้แล้วยังมีคำสั่งอื่นๆที่น่าจะต้องรู้จักเอาไว้ดังนี้
คำสั่ง | ใช้สำหรับ |
---|---|
git stash save "ข้อความ" |
เก็บ stash พร้อมข้อความอธิบาย |
git stash drop |
ลบ WIP รายการแรกออกจาก stash |
git stash clear |
ลบ stash ทั้งหมด |
คุณสามารถเข้าไปดูรายละเอียกการใช้งาน git stash
อื่นๆต่อได้ที่นี่