Git bagaimana cara mengembalikan rebase

111

Di Git, bagaimana Anda mengembalikan rebase jika Anda tidak menyukainya?

Git tidak memiliki dry-run untuk rebase. Jika saya melakukan rebase dan belum melakukan push, bagaimana cara melakukan rollback ke sebelumnya, seolah-olah tidak pernah terjadi?

pengguna1615666
sumber
4
git rebase --abort
olibiaz
2
Apa maksudmu "gagal"? Apakah Anda menyelesaikan rebase, dan Anda tidak menyukai hasilnya? Atau apakah Anda mengalami konflik dan ingin menghentikan rebase di tengah? Saya menganggap yang pertama, karena Anda tidak dapat mendorong rebase yang bertentangan dan belum selesai, tetapi saya bertanya karena itu adalah dua pertanyaan yang berbeda.
Edward Thomson
ya, mantan. Terima kasih.
pengguna1615666
3
Kemungkinan duplikat dari Membatalkan git rebase
Jon Schneider

Jawaban:

225

Anda dapat menggunakan reflog untuk menemukan tindakan pertama sebelum rebase dimulai dan kemudian mengatur ulang --hard kembali ke sana. misalnya

$ 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

Sekarang Anda harus kembali ke sebelum rebase dimulai.

Untuk menemukan tempat yang tepat untuk mengatur ulang, Anda cukup memilih entri yang paling dekat dengan atas yang tidak dimulai dengan "rebase".

Pendekatan alternatif

Jika rebase adalah satu - satunya hal yang telah Anda lakukan di cabang, yaitu Anda tidak memiliki perubahan / perubahan yang tidak diinginkan - maka Anda bisa menghapus cabang lokal dengan git branch -Ddan kemudian memeriksanya lagi:

$ git checkout my-branch
$ git rebase master
// not happy with result
$ git checkout master
$ git branch -D my-branch
$ git checkout my-branch

Atau untuk efek yang sama, Anda dapat mengatur ulang --hard ke cabang asal:

$ git reset --hard origin/my-branch

Jika Anda melakukan ini saat Anda memiliki komit tidak terdorong lainnya, maka Anda akan kehilangannya. Dalam kasus tersebut, cukup gunakan pendekatan reflog di atas untuk melompat kembali ke entri reflog tempat Anda membuat komit.

Robbie
sumber
11
Satu pintasan praktis lainnya: rebase set ORIG_HEADke nilai hash asli dari cabang yang di-rebase. Jadi daripada mencari angka 2 HEAD@{2}, Anda bisa menggunakan ORIG_HEAD... tapi hanya jika ORIG_HEADmasih tidak terganggu. Sekelompok perintah Git mengaturnya (rebase, am, reset, dan merge, dalam berbagai keadaan).
Torek
1
Terima kasih Pak! Sangat membantu :)
Alec
1
terima kasih kode sumber saya kembali .... setelah menggunakan ini $ git reset HEAD @ {2} --hard
reza rahmad
Mendapat suara positif saya karena menyarankan untuk hanya menghapus cabang lokal dan menariknya lagi!
quicklikerabbit
1
Ini adalah penyelamat hidup. Terima kasih @Robbie
Nelson Katale
45

Rebase menyimpan cadangan status lama sebagai ORIG_HEAD.
Jadi, Anda dapat mengembalikan rebase terakhir dengan menjalankan:

git reset --hard ORIG_HEAD
Meligy
sumber
1
Apakah Anda kebetulan tahu di mana tag itu didokumentasikan?
Ben S
Apakah ada sisi negatifnya atau ini fitur baru? Ini tampaknya jauh lebih mudah daripada memilah-milah reflog.
1252748
Ini bukanlah hal baru. Tapi Anda biasanya akan menggunakannya tepat setelah rebase, tidak bisa kembali secara retrospektif setelah beberapa rebases dll. Untuk situasi yang rumit ini Anda akan mencari barang relog, tapi hanya untuk "ups, apa yang baru saja saya lakukan? Bagaimana cara mengembalikan itu sekarang?" itu bekerja dengan baik.
Meligy