git-stash กับ git-branch


92

ในคำถาม Git ก่อนหน้านี้ Daniel Benamy กำลังพูดถึงขั้นตอนการทำงานใน Git:

ฉันกำลังทำงานหลักและมุ่งมั่นบางอย่างจากนั้นก็ตัดสินใจว่าฉันต้องการพักงานนั้นไว้ ฉันสำรองข้อมูลไว้สองสามข้อแล้วแยกจากก่อนที่ฉันจะเริ่มงานอึ

เขาต้องการฟื้นฟูสถานะการทำงานของเขาให้กลับสู่จุดเดิมโดยไม่สูญเสียการเปลี่ยนแปลงในปัจจุบัน คำตอบทั้งหมดวนเวียนอยู่ในรูปแบบต่างๆเช่น

git branch -m master crap_work
git branch -m previous_master master

สิ่งนี้เปรียบเทียบกับgit stashอย่างไร? ฉันสับสนเล็กน้อยที่พยายามดูว่ากรณีการใช้งานที่แตกต่างกันที่นี่คืออะไรเมื่อดูเหมือนว่าทุกอย่างgit stashจะได้รับการจัดการโดยการแตกแขนง ...


@ Jordi Bunster : ขอบคุณที่เคลียร์เรื่องต่างๆ ฉันเดาว่าฉันคิดว่า "การซ่อน" เป็นเหมือนกิ่งไม้ที่มีน้ำหนักเบาไม่มีชื่อ ดังนั้นสิ่งที่ซ่อนสามารถทำได้สาขาก็ทำได้เช่นกัน แต่มีคำอื่น ๆ ดี!

คำตอบ:


109

"ที่เก็บ" จะนำสิ่งที่ " สกปรก " ที่ไม่ได้ผูกมัดไว้ในสำเนาที่ใช้งานของคุณมาเก็บไว้และทำให้คุณมีสำเนาที่ใช้งานได้

มันไม่แตกแขนงเลยจริงๆ จากนั้นคุณสามารถใช้ที่ซ่อนอยู่ด้านบนของสาขาอื่น ๆ หรือใน Git 1.6 คุณสามารถทำได้:

git stash branch <branchname> [<stash>]

เพื่อใช้ที่ซ่อนอยู่ด้านบนของสาขาใหม่ทั้งหมดในคำสั่งเดียว

ดังนั้นการซ่อนจึงใช้ได้ผลดีหากคุณยังไม่ได้ระบุสาขาที่ " ผิด "

หากคุณตกลงไปแล้วขั้นตอนการทำงานที่คุณอธิบายในคำถามของคุณจะเป็นทางเลือกที่ดีกว่า และยังไงก็ตามคุณพูดถูก: Git มีความยืดหยุ่นมากและด้วยความยืดหยุ่นนั้นมาพร้อมกับฟังก์ชันการทำงานที่ทับซ้อนกัน


1
สิ่งหนึ่งที่กัดฉัน ... คุณเขียนว่า [<stash>] ดูเหมือนจริงได้ไหม! พวกเขาใส่ไว้ในสัญกรณ์นั้นในเอกสาร แต่ไม่ชัดเจนว่าควรเป็น 1 หรือ @ {1} หรืออะไร
Gregg Lind

1
หากคุณต้องการอ้างถึงที่เก็บเฉพาะ "N" ให้ใช้ stash @ {N}
Jordi Bunster

9
ดูgit stash listชื่อที่เก็บของคุณ
idbrii

6
Gregg ใช่คุณสามารถ: git stash save (ชื่อที่เก็บของคุณ) ทำให้มีประโยชน์มากขึ้นหากคุณใช้งานเป็นจำนวนมากเพื่อให้คุณรู้ว่าแต่ละที่เก็บมีไว้ทำอะไร คุณสามารถใช้ git stash show -p (name) เพื่อแสดงแพตช์ของ stash
Thomas Vander Stichele

7
นอกจากนี้git stash show -uเพื่อแสดงให้เห็นความแตกต่างของสะสมกับสำเนาการทำงาน
ken

49

เมื่อคุณกู้คืนที่เก็บของคุณการเปลี่ยนแปลงของคุณจะถูกนำไปใช้อีกครั้งและคุณจะดำเนินการกับโค้ดของคุณต่อไป

เพื่อซ่อนการเปลี่ยนแปลงปัจจุบันของคุณ

$ git stash save 
Saved "WIP on master: e71813e..."

คุณยังสามารถมีที่ซ่อนได้มากกว่าหนึ่งชิ้น ที่ซ่อนทำงานเหมือนกองซ้อน ทุกครั้งที่คุณบันทึกที่เก็บใหม่ระบบจะวางไว้ที่ด้านบนของสแต็ก

$ git stash list
stash@{0}: WIP on master: e71813e..."

หมายเหตุstash@{0}ส่วน? นั่นคือรหัสที่ซ่อนของคุณ คุณจะต้องใช้เพื่อกู้คืนในภายหลัง ลองทำตอนนี้ รหัสที่ซ่อนจะเปลี่ยนไปตามที่เก็บทั้งหมดที่คุณทำ stash @ {0} หมายถึงที่เก็บล่าสุดที่คุณสร้างขึ้น

เพื่อใช้ที่ซ่อน

$ git stash apply stash@{0}

คุณอาจสังเกตเห็นว่าที่ซ่อนยังคงอยู่ที่นั่นหลังจากที่คุณใช้แล้ว คุณสามารถวางได้หากไม่ต้องการอีกต่อไป

$ git stash drop stash@{0}

หรือเนื่องจากที่เก็บของทำหน้าที่เหมือนกองซ้อนคุณสามารถเปิดที่เก็บล่าสุดที่คุณบันทึกไว้:

$ git stash pop

หากคุณต้องการล้างข้อมูลที่ซ่อนทั้งหมดของคุณออกไปให้เรียกใช้คำสั่ง 'clear':

$ git stash clear

อาจเป็นไปได้ว่าคุณไม่ได้ใช้ที่ซ่อนบ่อยๆ หากคุณต้องการเพียงแค่ซ่อนการเปลี่ยนแปลงของคุณอย่างรวดเร็วเพื่อกู้คืนในภายหลังคุณสามารถละทิ้ง ID ที่ซ่อนไว้ได้

$ git stash
...
$ git stash pop

อย่าลังเลที่จะทดลองใช้ที่ซ่อนก่อนที่จะใช้กับงานที่สำคัญจริงๆ

ฉันยังมีรุ่นอื่น ๆ ในเชิงลึกของนี้โพสต์ในบล็อกของฉัน


แหล่งข้อมูลที่เป็นประโยชน์มากกว่าคำตอบที่ 'ดีที่สุด' ที่ควรจะเป็น ... (แม้ว่าคำตอบที่ดีที่สุดจะทำให้ชัดเจนมาก แต่ก็มีความสับสนเกี่ยวกับการใช้งานเต็มรูปแบบ)
kumarharsh

9

ฉันมักจะระวังการซ่อนคอมไพล์ หากคุณซ่อนไม่กี่ครั้งสิ่งต่างๆมักจะยุ่งเหยิง git stash list จะแสดงรายการที่เก็บข้อมูลที่คุณสร้างขึ้นพร้อมกับข้อความหากคุณให้ไว้ ... แต่ปัญหาอยู่ที่ว่าคุณไม่สามารถล้างที่ซ่อนได้ยกเว้นด้วย git stash ที่โหดร้าย (ซึ่งจะลบทั้งหมด) . ดังนั้นหากคุณไม่สนใจที่จะให้ข้อความที่มีคำอธิบายที่ยอดเยี่ยมสำหรับที่เก็บของของคุณอยู่เสมอ (ซึ่งขัดกับปรัชญาของที่เก็บซ่อน) คุณจะพบกับที่เก็บซ่อนที่ไม่สามารถเข้าใจได้

วิธีเดียวที่ฉันรู้ว่าจะใช้ gitk ตัวไหน - ทั้งหมดและระบุที่ซ่อน อย่างน้อยสิ่งนี้ก็ช่วยให้คุณเห็นสิ่งที่คอมมิตที่ซ่อนถูกสร้างขึ้นรวมถึงความแตกต่างของทุกสิ่งที่รวมอยู่ในที่เก็บนั้น

โปรดทราบว่าฉันใช้ git 1.5.4.3 และฉันคิดว่า 1.6 เพิ่ม git stash pop ซึ่งฉันเดาว่าจะใช้ที่เก็บที่เลือกและลบออกจากรายการ ซึ่งดูเหมือนจะสะอาดกว่ามาก

สำหรับตอนนี้ฉันพยายามที่จะแยกสาขาเสมอเว้นแต่ฉันจะคิดบวกอย่างแน่นอนฉันจะกลับไปที่ที่ซ่อนนั้นในวันเดียวกันแม้ภายในหนึ่งชั่วโมง


3
คุณสร้างสาขาโดยไม่ให้ชื่อที่เป็นประโยชน์หรือไม่? ถ้าไม่อย่างนั้นฉันก็ไม่เห็นว่าทำไมคุณไม่ทำแบบเดียวกันกับที่ซ่อน หากคุณต้องการทราบว่ามีอะไรบ้างคุณเพียงแค่ใช้ git-stash show เพื่อแสดงว่าไฟล์ใดเปลี่ยนแปลงหรือใช้ git-stash และ git-diff เพื่อดูความแตกต่างที่แท้จริง การตัดแต่งกิ่งให้เล็กลงก็เหมือนกับการควบคุมกิ่งไม้ของคุณ
Xiong Chiamiov

18
จริงๆแล้วคุณสามารถลบที่ซ่อนเดียวได้โดยใช้git stash drop [<stash>]
kumarharsh

1
จริงอยู่ที่คอมไพล์มี git stash drop มานานแล้ว ตอนนี้ PITA ใช้น้อยกว่ามาก ฉันใช้มันทุกวันและแม้กระทั่งช่วงเวลาที่ยาวนานในตอนนี้
webmat

3

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

ความแตกต่างที่สำคัญจากgit stash:

  • git stashบันทึกสถานะ git สกปรกให้แคบลง (ไฟล์ที่แก้ไขและเพิ่มไฟล์ในดัชนี) ในขณะที่git-bottleได้รับการออกแบบมาเพื่อบันทึกทุกสิ่งที่แตกต่างจากHEADและแยกความแตกต่างในวิธีการรักษาระหว่างการแก้ไขแก้ไขและไม่เพิ่มไม่เพิ่มเส้นทางที่ไม่ได้ผสาน และสถานะ rebase / merge ที่สมบูรณ์ (เฉพาะพา ธ ที่อยู่ด้านล่าง.gitignoreจะไม่ถูกบันทึก)
  • git stashบันทึกเพื่อซ่อนวัตถุที่คุณต้องการติดตามแยกต่างหาก ถ้าฉัน stashed บางสิ่งบางอย่าง 2 สัปดาห์ที่ผ่านมาผมอาจจะจำไม่ได้ว่าในขณะที่git-bottleบันทึกเป็นกระทำในเบื้องต้นว่าจะสาขาในปัจจุบัน การกระทำย้อนกลับgit-unbottleซึ่งเทียบเท่ากับgit stashป๊อป เป็นไปได้ที่จะผลักดันและแบ่งปันคอมมิตเหล่านี้ระหว่างที่เก็บ สิ่งนี้มีประโยชน์สำหรับการสร้างระยะไกลโดยที่คุณมีที่เก็บอื่นในเซิร์ฟเวอร์ระยะไกลเพื่อสร้างหรือทำงานร่วมกับผู้อื่นในการแก้ไขข้อขัดแย้ง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.