ใน Git คุณจะย้อนกลับ rebase ได้อย่างไรหากคุณไม่พอใจกับมัน
Git ไม่มี dry-run สำหรับ rebase ถ้าฉันสร้างฐานใหม่แล้ว แต่ยังไม่ได้ดันมันฉันจะย้อนกลับไปก่อนหน้านี้ได้อย่างไรราวกับว่ามันไม่เคยเกิดขึ้น
ใน Git คุณจะย้อนกลับ rebase ได้อย่างไรหากคุณไม่พอใจกับมัน
Git ไม่มี dry-run สำหรับ rebase ถ้าฉันสร้างฐานใหม่แล้ว แต่ยังไม่ได้ดันมันฉันจะย้อนกลับไปก่อนหน้านี้ได้อย่างไรราวกับว่ามันไม่เคยเกิดขึ้น
คำตอบ:
คุณสามารถใช้reflogเพื่อค้นหาการดำเนินการแรกก่อนที่จะเริ่ม rebase แล้วรีเซ็ต - กลับไปยาก เช่น
$ git reflog
b710729 HEAD@{0}: rebase: some commit
5ad7c1c HEAD@{1}: rebase: another commit
deafcbf HEAD@{2}: checkout: moving from master to my-branch
...
$ git reset HEAD@{2} --hard
ตอนนี้คุณควรกลับไปก่อนการเริ่มต้นใหม่
หากต้องการค้นหาตำแหน่งที่เหมาะสมในการรีเซ็ตคุณเพียงแค่เลือกรายการที่ใกล้กับด้านบนสุดที่ไม่ได้ขึ้นต้นด้วย "rebase"
หาก rebase เป็นสิ่งเดียวที่คุณทำในสาขานั่นคือคุณไม่มีการคอมมิต / การเปลี่ยนแปลงที่ยังไม่ได้ดำเนินการ - คุณสามารถลบสาขาในพื้นที่ด้วยgit branch -Dแล้วตรวจสอบอีกครั้ง:
$ git checkout my-branch
$ git rebase master
// not happy with result
$ git checkout master
$ git branch -D my-branch
$ git checkout my-branch
หรือสำหรับเอฟเฟกต์เดียวกันคุณสามารถรีเซ็ต - ยากไปที่สาขาต้นทาง:
$ git reset --hard origin/my-branch
หากคุณทำสิ่งนี้ในขณะที่คุณมีการกระทำอื่น ๆ ที่ยังไม่ได้ดำเนินการคุณจะสูญเสียสิ่งเหล่านี้ไป ในกรณีนั้นให้ใช้วิธีการ reflog ด้านบนเพื่อข้ามกลับไปยังรายการ reflog ที่คุณได้ทำการคอมมิต
ORIG_HEADค่าเป็นค่าแฮชดั้งเดิมของสาขาที่กำลัง rebased ดังนั้นแทนที่จะหาหมายเลข 2 สำหรับHEAD@{2}คุณก็สามารถใช้ORIG_HEAD... แต่เพียงถ้าORIG_HEADยังคงไม่ถูกรบกวน คำสั่ง Git จำนวนมากตั้งค่าไว้ (rebase, am, reset, และ merge ภายใต้สถานการณ์ต่างๆ)
Rebase เก็บข้อมูลสำรองของสถานะเก่าเป็นORIG_HEADไฟล์.
ดังนั้นคุณสามารถย้อนกลับ rebase ล่าสุดได้โดยเรียกใช้:
git reset --hard ORIG_HEAD