Pertanyaan Membatalkan git rebase


Apakah ada yang tahu cara mudah membatalkan git rebase?

Satu-satunya cara yang terlintas dalam pikiran adalah melakukannya secara manual:

  • git checkout orang tua yang berkomitmen untuk kedua cabang
  • lalu buat cabang temp dari sana
  • cherry-pick semua komit dengan tangan
  • mengganti cabang di mana saya di-rebased oleh cabang yang dibuat secara manual

Dalam situasi saya saat ini, ini akan berhasil karena saya dapat dengan mudah melihat komit dari kedua cabang (salah satunya adalah barang saya, yang lain adalah barang rekan saya).

Namun pendekatan saya menurut saya sebagai suboptimal dan kesalahan-rawan (katakanlah saya baru saja me-rebased dengan 2 cabang saya sendiri).

Ada ide?

Klarifikasi: Saya sedang berbicara tentang rebase di mana sekelompok komit dimainkan kembali. Tidak hanya satu.


2428
2017-09-25 17:59


asal


Jawaban:


Cara termudah adalah menemukan kepala komit dari cabang seperti itu segera sebelum rebase dimulai di reflog...

git reflog

dan untuk mereset cabang saat ini ke sana (dengan peringatan biasa tentang benar-benar yakin sebelum menyetel ulang dengan --hard pilihan).

Anggaplah komitmen lama itu HEAD@{5} di log ref:

git reset --hard HEAD@{5}

Di Windows, Anda mungkin perlu mengutip referensi:

git reset --hard "HEAD@{5}"

Anda dapat memeriksa riwayat calon kepala lama hanya dengan melakukan git log HEAD@{5} (Windows:  git log "HEAD@{5}").

Jika Anda belum menonaktifkan reflog setiap cabang, Anda seharusnya dapat melakukannya git reflog branchname@{1} sebagai rebase melepaskan kepala cabang sebelum menyambung kembali ke kepala akhir. Saya akan memeriksa ini, meskipun saya belum memverifikasi ini baru-baru ini.

Secara default, semua reflog diaktifkan untuk repositori yang tidak telanjang:

[core]
    logAllRefUpdates = true

3360
2017-09-25 19:56



Sebenarnya, rebase menghemat titik awal Anda ORIG_HEAD jadi ini biasanya sesederhana:

git reset --hard ORIG_HEAD

Namun, itu reset, rebase dan merge semua menyimpan aslinya HEAD pointer ke dalam ORIG_HEAD jadi, jika Anda telah melakukan salah satu dari perintah-perintah tersebut sejak rebase yang Anda coba lepaskan maka Anda harus menggunakan reflog tersebut.


1166
2018-03-28 13:24



Jawaban Charles bekerja, tetapi Anda mungkin ingin melakukan ini:

git rebase --abort

untuk membersihkan setelah reset.

Jika tidak, Anda mungkin mendapatkan pesan “Interactive rebase already started".


317
2017-07-27 18:21



Mengatur ulang cabang ke objek komit menggantung ujungnya yang lama tentu saja merupakan solusi terbaik, karena mengembalikan keadaan sebelumnya tanpa mengeluarkan upaya apa pun. Tetapi jika Anda telah kehilangan komit tersebut (f.ex. karena Anda mengumpulkan sampah repositori Anda sementara itu, atau ini adalah klon baru), Anda selalu dapat me-rebase cabang lagi. Kunci untuk ini adalah --onto beralih.

Katakanlah Anda memiliki cabang topik yang disebut secara imajinatif topic, Anda bercabang master ketika ujung master adalah 0deadbeef melakukan. Pada titik tertentu saat di topic cabang, Anda lakukan git rebase master. Sekarang Anda ingin membatalkan ini. Begini caranya:

git rebase --onto 0deadbeef master topic

Ini akan mengambil semua komitmen topic yang tidak aktif master dan ulangi mereka di atas 0deadbeef.

Dengan --onto, Anda dapat mengatur ulang sejarah Anda menjadi cukup banyak bentuk apapun.

Selamat bersenang-senang. :-)


74
2017-09-26 02:08



Saya benar-benar meletakkan label cadangan di cabang sebelum saya melakukan operasi trivial (sebagian besar rebase adalah hal yang sepele, tetapi saya akan melakukannya jika terlihat rumit).

Kemudian, memulihkan semudah git reset --hard BACKUP.


61
2018-05-12 20:57



Dalam hal Anda telah mendorong cabang Anda ke repositori jarak jauh (Biasanya ini adalah asal) dan kemudian Anda telah melakukan rebase sukses (tanpa menggabungkan) (git rebase --abort memberi "No rebase in progress") Anda dapat dengan mudah ulang cabang menggunakan perintah:

git reset --sebagian keras / {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

52
2017-09-28 12:43



Jika Anda belum menyelesaikan rebase dan di tengahnya, berikut ini berfungsi:

git rebase --abort

48
2017-10-15 20:20



Untuk beberapa commit, ingatlah bahwa setiap commit mereferensikan semua sejarah yang mengarah ke commit tersebut. Jadi, dalam jawaban Charles, bacalah "komitmen lama" sebagai "yang terbaru dari komitmen lama". Jika Anda me-reset ke commit itu, maka semua sejarah yang mengarah ke commit itu akan muncul kembali. Ini harus melakukan apa yang Anda inginkan.


13
2017-09-25 21:36



Menggunakan reflog tidak bekerja untukku.

Apa yang berhasil bagi saya mirip dengan yang dijelaskan sini. Buka file di .git / logs / refs bernama setelah cabang yang telah di-rebased dan temukan baris yang berisi "rebase finsihed", sesuatu seperti:

5fce6b51 88552c8f Kris Leech <me@example.com> 1329744625 +0000  rebase finished: refs/heads/integrate onto 9e460878

Checkout commit kedua yang terdaftar di telepon.

git checkout 88552c8f

Setelah memastikan ini berisi perubahan yang hilang, aku bercabang dan menghela nafas lega.

git log
git checkout -b lost_changes

13
2018-02-20 13:59