Coding Gun

วิธีการใช้งาน Git Stash

git stash คือการนำสิ่งที่เรากำลังทำงานอยู่ใน Working Area(ไฟล์ถูกเปลี่ยนแปลงหรือสร้างขึ้นมาใหม่แล้วยังไม่ได้ git add) และ Stage ออกไปไว้ข้างนอกชั่วคราว(stash แปลว่า ซ่อนไว้) เพื่อให้เราสามารถ Pull code ใหม่ลงมาหรือเปลี่ยนไปทำงานใน Branch ได้โดยไม่ต้อง Commit

การทำงานของ git stash

สิ่งที่เกิดขึ้นหลังจาก run คำสั่ง git stash คือ

  1. เก็บการเปลี่ยนแปลงไว้ใน “stash” (เหมือนเป็นที่พักชั่วคราว)
  2. เปลี่ยน 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 อื่นๆต่อได้ที่นี่

Phanupong Permpimol
Follow me