Apakah ada yang tahu cara mudah membatalkan git rebase?
Satu-satunya cara yang terlintas dalam pikiran adalah untuk pergi di itu secara manual:
Dalam situasi saya saat ini ini akan bekerja karena saya dapat dengan mudah melihat komitmen dari kedua cabang (salah satunya adalah barang-barang saya, yang lain adalah rekan saya's stuff).
Namun pendekatan saya menyerang saya sebagai suboptimal dan rawan kesalahan (let's mengatakan saya punya hanya rebased dengan 2 saya sendiri cabang-cabang).
Ada ide?
Klarifikasi: saya'm berbicara tentang rebase selama yang banyak melakukan diputar. Tidak hanya satu.
Cara termudah untuk menemukan kepala komit cabang seperti itu segera sebelum rebase mulai di reflog...
git reflog
dan untuk me-reset saat ini cabang untuk itu (dengan peringatan biasa tentang menjadi benar-benar yakin sebelum reseting dengan --keras
pilihan).
Misalkan tua melakukan itu KEPALA@{5}
di ref log:
git reset --hard HEAD@{5}
Di Windows, anda mungkin perlu untuk mengutip referensi:
git reset --hard "HEAD@{5}"
Anda dapat memeriksa sejarah laki tua kepala dengan hanya melakukan git log KEPALA@{5}
(Windows: git log "KEPALA@{5}"
).
Jika anda've tidak cacat per cabang reflogs anda harus mampu melakukan git reflog branchname@{1}
sebagai rebase melepaskan kepala cabang sebelum menyambungkannya kembali ke final kepala. Saya akan periksa ini, meskipun saya belum't diverifikasi baru-baru ini.
Per default, semua reflogs diaktifkan untuk non-telanjang repositori:
[core]
logAllRefUpdates = true
Sebenarnya, rebase menyimpan titik awal untuk ORIG_HEAD
jadi ini adalah biasanya yang sederhana seperti:
git reset --hard ORIG_HEAD
Namun, reset
, rebase
dan menggabungkan
semua menyimpan anda asli KEPALA
pointer ke ORIG_HEAD
jadi, jika anda've melakukan semua perintah-perintah tersebut sejak rebase anda're berusaha untuk membatalkan maka anda'll harus menggunakan reflog.
Charles's jawaban yang bekerja, tetapi anda mungkin ingin melakukan hal ini:
git rebase --abort
untuk membersihkan setelah reset
.
Jika tidak, anda mungkin mendapatkan pesan "Interaktif rebase sudah mulai
".
git reflog
akan menunjukkan semua perubahan sebelum dan setelah rebase, dan memungkinkan anda untuk menemukan yang tepat untuk me-reset untuk. Tapi aku'm terkejut tidak ada disebutkan lain ini cara super sederhana di sini:
Juga, seperti yang disebutkan di sini sudah, rebase daun tua negara sebagai ORIG_HEAD
, sehingga anda dapat kembali terakhir rebase dengan menjalankan:
git reset --hard ORIG_HEAD
Ulang cabang untuk menggantung melakukan objek tua tip ini tentu saja solusi terbaik, karena itu mengembalikan keadaan sebelumnya tanpa pengeluaran usaha. Tetapi jika anda kebetulan telah kehilangan orang-orang yang berbuat (f.ex. karena anda mengumpulkan sampah repositori anda sementara ini, atau ini adalah segar clone), anda selalu dapat rebase cabang lagi. Kunci untuk ini adalah --ke
switch.
Katakanlah anda memiliki topik cabang imajinatif yang disebut topik
, bahwa anda bercabang master
ketika ujung dari master
adalah 0deadbeef
komit. Di beberapa titik, sementara di topik
cabang, kau git rebase master
. Sekarang anda ingin membatalkan ini. Berikut caranya:
git rebase --onto 0deadbeef master topic
Ini akan mengambil semua berkomitmen pada topik
yang tidak pada master
dan replay mereka di atas 0deadbeef
.
Dengan --ke
, anda dapat mengatur ulang sejarah menjadi cukup banyak setiap bentuk apapun.
Bersenang-senang. :-)
Aku benar-benar menempatkan cadangan tag pada cabang sebelum saya melakukan trivial operasi (paling rebases yang sepele, tapi saya'd lakukan itu jika terlihat di mana saja yang kompleks).
Kemudian, memulihkan semudah git reset --hard CADANGAN
.
Dalam kasus anda telah mendorong cabang anda untuk remote repositori (biasanya's asal) dan kemudian anda've dilakukan sukses rebase (tanpa menggabungkan) (git rebase --batalkan
memberi "Tidak ada rebase dalam kemajuan") anda dapat dengan mudah reset cabang menggunakan
perintah:
git reset --hard asal/{branchName}
Contoh:
$ ~/work/projects/{ProjectName} $ git status
On branch {branchName}
Your branch is ahead of 'origin/{branchName}' by 135 commits.
(use "git push" to publish your local commits)
nothing to commit, working directory clean
$ ~/work/projects/{ProjectName} $ git reset --hard origin/{branchName}
HEAD is now at 6df5719 "Commit message".
$ ~/work/projects/{ProjectName} $ git status
On branch {branchName}
Your branch is up-to-date with 'origin/{branchName}.
nothing to commit, working directory clean
Menggunakan reflog
didn't bekerja untuk saya.
Apa yang bekerja untuk saya mirip dengan seperti yang dijelaskan di sini. Buka file .git/log/ref bernama setelah cabang yang rebased dan cari baris yang berisi "rebase finsihed", sesuatu seperti:
5fce6b51 88552c8f Kris Leech <[email protected]> 1329744625 +0000 rebase finished: refs/heads/integrate onto 9e460878
Checkout kedua melakukan tercantum pada baris.
git checkout 88552c8f
Setelah dikonfirmasi ini terkandung saya kehilangan perubahan yang saya bercabang dan mengeluarkan napas lega.
git log
git checkout -b lost_changes
Untuk beberapa komit, ingat bahwa setiap melakukan semua referensi sejarah yang mengarah ke yang dilakukannya. Jadi di Charles' jawabannya, baca "tua melakukan" seperti "terbaru lama melakukan". Jika anda me-reset ke yang melakukan, maka semua sejarah yang mengarah ke yang komit akan muncul kembali. Ini harus melakukan apa yang anda inginkan.
Berikut solusi dari @Allan dan @Zearin, saya berharap saya hanya bisa melakukan komentar meskipun tapi aku don't cukup reputasi, jadi saya telah menggunakan perintah berikut:
Bukannya melakukan git rebase -aku-batalkan
(catatan -i) aku harus melakukan git rebase --batalkan
(tanpa the -i).
Menggunakan aku
dan --batalkan
pada saat yang sama menyebabkan Git untuk menunjukkan daftar dari penggunaan/pilihan.
Jadi saya sebelumnya dan saat ini cabang status dengan solusi ini:
matbhz@myPc /my/project/environment (branch-123|REBASE-i)
$ git rebase --abort
matbhz@myPc /my/project/environment (branch-123)
$
Jika anda berhasil rebased terhadap cabang terpencil dan tidak dapat git rebase --batalkan
anda masih bisa melakukan beberapa trik untuk menyimpan pekerjaan anda dan don't telah memaksa mendorong.
Misalkan anda saat ini cabang yang rebased oleh kesalahan ini disebut anda-cabang
dan pelacakan asal/anda-cabang
git branch -m anda-cabang-rebased
# rename saat ini cabanggit checkout asal/anda-cabang
# checkout untuk negara terbaru yang diketahui asalgit checkout -b-cabang
git log-cabang-rebased
, bandingkan dengan git log-cabang
dan mendefinisikan melakukan yang hilang dari anda-cabang
git cherry-pick COMMIT_HASH
untuk setiap komit dalam anda-cabang-rebased
remote/anda-cabang
dan anda harus mendorong hanya anda-cabang
Let's mengatakan saya rebase master saya memiliki cabang dan aku 30 baru melakukan yang memecahkan sesuatu. I've menemukan bahwa sering's mudah untuk hanya menghapus buruk melakukan.
git rebase -i HEAD~31
Interaktif rebase untuk terakhir 31 melakukan (hal itu doesn't salahnya jika anda mengambil terlalu banyak).
Hanya mengambil komit bahwa anda ingin menyingkirkan dan menandai mereka dengan "d" bukan "biasa". Sekarang komit akan dihapus secara efektif mengurai rebase (jika anda menghapus hanya melakukan anda hanya punya ketika rebasing).
Bagi pemula/siapa saja yang terlalu takut untuk melakukan hard reset, anda bisa pelajari komit dari reflog, dan kemudian menyimpannya sebagai sebuah cabang baru.
git reflog
Menemukan komit sebelum anda mulai rebasing. Anda mungkin perlu menggulir ke bawah untuk menemukannya (tekan Enter atau PageDown). Perhatikan jumlah KEPALA dan mengganti 57:
git checkout HEAD@{57}
Review cabang/komit, jika itu terlihat baik buat cabang baru dengan menggunakan KEPALA ini:
git checkout -b new_branch_name
Jika anda berada di sebuah cabang dapat anda gunakan:
git reset --hard @{1}
Tidak hanya referensi log untuk KEPALA (diperoleh dengan git reflog
), ada juga reflogs untuk masing-masing cabang (diperoleh dengan git reflog <cabang>
). Jadi, jika anda berada di master
kemudian git reflog master
akan menampilkan semua perubahan yang cabang. Anda bisa lihat bahwa perubahan yang oleh master@{1}
, master@{2}
, dll.
git rebase
biasanya akan mengubah KEPALA beberapa kali, namun saat ini cabang akan diperbarui hanya sekali.
@{1}
hanya shortcut untuk saat ini cabang, jadi itu's sama dengan master@{1}
jika anda berada di master
.
git reset --hard ORIG_HEAD
tidak akan bekerja jika anda menggunakan git resetselama interaktif
rebase`.
Apa yang biasanya saya lakukan adalah
git reset #commit_hash
untuk komit terakhir di mana saya pikir rebase tidak memiliki efek.
kemudian git pull
Sekarang anda cabang harus sama persis seperti master dan rebased melakukan tidak harus berada di dalamnya.
Sekarang kita dapat hanya cherry-pick komit pada cabang ini.
Jika anda mengacaukan sesuatu hanya git rebase, misal git rebase --batalkan
, sementara anda tidak terikat file, mereka akan hilang dan git reflog
tidak akan membantu. Hal ini terjadi pada saya dan anda akan perlu untuk berpikir di luar kotak di sini. Jika anda beruntung seperti saya dan menggunakan IntelliJ Webstorm maka anda dapat kanan-klik->sejarah lokal
dan dapat kembali ke keadaan sebelumnya dari file/folder yang tidak peduli kesalahan apa yang telah anda lakukan dengan versi perangkat lunak. Itu selalu baik untuk memiliki lain failsafe berjalan.