Git: ยกเลิกการเปลี่ยนแปลงทั้งหมดในสาขาท้องถิ่นที่แตกต่างกัน


117

ฉันมีสาขาหัวข้อท้องถิ่นที่ติดตามสาขาระยะไกล เพื่อประโยชน์ในการโต้แย้งกล่าวว่าประวัติการกระทำมีลักษณะดังนี้:

A--B--C--O1--O2--O3 (origin/phobos)
       \
         L1--L2--L3 (phobos)

เมื่อดูประวัติการกระทำแบบสัมพัทธ์แล้วตอนนี้ฉันต้องการยกเลิกการเปลี่ยนแปลงทั้งหมดที่เกิดขึ้นกับphobosสาขาในพื้นที่และทำให้กลับมาเป็นสำเนาโดยตรงorigin/phobosเพื่อให้ประวัติศาสตร์ท้องถิ่นมีลักษณะดังนี้:

A--B--C--O1--O2--O3 (phobos origin/phobos)

ฉันไม่ต้องการให้มีการเปลี่ยนแปลงเฉพาะในphobosสาขาและฉันไม่ต้องการให้การผสานใด ๆ ปรากฏในที่เก็บต้นทางในภายหลัง (ดังนั้นการรวมจึงไม่ใช่สิ่งที่ฉันคิดไว้)

ดูเหมือนว่ามันจะง่ายมาก แต่ google-fu ของฉันทำให้ฉันล้มเหลว ฉันต้องทำอย่างไร

คำตอบ:


79

ลบสาขาแล้วสร้างใหม่:

$ git branch -D phobos
$ git checkout --track -b phobos origin/phobos

37
ปัญหาเกี่ยวกับวิธีนี้เมื่อเทียบกับการรีเซ็ตส่วนหัวของสาขาคือการลบสาขาจะทำให้ reflog ของสาขาออกไป ในทางกลับกันการรีเซ็ตสาขาไม่เพียง แต่รักษา reflog เท่านั้น แต่ยังบันทึกการรีเซ็ตใน reflog ด้วย ทำให้การดำเนินการย้อนกลับได้อย่างง่ายดายในภายหลังหากจำเป็น
แดนปั้น

9
@Electrons_Ahoy ขอแนะนำให้คุณเปลี่ยนคำตอบที่ยอมรับที่นี่เป็นของ Dan (เพื่อให้คนอย่างฉันที่เคยใช้ Googled มีแนวโน้มที่จะเลือกวิธีที่ปลอดภัยกว่า)
Steve Chambers

4
คำตอบของ @ DanMoulding ไม่เกี่ยวข้องกับการลบสาขาในพื้นที่เมื่อไม่จำเป็น จะปลอดภัยกว่ามาก
brma

@brma: ยังไง? มันยังคงเป็นเพียงการชี้สาขาไปยังคอมมิตใหม่
mipadi

5
คำตอบของ Dan Moulding ปลอดภัยกว่า ฉันคิดว่าคุณควรเลือกอันนั้น
Daniel Apt

331
git checkout phobos
git reset --hard origin/phobos

สิ่งนี้จะบอกให้ Git รีเซ็ตส่วนหัวphobosเป็นคอมมิตเดียวกับorigin/phobosและอัปเดตโครงสร้างการทำงานให้ตรงกัน


35
IMO นี่ควรเป็นคำตอบที่ยอมรับ มันออกคำสั่ง "รีเซ็ต" เพื่อปลูกถ่ายตัวชี้สาขาแทนที่จะทำการผ่าตัดด้วยการลบ / สร้างใหม่
vdboor

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

3
@Electrons_Ahoy: อืมไม่ธรรมดาแน่ ๆ โดยปกติการรีเซ็ตนี้ควรจะเป็นการดำเนินการที่ไม่มีปัญหาหาก repo ของคุณอยู่ในลำดับการทำงานที่ดี
Dan Molding

หรือแม้ว่ามันจะมีปัญหา ใช้ git reflog เพื่อหาทางกลับบ้านหากคุณ "เผลอ" ออกคำสั่งนี้โดยไม่ได้อ่านว่ามันทำอะไร :)
dbn

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