เลิกทำป๊อปสะสมคำสั่งที่ทำให้เกิดความขัดแย้งผสาน


518

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

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

คำตอบ:


655

เมื่อมันปรากฏออกมา Git นั้นฉลาดพอที่จะไม่วางที่ซ่อนหากไม่ได้ใช้อย่างหมดจด ฉันสามารถไปยังสถานะที่ต้องการด้วยขั้นตอนต่อไปนี้:

  1. เมื่อต้องการยกเลิกความขัดแย้งในการผสาน: git reset HEAD .(สังเกตจุดต่อท้าย)
  2. หากต้องการบันทึกการผสานที่ขัดแย้งกัน (ในกรณี): git stash
  3. หากต้องการกลับไปที่ต้นแบบ: git checkout master
  4. วิธีดึงการเปลี่ยนแปลงล่าสุด: git fetch upstream; git merge upstream/master
  5. วิธีแก้ไขสาขาใหม่ของฉัน: git checkout new-branch; git rebase master
  6. หากต้องการใช้การเปลี่ยนแปลงที่ถูกต้องถูกจัดเก็บ (ตอนที่ 2 บนกองซ้อน) git stash apply stash@{1}

14
ขอบคุณสุดยอด! # 6 เป็นคำตอบที่ฉันต้องการ สามารถเพิ่มgit stash dropเป็นขั้นตอนสุดท้ายในการกำจัดที่ไม่ต้องการออกจาก # 2
austinmarton

1
# 2 จะไม่ทำงานหากมีเส้นทางที่ไม่ถูกแยกออก แต่จะส่งออกข้อผิดพลาดที่อธิบายไว้ที่นี่: stackoverflow.com/questions/5483213/…
Étienne

5
ไม่เป็นความจริงทั้งหมด - Git จะเก็บที่ซ่อนไว้ในรายการที่เก็บหากไม่สามารถใช้อย่างหมดจด ดูเอกสารเหล่านี้เกี่ยวกับgit stash pop: "การใช้สถานะอาจล้มเหลวด้วยความขัดแย้งในกรณีนี้มันจะไม่ถูกลบออกจากรายการสะสมคุณต้องแก้ไขข้อขัดแย้งgit stash dropด้วยตนเองและโทรด้วยตนเองภายหลัง" ( git-scm.com/docs/git-stash )
Carolyn Conway

4
แปลกว่าคำตอบนี้และคำถามที่มีการโพสต์บนที่แน่นอนนาทีเดียว
โทรฉัน

14
@ call-me นี่เป็นสิ่งที่ฉันคิดว่าผู้คนควรทำบ่อยขึ้น! สังเกตว่าแบบฟอร์ม "ถามคำถาม" มีช่องทำเครื่องหมายที่ให้คุณตอบคำถามของคุณเองในแบบฟอร์มเดียวกัน :) สิ่งนี้เกิดขึ้นกับฉันในบางครั้งเมื่อฉันอยู่ระหว่างการเขียนคำถามที่ทำให้ฉันนิ่งงัน แต่ในการพยายามปรับคำถามให้ดีสำหรับ StackOverflow ฉันจะหาคำตอบได้ เมื่อไม่นานมานี้ฉันจำไม่ได้ว่าเป็นอย่างนั้นหรือเปล่า แต่ฉันเดาว่านั่นเป็นสิ่งที่เกิดขึ้น
acjay

340

โชคดีที่git stash popไม่ได้เปลี่ยนที่เก็บในกรณีที่มีข้อขัดแย้ง!

ดังนั้นไม่มีอะไรต้องกังวลเพียงแค่ล้างโค้ดของคุณแล้วลองใหม่อีกครั้ง

สมมติว่า codebase ของคุณสะอาดก่อนคุณสามารถย้อนกลับไปยังสถานะgit checkout -f
นั้นด้วย: จากนั้นทำสิ่งที่คุณลืมเช่นgit merge missing-branch
หลังจากนั้นเพียงยิงgit stash popอีกครั้งและคุณได้รับการซ่อนตัวเดิมที่ขัดแย้งกันก่อน

ข้อควรสนใจ:ที่เก็บมีความปลอดภัยอย่างไรก็ตามการเปลี่ยนแปลงที่ไม่มีข้อผูกมัดในไดเร็กทอรีการทำงานไม่ใช่ พวกเขาสามารถทำให้สับสน


16
สิ่งที่ฉันเข้าใจคือคุณสามารถล้างและป๊อปอีกครั้ง แต่คุณไม่สามารถยกเลิกได้ หากป๊อปปนกับการเปลี่ยนแปลงที่ไม่มีข้อผูกมัดอื่น ๆ คุณจะต้องล้างข้อมูลด้วยตนเอง
haridsv

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

นี่ไม่ใช่กรณีสำหรับฉัน ฉันเรียกgit stash popมันว่าพยายามรวมอัตโนมัติขัดแย้งกันและเก็บไว้
เทรเวอร์ Hickey

1
@TrevorHickey จุดประสงค์ของคำตอบนี้ก็คือการซ่อนอยู่ในกรณีที่เกิดข้อขัดแย้งที่คุณสามารถโทรหาได้git stash popบ่อยเท่าที่คุณต้องการจนกว่าจะจบลงโดยไม่มีข้อขัดแย้ง ดังนั้นหลังจากความขัดแย้งของคุณใช่ไดเรกทอรีทำงานอยู่ในสภาพยุ่งเหยิงอย่างไรก็ตามคุณสามารถล้างข้อมูลและโทรgit stash popใหม่ได้
flori

5
คำสั่งนี้เพื่อยกเลิกการซ่อนการใช้ครั้งสุดท้ายมีประโยชน์มาก: git checkout -f!
Lefi Tarik

16

คำแนะนำที่นี่มีความซับซ้อนเล็กน้อยดังนั้นฉันจะเสนออะไรที่ตรงไปตรงมามากกว่า:

  1. git reset HEAD --hard ละทิ้งการเปลี่ยนแปลงทั้งหมดในสาขาปัจจุบัน

  2. ... ทำงานตัวกลางตามความจำเป็น

  3. git stash pop re-pop stash อีกครั้งในภายหลังเมื่อคุณพร้อม



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.