ในฐานะที่เป็นคำอธิบายเพิ่มเติมโปรดทราบว่าการคอม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 merge
2 (โดยไม่อนุญาตให้คอมมิตหรือถือว่าผลลัพธ์เป็นการผสานปกติ) โดยใช้คอมมิตดั้งเดิมที่สร้างที่เก็บ ( i
ของพาเรนต์และพาเรนต์w
แรก) เป็นฐานการผสานw
เช่นเดียวกับ--theirs
กระทำและปัจจุบันของคุณ (HEAD) กระทำเป็นเป้าหมายของการผสาน ถ้าการรวมสำเร็จทุกอย่างก็ดี - อย่างน้อยGitก็คิดอย่างนั้น - และgit stash apply
ตัวเองก็ทำสำเร็จ หากคุณเคยgit stash pop
ใช้ที่ซ่อนโค้ดจะลดการซ่อน 3 หากการผสานล้มเหลว Git จะประกาศการใช้งานที่ล้มเหลว ถ้าคุณใช้git stash pop
git 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