Git วิธีการย้อนกลับ rebase


112

ใน Git คุณจะย้อนกลับ rebase ได้อย่างไรหากคุณไม่พอใจกับมัน

Git ไม่มี dry-run สำหรับ rebase ถ้าฉันสร้างฐานใหม่แล้ว แต่ยังไม่ได้ดันมันฉันจะย้อนกลับไปก่อนหน้านี้ได้อย่างไรราวกับว่ามันไม่เคยเกิดขึ้น


4
git rebase --abort
olibiaz

2
คุณหมายถึงอะไร "ล้มเหลว"? คุณทำ rebase เสร็จแล้วและคุณไม่ชอบผลลัพธ์หรือไม่? หรือคุณประสบความขัดแย้งและต้องการหยุดฐานใหม่ที่อยู่ตรงกลาง? ฉันคิดว่าก่อนหน้านี้เนื่องจากคุณไม่สามารถผลักดัน rebase ที่ขัดแย้งกันและยังไม่เสร็จได้ แต่ฉันถามเพราะมันเป็นคำถามสองข้อที่แตกต่างกัน
Edward Thomson

ใช่อดีต ขอบคุณ.
user1615666

3
อาจซ้ำกันของการเลิกทำ rebase git
Jon Schneider

คำตอบ:


226

คุณสามารถใช้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 ที่คุณได้ทำการคอมมิต


11
ทางลัดที่มีประโยชน์อีกวิธีหนึ่ง: rebase ตั้งORIG_HEADค่าเป็นค่าแฮชดั้งเดิมของสาขาที่กำลัง rebased ดังนั้นแทนที่จะหาหมายเลข 2 สำหรับHEAD@{2}คุณก็สามารถใช้ORIG_HEAD... แต่เพียงถ้าORIG_HEADยังคงไม่ถูกรบกวน คำสั่ง Git จำนวนมากตั้งค่าไว้ (rebase, am, reset, และ merge ภายใต้สถานการณ์ต่างๆ)
torek

1
ขอบคุณครับ! ช่วยได้มาก :)
อเล็กซ์

1
ขอบคุณซอร์สโค้ดของฉันกลับมา .... หลังจากใช้ $ git reset HEAD @ {2} --hard
reza rahmad

รับการโหวตเพิ่มของฉันสำหรับการแนะนำให้ลบสาขาในพื้นที่แล้วดึงอีกครั้ง!
quicklikerabbit

1
นี่คือตัวช่วยชีวิต ขอบคุณ @Robbie
Nelson Katale

45

Rebase เก็บข้อมูลสำรองของสถานะเก่าเป็นORIG_HEADไฟล์.
ดังนั้นคุณสามารถย้อนกลับ rebase ล่าสุดได้โดยเรียกใช้:

git reset --hard ORIG_HEAD

1
คุณบังเอิญรู้หรือไม่ว่าแท็กนั้นถูกบันทึกไว้ที่ไหน?
Ben S

มีข้อเสียบางประการหรือเป็นคุณลักษณะใหม่หรือไม่? สิ่งนี้ดูเหมือนง่ายกว่าการกรองผ่าน reflog
1252748

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