Kembalikan gabungan Git

225
develop branch
--> dashboard (working branch)

Saya gunakan git merge --no-ff developuntuk menggabungkan perubahan hulu ke dasbor

log git:

commit 88113a64a21bf8a51409ee2a1321442fd08db705
Merge: 981bc20 888a557
Author: XXXX <>
Date:   Mon Jul 30 08:16:46 2012 -0500

    Merge branch 'develop' into dashboard

commit 888a5572428a372f15a52106b8d74ff910493f01
Author: root <[email protected]>
Date:   Sun Jul 29 10:49:21 2012 -0500

    fixed end date edit display to have leading 0

commit 167ad941726c876349bfa445873bdcd475eb8cd8
Author: XXXX <>
Date:   Sun Jul 29 09:13:24 2012 -0500

Penggabungan memiliki sekitar 50+ komitmen di dalamnya, dan saya bertanya-tanya bagaimana cara mengembalikan penggabungan sehingga dasbor kembali ke keadaan pra-penggabungan

Bagian kedua dari ini adalah, jika saya tidak bergabung dengan --no-ff, saya tidak mendapatkan komit ' Cabang gabungan' berkembang 'menjadi dasbor ' .. Bagaimana saya akan mengembalikan gabungan itu?

cgmckeever
sumber
3
Kemungkinan duplikat gabungkan Undo a Git? .

Jawaban:

320

Mengembalikan komit gabungan telah dibahas secara mendalam dalam pertanyaan lain. Saat Anda melakukan penggabungan maju-cepat, yang kedua Anda gambarkan, Anda bisa gunakan git resetuntuk kembali ke status sebelumnya:

git reset --hard <commit_before_merge>

Anda dapat menemukan <commit_before_merge>dengan git reflog,, git logatau, jika Anda merasakan mokinya (dan belum melakukan hal lain):git reset --hard HEAD@{1}

Christopher
sumber
6
terima kasih atas jawaban cepatnya .. melihat log git, komit sebelum penggabungan adalah 50+ komit kembali, karena git merge develop sebenarnya memasukkan semua komit lainnya. Saya kira apa yang tidak saya dapatkan adalah, jika saya tidak tahu apa / di mana penggabungan itu - bagaimana saya menemukannya? Anda menyebutkan menemukan commit_before_merge .. Saya kira saya tidak mengerti bagian itu
cgmckeever
4
sepertinya dengan git reflog sepertinya itu merangkum kepala terakhir dengan baik, dan memungkinkan saya untuk mengetahui di mana saya perlu mengatur ulang. git log tampaknya memiliki terlalu banyak rincian untuk menentukan tempat untuk mengatur ulang. Terima kasih
cgmckeever
1
Ya, reflogpenyelamat. HEAD@{1}hanya menggambarkan status HEAD terbaru kedua, atau lebih teknis: "Ref diikuti oleh akhiran @ dengan spesifikasi ordinal yang terlampir dalam pasangan kurung (misalnya {1}, {15}) menentukan nilai ke-n sebelumnya dari nilai tersebut. ref. "
Christopher
4
Bagaimana dengan mendorong revert ke remote? Saya tidak melihat cara kerjanya.
Anton Savelyev
2
Ini tanpa harapan. Itu menghancurkan semua komit setelah penggabungan.
aaa90210
151

Dari sini:

http://www.christianengvall.se/undo-pushed-merge-git/

git revert -m 1 <merge commit hash>

Git revert menambahkan komit baru yang mengembalikan komit yang ditentukan.

Menggunakan -m 1 memberi tahu bahwa ini adalah penggabungan dan kami ingin mengembalikan komit induk pada cabang master. Anda akan menggunakan -m 2 untuk menentukan cabang pengembangan.

sturrockad
sumber
30
Perhatikan bahwa Anda tidak dapat menggabungkan kembali cabang setelah ini, karena dokumen mengatakan: "Mengembalikan komit penggabungan menyatakan bahwa Anda tidak akan pernah ingin perubahan pohon dibawa oleh penggabungan. Akibatnya, nantinya penggabungan hanya akan membawa perubahan pohon yang diperkenalkan dengan komit yang bukan leluhur dari penggabungan yang dikembalikan sebelumnya. Ini mungkin atau mungkin bukan yang Anda inginkan. "
Dalibor Karlovic
23
@ DaliborKarlović Pernyataan itu agak keras. Anda pasti dapat mengembalikan perubahan itu nanti, triknya adalah mengembalikan komit yang dikembalikan. Info lebih lanjut di sini di bagian "
Reverting the revert
3
Sayangnya, heretautan dalam komentar @Hilikus tidak lagi valid. Situs mengklaim konten dipindahkan ke buku ( git-scm.com/book/en/v2 ) tetapi jika demikian, itu tidak mudah untuk ditemukan di sana.
Jesse Chisholm
@ DaliborKarlović apakah ini kasus dengan jawaban di atas dari @Christopher?
James B
3
Konten penggabungan yang dibatalkan dipindahkan ke sini
SEK
28

Setel ulang komit gabungan dengan git reset --hard HEAD^.

Jika Anda menggunakan --no-ff git selalu membuat penggabungan, bahkan jika Anda tidak melakukan apa pun di antaranya. Tanpa --no-ff git hanya akan melakukan fast forward, artinya cabang KEPALA Anda akan disetel ke KEPALA cabang gabungan. Untuk mengatasinya, temukan commit-id yang ingin Anda kembalikan ke dan git reset --hard $COMMITID.

Nico Erfurth
sumber
1
Solusi bagus jika Anda tidak tahu komit sebelum penggabungan.
iglesiasedd
Bekerja untuk saya karena saya tidak tahu melakukan id. +1
Anant Singh --- Alive to Die
jika gabungan yang tidak diinginkan sudah dikomit ke remote, saya menggunakan git push -f untuk memperbarui cabang jarak jauh setelah kembali.
zumek
16
git revert -m 1 88113a64a21bf8a51409ee2a1321442fd08db705

Tetapi mungkin memiliki efek samping yang tidak terduga. Lihat --mainline parent-numberopsi di git-scm.com/docs/git-revert

Mungkin cara yang kasar tetapi efektif adalah dengan memeriksa induk kiri dari komit itu, membuat salinan semua file, checkout HEADlagi, dan mengganti semua konten dengan file lama. Maka git akan memberi tahu Anda apa yang sedang diputar kembali dan Anda membuat komit revert Anda sendiri :)!

Jorge Orpinel
sumber
1
Memberi +1 karena jawaban ini tidak mengacaukan riwayat seperti yang disetel ulang (sangat penting jika Anda telah didorong ke jarak jauh). Tetapi efek samping tak terduga apa yang harus saya harapkan?
pedromanoel
3
Apakah ini efek samping yang Anda sebutkan? Reverting a merge commit declares that you will never want the tree changes brought in by the merge. As a result, later merges will only bring in tree changes introduced by commits that are not ancestors of the previously reverted merge. This may or may not be what you want.
pedromanoel
1
Anda katakan git resetadalah solusinya, tetapi juga menyebutkan bahwa itu mungkin memiliki efek samping yang tidak terduga. Namun, tautan itu dari git revert, bukan git reset:)
Mark
2
Harap dicatat, git reset tidak memiliki flag -m. Perhatikan juga @JorgeOrpinel merujuk pada git-revert docs, bukan git-reset. Saya pikir dia bermaksud mengatakan git reverttidakgit reset
Devin Gleason Lambert
Bagaimana menghindari Mainline ditentukan tetapi melakukan 1234xyz bukan kesalahan gabungan .
Achal
0

Jika Anda menggabungkan cabang, lalu mengembalikan gabungan menggunakan permintaan tarik dan menggabungkan permintaan tarik itu untuk mengembalikan.

Cara termudah yang saya rasakan adalah:

  1. Keluarkan cabang baru dari develop / master (tempat Anda bergabung)
  2. Kembalikan "kembalikan" menggunakan git revert -m 1 xxxxxx(jika kembalikan digabung menggunakan cabang) atau gunakan git revert xxxxxxjika itu kembalikan sederhana
  3. Cabang baru sekarang harus memiliki perubahan yang ingin Anda gabungkan lagi.
  4. Buat perubahan atau gabungkan cabang ini untuk dikembangkan / dikuasai
Rohin Tak
sumber