คำตอบที่ง่ายสำหรับคำถามง่าย ๆ คือ git stash apply
git stash apply
เพียงตรวจสอบสาขาที่คุณต้องการการเปลี่ยนแปลงของคุณบนแล้ว จากนั้นใช้git diff
เพื่อดูผลลัพธ์
หลังจากเสร็จสิ้นการเปลี่ยนแปลงของคุณแล้วapply
ดูดีและคุณแน่ใจว่าคุณไม่ต้องการที่เก็บสะสมอีกต่อไปจากนั้นใช้git stash drop
เพื่อกำจัดมัน
ฉันมักจะแนะนำให้ใช้มากกว่าgit stash apply
git stash pop
ความแตกต่างคือapply
ออกจากที่ซ่อนรอบเพื่อให้ง่ายต่อการลองapply
ใหม่หรือเพื่อดู ฯลฯ หากpop
สามารถดึงที่ซ่อนได้ออกมามันจะทันทีด้วยdrop
และถ้าคุณรู้ทันทีว่าคุณต้องการแยกมัน อื่น (ในสาขาที่แตกต่าง) หรือกับ--index
หรือบางอย่างนั่นไม่ใช่เรื่องง่าย หากคุณapply
, คุณdrop
จะได้รับเลือกเมื่อมีการ
มันคือทั้งหมดเล็กน้อยทางเดียวหรืออื่น ๆ แม้ว่าและสำหรับมือใหม่ที่จะคอมไพล์ก็ควรจะเกี่ยวกับที่เหมือนกัน (และคุณสามารถข้ามส่วนที่เหลือทั้งหมดนี้ได้!)
ถ้าคุณทำสิ่งที่ก้าวหน้ากว่าหรือซับซ้อนกว่าล่ะ?
มี "วิธีการใช้ git stash" อย่างน้อยสามหรือสี่วิธีเหมือนเดิม ข้างต้นสำหรับ "วิธีที่ 1", "วิธีที่ง่าย":
คุณเริ่มต้นด้วยสาขาที่สะอาดและกำลังทำงานกับการเปลี่ยนแปลงบางอย่างและจากนั้นตระหนักว่าคุณกำลังทำในสาขาที่ไม่ถูกต้อง คุณเพียงแค่ต้องการทำการเปลี่ยนแปลงที่คุณมีตอนนี้และ "ย้าย" การเปลี่ยนแปลงไปยังสาขาอื่น
นี่เป็นกรณีง่ายที่อธิบายไว้ข้างต้น เรียกใช้git stash save
(หรือธรรมดาgit stash
สิ่งเดียวกัน) ตรวจสอบสาขาอื่น ๆ git stash apply
และการใช้งาน นี่เป็นการรวมคอมไพล์ในการเปลี่ยนแปลงก่อนหน้าของคุณโดยใช้กลไกการผสานที่มีประสิทธิภาพมากกว่าของคอมไพล์ ตรวจสอบผลลัพธ์อย่างระมัดระวัง (พร้อมgit diff
) เพื่อดูว่าคุณชอบหรือไม่และใช้วิธีนี้git stash drop
เพื่อลดการสะสม คุณทำเสร็จแล้ว!
คุณเริ่มการเปลี่ยนแปลงบางอย่างและซ่อนไว้ จากนั้นคุณเปลี่ยนเป็นสาขาอื่นและเริ่มการเปลี่ยนแปลงมากขึ้นโดยลืมว่าคุณมีสาขาที่ถูกซ่อนอยู่
ตอนนี้คุณต้องการที่จะเก็บหรือย้ายการเปลี่ยนแปลงเหล่านี้และเก็บสะสมของคุณด้วย
ในความเป็นจริงคุณสามารถgit stash save
อีกครั้งในขณะที่git stash
ทำให้ "กอง" ของการเปลี่ยนแปลง ถ้าคุณว่าคุณมีสอง stashes หนึ่งเรียกว่าเพียงแค่stash
-but คุณยังสามารถเขียนและอื่นหนึ่งสะกดstash@{0}
stash@{1}
ใช้git stash list
(ตลอดเวลา) เพื่อดูพวกเขาทั้งหมด ใหม่ล่าสุดจะเป็นตัวเลขต่ำสุดเสมอ เมื่อคุณgit stash drop
มันลดลงล่าสุดและหนึ่งที่ถูกstash@{1}
ย้ายไปด้านบนของสแต็ค หากคุณมีมากขึ้นคนที่stash@{2}
กลายเป็นstash@{1}
และอื่น ๆ
คุณสามารถapply
แล้วdrop
ซ่อนที่เฉพาะเจาะจงเกินไป: git stash apply stash@{2}
และอื่น ๆ วางที่ซ่อนเฉพาะจัดลำดับใหม่เฉพาะหมายเลขที่สูงกว่าเท่านั้น อีกครั้งหนึ่งที่ไม่มีตัวเลขก็เช่นstash@{0}
กัน
หากคุณสะสมจำนวนมากของการหยุดชะงักมันจะยุ่งเหยิงพอสมควร (เป็นที่ซ่อนที่ฉันต้องการstash@{7}
หรือstash@{4}
ใช่หรือไม่รอฉันเพิ่งผลักไปอีกอันตอนนี้พวกเขาอายุ 8 และ 5?) ผมเองชอบที่จะถ่ายโอนการเปลี่ยนแปลงเหล่านี้เป็นสาขาใหม่เพราะสาขามีชื่อและความหมายอย่างมากสำหรับผมยิ่งไปกว่าcleanup-attempt-in-December
stash@{12}
( git stash
คำสั่งใช้ข้อความบันทึกทางเลือกและสิ่งเหล่านั้นสามารถช่วยได้ แต่อย่างใดปัญหาทั้งหมดของฉันหยุดเพียงตั้งชื่อWIP on branch
)
(พิเศษขั้นสูง) คุณเคยใช้git stash save -p
หรืออย่างระมัดระวังgit add
-ed และ / หรือgit rm
บิตเฉพาะ -ed git stash save
ของรหัสของคุณก่อนที่จะใช้ คุณมีหนึ่งเวอร์ชันในดัชนี / พื้นที่จัดเตรียมและอีกหนึ่งเวอร์ชัน (ต่างกัน) ในแผนผังการทำงาน คุณต้องการที่จะรักษาทั้งหมดนี้ ดังนั้นตอนนี้คุณใช้git stash apply --index
และบางครั้งก็ล้มเหลวด้วย:
Conflicts in index. Try without --index.
คุณกำลังใช้git stash save --keep-index
เพื่อทดสอบ "สิ่งที่จะเกิดขึ้น" อันนี้อยู่นอกเหนือขอบเขตของคำตอบนี้ ดูStackOverflow คำตอบอื่นแทน
สำหรับกรณีที่ซับซ้อนฉันขอแนะนำให้เริ่มต้นในไดเรกทอรีทำงาน "สะอาด" ก่อนโดยยอมรับการเปลี่ยนแปลงใด ๆ ที่คุณมีตอนนี้ (ในสาขาใหม่หากคุณต้องการ) ด้วยวิธีการที่ "ที่ไหนสักแห่ง" ที่คุณใช้พวกเขาไม่มีอะไรในนั้นและคุณเพียงแค่จะพยายามเปลี่ยนแปลงการ stashed:
git status # see if there's anything you need to commit
# uh oh, there is - let's put it on a new temp branch
git checkout -b temp # create new temp branch to save stuff
git add ... # add (and/or remove) stuff as needed
git commit # save first set of changes
ตอนนี้คุณอยู่ในจุดเริ่มต้น "สะอาด" หรืออาจจะเป็นเช่นนี้มากขึ้น:
git status # see if there's anything you need to commit
# status says "nothing to commit"
git checkout -b temp # optional: create new branch for "apply"
git stash apply # apply stashed changes; see below about --index
สิ่งสำคัญที่ต้องจำคือ "stash" คือความมุ่งมั่นมันเป็นแค่ "ตลก / แปลก" เล็กน้อยที่กระทำที่ไม่ใช่ "ในสาขา" การapply
ดำเนินการจะดูว่าอะไรที่คอมมิทเปลี่ยนแปลงและพยายามที่จะทำซ้ำไม่ว่าคุณจะอยู่ที่ไหน ที่ซ่อนจะยังคงอยู่ที่นั่น ( apply
เก็บไว้รอบ ๆ ) ดังนั้นคุณสามารถดูได้มากกว่านี้หรือตัดสินใจว่านี่เป็นสถานที่ที่ผิดapply
และลองอีกครั้งที่แตกต่างกันหรืออะไรก็ตาม
เมื่อใดก็ตามที่คุณมีที่ซ่อนคุณสามารถใช้git stash show -p
เพื่อดูรุ่นที่เรียบง่ายของสิ่งที่อยู่ในที่เก็บของ (อันนี้ง่ายรุ่นลักษณะเฉพาะที่มีการเปลี่ยนแปลง "ต้นงานสุดท้าย" ไม่ดัชนีบันทึกการเปลี่ยนแปลงที่--index
เรียกคืนแยกต่างหาก.) คำสั่งgit stash apply
โดยไม่--index
เพียงแค่พยายามที่จะทำให้ผู้ที่เดียวกันการเปลี่ยนแปลงในการทำงานไดเรกทอรีของคุณตอนนี้
สิ่งนี้เป็นจริงแม้ว่าคุณจะมีการเปลี่ยนแปลงอยู่บ้าง apply
คำสั่งมีความสุขที่จะใช้ซ่อนไปปรับเปลี่ยนไดเรกทอรีการทำงาน (หรืออย่างน้อยเพื่อพยายามที่จะใช้มัน) ตัวอย่างเช่นคุณสามารถทำได้:
git stash apply stash # apply top of stash stack
git stash apply stash@{1} # and mix in next stash stack entry too
คุณสามารถเลือกคำสั่ง "นำไปใช้" ที่นี่โดยเลือกการซ่อนเฉพาะเพื่อนำไปใช้ในลำดับเฉพาะ อย่างไรก็ตามโปรดทราบว่าแต่ละครั้งที่คุณทำ "git merge" โดยทั่วไปและตามที่เอกสารการรวมเตือนว่า:
การใช้งานคอมไพล์ผสานกับการเปลี่ยนแปลงที่ไม่มีข้อผูกมัดนั้นไม่ได้รับการสนับสนุน: ในขณะที่เป็นไปได้มันอาจทำให้คุณอยู่ในสถานะที่ยากที่จะถอยออกมาในกรณีที่เกิดข้อขัดแย้ง
หากคุณเริ่มต้นด้วยไดเรกทอรีที่สะอาดและเพิ่งจะดำเนินการหลายอย่างgit apply
มันเป็นเรื่องง่ายที่จะสำรอง: ใช้git reset --hard
เพื่อกลับไปที่สถานะที่สะอาดและเปลี่ยนapply
การดำเนินงานของคุณ (นั่นเป็นเหตุผลที่ฉันแนะนำให้เริ่มในไดเรกทอรีการทำงานที่สะอาดก่อนสำหรับกรณีที่ซับซ้อนเหล่านี้)
สิ่งที่เกี่ยวกับกรณีที่เป็นไปได้ที่เลวร้ายที่สุด?
สมมติว่าคุณกำลังทำ Git Stuff ขั้นสูงมากมายและคุณได้ทำที่ซ่อนและต้องการgit stash apply --index
แต่ไม่สามารถใช้ที่เก็บที่บันทึกไว้ได้อีกต่อไป--index
เพราะสาขาแยกจากกันมากเกินไปนับตั้งแต่เวลาที่คุณบันทึกไว้
นี่คือสิ่งที่git stash branch
มีไว้เพื่อ
ถ้าคุณ:
- ตรวจสอบความมุ่งมั่นที่แน่นอนที่คุณอยู่เมื่อคุณทำต้นฉบับ
stash
แล้ว
- สร้างสาขาใหม่และในที่สุด
git stash apply --index
ความพยายามในการสร้างการเปลี่ยนแปลงใหม่จะทำงานได้อย่างแน่นอน นี่คือสิ่งที่ไม่ (และจากนั้นจะลดการสะสมเนื่องจากมันถูกนำไปใช้อย่างประสบความสำเร็จ)git stash branch newbranch
บางคำสุดท้ายเกี่ยวกับ--index
(มันคืออะไรห่า?)
สิ่งที่--index
อธิบายได้ง่าย แต่มีความซับซ้อนอยู่ภายใน:
- เมื่อคุณมีการเปลี่ยนแปลงคุณต้อง
git add
(หรือ "เวที") ก่อนที่จะเข้าcommit
ร่วม
- ดังนั้นเมื่อคุณรัน
git stash
คุณอาจแก้ไขทั้งไฟล์foo
และzorg
แต่แสดงเพียงไฟล์เดียว
- ดังนั้นเมื่อคุณขอให้ซ่อนตัวมันอาจจะดีถ้ามัน
git add
เป็นadd
สิ่งต่าง ๆ และไม่ใช่ สิ่งที่ไม่ได้git add
เพิ่มเข้ามา นั่นคือถ้าคุณadd
แก้ไขfoo
แต่ไม่zorg
กลับมาก่อนที่คุณจะทำstash
เช่นนั้นอาจเป็นเรื่องดีถ้ามีการตั้งค่าเดียวกัน ควรจัดฉากอะไรอีก สิ่งที่ถูกแก้ไข แต่ไม่จัดฉากควรแก้ไขอีกครั้ง แต่ไม่จัดฉาก
การ--index
ตั้งค่าสถานะเพื่อapply
พยายามตั้งค่าสิ่งนี้ ถ้าต้นไม้ทำงานของคุณสะอาดนี่ก็แค่ใช้งานได้ ถ้าต้นไม้ของคุณมีสิ่งที่add
ed แล้วคุณสามารถดูว่าอาจมีปัญหาบางอย่างที่นี่ หากคุณออกไป--index
การapply
ดำเนินการจะไม่พยายามรักษาการตั้งค่าทั้งหมด / ไม่จัดฉาก แต่มันก็จะเรียกคอมไพล์ของเครื่องจักรที่ผสานการใช้งานต้นไม้กระทำใน"ถุงซ่อน" หากคุณไม่สนใจเกี่ยวกับการรักษาฉาก / unstaged ทิ้งออก--index
ทำให้มันง่ายมากสำหรับgit stash apply
การทำสิ่งที่ตน