Git Stash ตัวช่วยสลับงานด่วนโดยไม่ทำให้ Commit History เลอะ
Git stash เป็นคำสั่งที่ช่วยเก็บการเปลี่ยนแปลงชั่วคราว เพื่อให้คุณสลับไปทำงานด่วนได้ทันทีโดยไม่ต้อง commit งานที่ยังไม่พร้อม หากใช้อย่างถูกจังหวะ จะช่วยให้ประวัติการพัฒนาสะอาดและทำงานร่วมกับทีมได้ง่ายขึ้น

Git Stash ตัวช่วยสลับงานด่วนโดยไม่ทำให้ Commit History เลอะ
เวลาที่กำลังพัฒนาฟีเจอร์หนึ่งอยู่ แต่จู่ๆ มีบั๊กเร่งด่วนเข้ามาให้แก้ หรือมีงานรีวิวที่ต้องรีบตอบทันที หลายคนมักเจอปัญหาว่าไฟล์ที่กำลังแก้ยังไม่พร้อม commit แต่ก็จำเป็นต้องสลับไปทำอย่างอื่นก่อน ในสถานการณ์แบบนี้ git stash คือเครื่องมือที่ช่วยชีวิตได้ดีมาก
พูดให้เห็นภาพง่ายๆ คือ commit เปรียบเหมือนการบันทึกงานลงใน timeline อย่างเป็นทางการ ส่วน stash คือการฝากของไว้ชั่วคราว แล้วค่อยกลับมาหยิบไปทำต่อภายหลัง
Git Stash คืออะไร
git stash มีหน้าที่เก็บการเปลี่ยนแปลงใน working directory ไว้ชั่วคราว แล้วคืนสถานะโปรเจกต์ให้สะอาดทันที ทำให้คุณสามารถสลับ branch, pull, rebase หรือไปแก้งานด่วนได้โดยไม่ต้องฝืน commit งานที่ยังทำไม่เสร็จ
ข้อดีสำคัญคือช่วยลดการสร้าง commit ที่ไม่มีคุณภาพ เช่น commit งานครึ่งๆ กลางๆ หรือข้อความ commit ที่ตั้งแบบขอไปที ซึ่งมักทำให้ประวัติการพัฒนาดูเลอะและย้อนกลับมาทำความเข้าใจได้ยาก
สถานการณ์ที่เหมาะกับการใช้ Git Stash
มีหลายกรณีที่ git stash เหมาะมาก เช่น
- กำลังแก้หลายไฟล์อยู่ แต่ test ยังไม่ผ่าน
- ต้องสลับ branch ไปแก้ hotfix ด่วน
- อยาก pull หรือ rebase แต่ยังมีไฟล์ค้างที่แก้อยู่
- มีการเปลี่ยนแปลงเล็กน้อยใน config หรือ log ที่ไม่อยาก commit
ถ้าคุณเคยรู้สึกว่า “ยังไม่อยาก commit แต่ต้องรีบไปทำอย่างอื่นก่อน” นั่นคือสัญญาณชัดเจนว่าควรใช้ stash
ชุดคำสั่งพื้นฐานที่ควรรู้
เริ่มต้นด้วยการเก็บงานชั่วคราว พร้อมตั้งชื่อเพื่อให้จำได้ง่าย
git stash push -m "WIP: payment refactor"
หลังจากนั้นคุณสามารถสลับไปทำงานด่วนได้ทันที เช่น
git switch hotfix/login-timeout
เมื่อกลับมาที่งานเดิม แล้วต้องการนำงานคืนพร้อมเอารายการนั้นออกจาก stash ให้ใช้
git stash pop
แต่ถ้าต้องการเอางานคืนโดยยังเก็บสำรองไว้ใน stash ก่อน ให้ใช้
git stash apply
ความต่างสำคัญคือ pop จะดึงออกมาแล้วลบ stash ก้อนนั้นทิ้ง ส่วน apply จะดึงกลับมาใช้งานแต่ยังเก็บรายการเดิมไว้
Git Stash เก็บได้หลายชุด
หลายคนอาจคิดว่า stash เก็บได้แค่ชุดเดียว แต่จริงๆ แล้วมันทำงานแบบ stack หรือเหมือนกองจานที่วางซ้อนกันได้หลายใบ
ดูรายการ stash ทั้งหมดได้ด้วยคำสั่ง
git stash list
หากต้องการหยิบ stash ที่ไม่ใช่อันล่าสุด เช่นรายการลำดับที่ 2 ให้ใช้
git stash pop stash@{2}
และถ้าต้องการดูก่อนว่าใน stash นั้นมีการเปลี่ยนแปลงอะไรบ้าง ก็ใช้ได้ดังนี้
git stash show -p stash@{0}
ความสามารถนี้ช่วยให้จัดการงานค้างหลายชุดได้เป็นระบบมากขึ้น โดยเฉพาะเวลาที่ต้องสลับบริบทการทำงานบ่อย
ทริคที่มีประโยชน์มากสำหรับการใช้งานจริง
นอกจากคำสั่งพื้นฐานแล้ว git stash ยังมีรูปแบบการใช้งานที่ยืดหยุ่นมาก
1) เก็บไฟล์ที่ยังไม่ได้ add ด้วย
git stash push -u -m "WIP with new files"
คำสั่งนี้จะรวมไฟล์ untracked เข้าไปด้วย เหมาะเมื่อคุณเพิ่งสร้างไฟล์ใหม่แต่ยังไม่ได้ git add
2) เก็บทุกอย่างรวมถึงไฟล์ที่ถูก ignore
git stash push -a
ใช้ได้ในกรณีที่ต้องการเก็บทุกอย่างจริงๆ รวมถึง build artifacts หรือไฟล์ที่ถูก ignore แต่ควรใช้อย่างระมัดระวัง เพราะอาจเก็บไฟล์ที่ไม่จำเป็นมากเกินไป
3) เก็บเฉพาะบางส่วนแบบเลือกเป็นชิ้นๆ
git stash push -p
เหมาะสำหรับกรณีที่มีทั้งงานที่อยากเก็บ และงานที่อยากปล่อยไว้ใน working directory ทำให้ควบคุมได้ละเอียดขึ้น
4) สร้าง branch ใหม่จาก stash ทันที
git stash branch feature/continue-later stash@{0}
วิธีนี้เหมาะมากเมื่อไม่อยากเสี่ยงกับ conflict จากการ apply หรือ pop ลงใน branch ปัจจุบัน เพราะสามารถแยกไปทำต่อใน branch ใหม่ได้ทันที
ข้อควรระวังในการใช้ Git Stash
แม้ git stash จะสะดวกมาก แต่ก็มีจุดที่ควรรู้ไว้เช่นกัน
1) ไม่ใช่ระบบ backup ระยะยาว
stash ถูกออกแบบมาสำหรับการพักงานชั่วคราว ไม่ใช่ที่เก็บงานระยะยาว หากเผลอลบ stash ไปแล้ว อาจกู้กลับมาได้ยาก แม้บางครั้งจะพอใช้ reflog ช่วยได้ก็ตาม
2) การ pop หรือ apply อาจเกิด conflict ได้
ถ้าไฟล์เดียวกันถูกแก้ในช่วงเวลาต่างกัน หรือ branch ปัจจุบันมีการเปลี่ยนแปลงไปแล้ว การนำ stash กลับมาอาจชนกับโค้ดปัจจุบัน และต้องแก้ conflict เหมือนการ merge ตามปกติ
3) Stash เก็บได้ทั้ง staged และ unstaged
หลายคนเข้าใจว่า stash จะเก็บเฉพาะไฟล์ที่ยังไม่ได้ add แต่จริงๆ แล้วสามารถเก็บได้ทั้ง staged และ unstaged ดังนั้นตอนนำกลับมาใช้อาจเห็นสถานะไฟล์เปลี่ยนไปจากที่คาดไว้
แนวทางใช้งานให้เป็นมืออาชีพมากขึ้น
วิธีใช้ stash ให้มีประสิทธิภาพ ไม่ใช่แค่สั่งเก็บแล้วจบ แต่ควรจัดระเบียบให้ดีด้วย
สิ่งที่ควรทำเป็นนิสัยคือการตั้งชื่อทุกครั้งด้วย -m และใส่บริบทให้ชัด เช่น ticket, module หรือเป้าหมายของงาน ตัวอย่างเช่น
WIP: JIRA-214 add cachingWIP: demo tweaks
การตั้งชื่อที่ดีจะช่วยให้คุณกลับมาหางานที่ค้างไว้ได้เร็ว และลดความสับสนเมื่อต้องเก็บหลายก้อน
นอกจากนี้ควรล้าง stash ที่ไม่ใช้แล้วเป็นระยะ
ลบเฉพาะรายการเดียว
git stash drop stash@{1}
ลบทั้งหมด
git stash clear
การจัดการรายการ stash ให้สะอาดอยู่เสมอจะช่วยลดโอกาสหยิบผิด หรือปล่อยให้มีงานเก่าค้างจนลืม
สรุป
git stash คือเครื่องมือที่เหมาะมากสำหรับการสลับไปทำงานด่วน โดยไม่ต้อง commit งานที่ยังไม่เสร็จหรือยังไม่พร้อมเผยแพร่ลงในประวัติหลักของโปรเจกต์ มันช่วยให้ workflow ยืดหยุ่นขึ้น แก้ปัญหาเฉพาะหน้าได้เร็ว และยังรักษา commit history ให้ดูสะอาดอ่านง่าย
ถ้าอยากทำงานกับ Git ได้คล่องขึ้น ลองสร้างนิสัยง่ายๆ คือ ก่อนสลับไปทำงานด่วนให้ stash พร้อมตั้งชื่อทุกครั้ง แล้วค่อยกลับมาหยิบงานเดิมไปต่อ วิธีเล็กๆ นี้ช่วยลดความวุ่นวายได้มากกว่าที่คิด