Git: จะย้อนกลับการรวมคอมมิตได้อย่างไร?


124

ด้วย SVN มันง่ายที่จะย้อนกลับการรวมคอมมิต แต่จะทำอย่างไรกับ Git?



ฉันไม่คิดว่านี่คือความหมายของคำถาม การผสานแบบย้อนกลับใน SVN ยังย้อนกลับการเปลี่ยนแปลงจากการคอมมิตเป็นการเปลี่ยนแปลงในระบบดังนั้นคุณสามารถแก้ไขและยืนยันอีกครั้งได้
Dormouse

คำตอบ:


105

ในการสร้างคอมมิตใหม่ที่ 'ยกเลิก' การเปลี่ยนแปลงของคอมมิตที่ผ่านมาให้ใช้:

$ git revert <commit>

นอกจากนี้ยังเป็นไปได้ที่จะลบคอมมิตออกจากจุดที่กำหนดเองในอดีตโดยการรีเบตใหม่แล้วรีเซ็ต แต่คุณไม่ต้องการทำเช่นนั้นจริงๆหากคุณผลักคอมมิตของคุณไปยังที่เก็บอื่นแล้ว (หรือมีคนอื่นดึงไปจากคุณ) .


31
คุณอาจต้องระบุ-m <parent number>ตัวเลือกgit revertเพื่อระบุการเปลี่ยนแปลงที่จะเปลี่ยนกลับ หากคุณต้องการที่จะยกเลิกการผสานของประวัติศาสตร์ที่ไม่ได้รับการตีพิมพ์, git reset --hard HEAD^1การใช้งาน
Jakub Narębski

3
Jakub: นั่นเป็นความจริงถ้าคุณคืนค่าคอมมิตการผสาน แต่ในคำศัพท์เกี่ยวกับการโค่นล้ม "การผสานย้อนกลับ" เป็นเพียงชื่อสำหรับการย้อนกลับการกระทำใด ๆ
Ben James

4
โปรดทราบว่าการใช้-mวิธีการรวมในอนาคตจากสาขาที่ไม่ได้ผสานจะไม่รวมการเปลี่ยนแปลงจากก่อนการผสาน! โปรดดูschacon.github.com/git/howto/revert-a-faulty-merge.txtสำหรับวิธีที่เหมาะสมในการรวมสาขาที่ไม่ได้ผสานอีกครั้ง
Martijn Pieters

125

เพื่อย้อนกลับผสานgit revert -m <parent number>กระทำที่คุณจำเป็นต้องใช้งาน: ตัวอย่างเช่นในการย้อนกลับการคอมมิตการผสานล่าสุดโดยใช้พาเรนต์กับหมายเลข 1 คุณจะใช้:

git revert -m 1 HEAD

ในการย้อนกลับคอมมิตการผสานก่อนคอมมิตสุดท้ายคุณต้องทำ:

git revert -m 1 HEAD^

ใช้git show <merge commit SHA1>เพื่อดูพ่อแม่การนับเลขคือลำดับที่ปรากฏเช่นMerge: e4c54b3 4725ad2

เอกสารการผสาน git: http://schacon.github.com/git/git-merge.html

git ผสานการสนทนา (สับสน แต่มีรายละเอียดมาก): http://schacon.github.com/git/howto/revert-a-faulty-merge.txt


36
คุณจะรับ 'หมายเลข' ที่เกี่ยวข้องกับผู้ปกครองได้อย่างไร? สาขามี 'id' ที่เป็นตัวเลขที่แท้จริงหรือไม่?
daniyalzade

7
ใช้git show <merge commit SHA1>ดูพ่อแม่การเรียงเลขคือลำดับที่ปรากฏเช่นMerge: e4c54b3 4725ad2
supermethod

8
ตัวอย่าง: git revert -m 1 SHA1คำสั่งนั้นใช้งานได้สำหรับฉันในการยกเลิกการผสานคอมมิตที่เป็นการผสานหลายครั้งก่อนที่จะมีส่วนหัวและมีคอมมิตมากมายอยู่ข้างใต้
c.apolzon

3
พ่อแม่เป็นคนไหน e4c54b3 หรือ 4725ad2?
Dolphin

1
สิ่งนี้ยังให้ข้อมูลไม่เพียงพอว่าผลลัพธ์ของ git show เกี่ยวข้องกับหมายเลขหลักอย่างไร "ลำดับที่ปรากฏ" เป็นแบบ 1 หรือไม่ 0 ตาม? ในตัวอย่างนี้เฉพาะ SHA1 ของพาเรนต์ 1 คืออะไร e4c54b3 หรือ 4725ad2?
cowlinator

4

ถ้าฉันเข้าใจคุณถูกต้องคุณกำลังพูดถึงการทำไฟล์

svn merge -rn:n-1

เพื่อกลับออกจากการกระทำก่อนหน้านี้ซึ่งในกรณีนี้คุณอาจกำลังมองหา

git revert

0
git reset --hard HEAD^ 

ใช้คำสั่งด้านบนเพื่อยกเลิกการรวมการเปลี่ยนแปลง


3
สิ่งนี้จะทำให้การผสานรวมออกไปซึ่งไม่ได้ทำตามที่ผู้โพสต์ดั้งเดิมถาม OP กำลังพยายามทำการแก้ไขย้อนกลับเพื่อยกเลิกการเปลี่ยนแปลงก่อนหน้านี้ไม่ใช่ลบประวัติของการเปลี่ยนแปลงก่อนหน้านี้ทั้งหมด

-1

หากคุณไม่ต้องการที่จะกระทำหรือต้องการที่จะกระทำในภายหลัง (ข้อความการกระทำจะยังคงถูกเตรียมไว้สำหรับคุณซึ่งคุณสามารถแก้ไขได้เช่นกัน):

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