ในฐานะที่เป็นคำอธิบายเพิ่มเติมโปรดทราบว่าการคอมgit stashมิตสองครั้งหรือสามคอมมิต ค่าเริ่มต้นคือสอง คุณจะได้สามตัวถ้าคุณใช้การสะกดของตัวเลือก--allหรือ--include-untracked
ความมุ่งมั่นสองหรือสามข้อนี้มีความพิเศษในลักษณะสำคัญประการหนึ่งคือไม่มีสาขา Git stashตั้งพวกเขาผ่านชื่อพิเศษ 1 แต่สิ่งที่สำคัญที่สุดคือสิ่งที่ Git ช่วยให้คุณและทำให้คุณทำกับความมุ่งมั่นสองหรือสามข้อนี้ เพื่อให้เข้าใจสิ่งนี้เราต้องดูว่ามีอะไรอยู่ในข้อตกลงเหล่านั้น
สิ่งที่อยู่ในที่ซ่อน
ทุกการกระทำอย่างใดอย่างหนึ่งรายการหรือมากกว่าสามารถปกครองกระทำ สิ่งเหล่านี้สร้างกราฟซึ่งในภายหลังจะชี้กลับไปที่กราฟก่อนหน้านี้ โดยปกติการเก็บซ่อนจะมีสองคอมมิตซึ่งฉันต้องการเรียกใช้iสำหรับเนื้อหาดัชนี / พื้นที่จัดเตรียมและwสำหรับเนื้อหาแผนผังงาน อย่าลืมว่าแต่ละคอมมิตมีสแนปชอต ในการคอมมิตปกติสแน็ปช็อตนี้สร้างจากเนื้อหาดัชนี / พื้นที่จัดเตรียม ดังนั้นการiกระทำจึงเป็นความผิดปกติที่สมบูรณ์แบบ! มันไม่ได้อยู่ในสาขาใด ๆ :
...--o--o--o <-- branch (HEAD)
|
i
หากคุณกำลังสร้างที่ซ่อนตามปกติgit stashโค้ดจะสร้างขึ้นในwตอนนี้โดยการคัดลอกไฟล์แผนผังงานที่ติดตามทั้งหมดของคุณ (ลงในดัชนีเสริมชั่วคราว) Git ชุดแรกของผู้ปกครองนี้wมุ่งมั่นที่จะชี้ไปกระทำและผู้ปกครองที่สองไปยังจุดที่จะกระทำHEAD iสุดท้ายตั้งค่าstashให้ชี้ไปที่การwกระทำนี้:
...--o--o--o <-- branch (HEAD)
|\
i-w <-- stash
ถ้าคุณเพิ่ม--include-untrackedหรือ--all, Git ทำให้เป็นพิเศษกระทำuในระหว่างการทำและi wเนื้อหาสแน็ปช็อตสำหรับuคือไฟล์ที่ไม่ถูกติดตาม แต่ไม่ถูกเพิกเฉย ( --include-untracked) หรือไฟล์ที่ไม่ถูกติดตามแม้ว่าจะถูกละเว้น ( --all) พิเศษนี้uกระทำมีไม่มีพ่อแม่และจากนั้นเมื่อgit stashรถwจะกำหนดw's สามพ่อแม่นี้uกระทำเพื่อให้คุณได้รับ:
...--o--o--o <-- branch (HEAD)
|\
i-w <-- stash
/
u
ในจุดนี้ Git จะลบไฟล์ work-tree ที่รวมเข้าด้วยuกัน (ใช้git cleanเพื่อทำเช่นนั้น)
การกู้คืนที่ซ่อน
เมื่อคุณกู้คืนที่ซ่อนคุณมีตัวเลือกในการใช้--indexหรือไม่ใช้ นี้จะบอกgit stash apply(หรือคำสั่งใด ๆ ที่ใช้ภายในapplyเช่นpop) ว่ามันควรจะใช้iกระทำเพื่อพยายามที่จะปรับเปลี่ยนดัชนีปัจจุบันของคุณ การปรับเปลี่ยนนี้ทำได้ด้วย:
git diff <hash-of-i> <hash-of-i's-parent> | git apply --index
(ไม่มากก็น้อยมีรายละเอียดสำคัญมากมายที่เข้ามาขัดขวางแนวคิดพื้นฐานที่นี่)
หากคุณละเว้น--indexให้git stash applyละเว้นการiกระทำโดยสิ้นเชิง
หากที่เก็บมีเพียงสองคอมมิตgit stash applyตอนนี้สามารถใช้คอมwมิตได้ มันทำได้โดยการเรียกgit merge2 (โดยไม่อนุญาตให้คอมมิตหรือถือว่าผลลัพธ์เป็นการผสานปกติ) โดยใช้คอมมิตดั้งเดิมที่สร้างที่เก็บ ( iของพาเรนต์และพาเรนต์wแรก) เป็นฐานการผสานwเช่นเดียวกับ--theirsกระทำและปัจจุบันของคุณ (HEAD) กระทำเป็นเป้าหมายของการผสาน ถ้าการรวมสำเร็จทุกอย่างก็ดี - อย่างน้อยGitก็คิดอย่างนั้น - และgit stash applyตัวเองก็ทำสำเร็จ หากคุณเคยgit stash popใช้ที่ซ่อนโค้ดจะลดการซ่อน 3 หากการผสานล้มเหลว Git จะประกาศการใช้งานที่ล้มเหลว ถ้าคุณใช้git stash popgit stash applyรหัสยังคงซ่อนและให้ความล้มเหลวในสถานะเดียวกับ
แต่ถ้าคุณมีข้อผูกพันที่สาม - หากมีการuผูกมัดในที่ซ่อนที่คุณสมัครสิ่งต่างๆก็เปลี่ยนไป! ไม่มีตัวเลือกในการแสร้งทำเป็นว่าuไม่มีการคอมมิต 4 Git ยืนยันในการแยกไฟล์ทั้งหมดจากที่uกระทำลงไปในการทำงานปัจจุบันต้นไม้ ซึ่งหมายความว่าไฟล์ต้องไม่มีอยู่เลยหรือมีเนื้อหาเหมือนกับในคอมuมิต
ในการทำให้เกิดขึ้นคุณสามารถใช้git cleanตัวเองได้ แต่อย่าลืมว่าไฟล์ที่ไม่ได้ติดตาม (ละเว้นหรือไม่) ไม่มีตัวอื่นอยู่ในที่เก็บ Git ดังนั้นโปรดแน่ใจว่าไฟล์เหล่านี้สามารถถูกทำลายได้ทั้งหมด! หรือคุณสามารถทำให้ไดเรกทอรีชั่วคราวและย้ายไฟล์ที่มีเพื่อความปลอดภัยหรือแม้กระทั่งทำอีกgit stash save -uหรือgit stash save -aตั้งแต่ผู้ที่จะทำงานgit cleanให้คุณ แต่นั่นทำให้คุณมีที่uเก็บสไตล์อื่นเพื่อจัดการในภายหลัง
1refs/stashนี่คือในความเป็นจริง สิ่งนี้มีความสำคัญหากคุณตั้งชื่อสาขาstash: ชื่อเต็มของสาขาคือrefs/heads/stashดังนั้นสิ่งเหล่านี้จะไม่ขัดแย้งกัน แต่อย่าทำอย่างนั้น: Gitจะไม่รังเกียจ แต่คุณจะสับสนในตัวเอง :-)
2git stashรหัสจริงใช้git merge-recursiveโดยตรงที่นี่ สิ่งนี้จำเป็นด้วยเหตุผลหลายประการและยังมีผลข้างเคียงในการทำให้แน่ใจว่า Git ไม่ถือว่าเป็นการผสานเมื่อคุณแก้ไขข้อขัดแย้งและกระทำ
3นี่คือเหตุผลที่ผมขอแนะนำให้หลีกเลี่ยงในความโปรดปรานของgit stash pop git stash applyคุณมีโอกาสตรวจสอบสิ่งที่นำไปใช้และตัดสินใจว่าจะนำไปใช้จริงหรือไม่ ถ้าไม่คุณยังมีที่ซ่อนอยู่ซึ่งหมายความว่าคุณสามารถใช้git stash branchกู้คืนทุกอย่างได้อย่างสมบูรณ์ สมมติว่าไม่มีการuกระทำที่น่ารำคาญนั้น
4ควรมีจริงๆ: git stash apply --skip-untrackedหรือบางอย่าง นอกจากนี้ยังควรมีตัวแปรที่หมายถึงการทิ้งuไฟล์คอมมิตทั้งหมดลงในไดเร็กทอรีใหม่เช่นgit stash apply --untracked-into <dir>บางที
git stash show -p | git apply --3