Git: Bagaimana cara reverse-merge sebuah komit?

124

Dengan SVN, mudah untuk menggabungkan balik komit, tetapi bagaimana melakukannya dengan Git?

Mot
sumber
Saya tidak berpikir inilah yang dimaksud dengan pertanyaan itu. Penggabungan terbalik di SVN juga mengembalikan perubahan dari komit ke perubahan lokal, jadi Anda bisa mengeditnya dan melakukan lagi.
asrama

Jawaban:

105

Untuk membuat komit baru yang 'membatalkan' perubahan dari komit sebelumnya, gunakan:

$ git revert <commit>

Dimungkinkan juga untuk benar-benar menghapus komit dari titik arbitrer di masa lalu dengan melakukan rebasing dan kemudian menyetel ulang, tetapi Anda benar-benar tidak ingin melakukannya jika Anda telah mendorong komit ke repositori lain (atau orang lain telah menarik dari Anda) .

Ben James
sumber
31
Anda mungkin perlu memberikan -m <parent number>opsi git revertuntuk menentukan perubahan mana yang akan dikembalikan. Jika Anda ingin membatalkan penggabungan riwayat yang tidak diterbitkan, gunakan git reset --hard HEAD^1.
Jakub Narębski
3
Jakub: itu benar jika Anda mengembalikan komit penggabungan, tetapi dalam terminologi Subversion, "penggabungan terbalik" sebenarnya hanyalah nama untuk mengembalikan segala jenis komit.
Ben James
4
Perhatikan bahwa menggunakan -mcara penggabungan mendatang dari cabang yang tidak digabungkan tidak akan menyertakan perubahan dari sebelum penggabungan itu! Lihat schacon.github.com/git/howto/revert-a-faulty-merge.txt untuk mengetahui cara yang tepat untuk menggabungkan kembali cabang yang tidak digabungkan.
Martijn Pieters
125

Untuk mengembalikan sebuah gabungan komit, Anda perlu menggunakan: git revert -m <parent number>. Jadi misalnya, untuk mengembalikan komit gabungan terbaru menggunakan induk dengan nomor 1 Anda akan menggunakan:

git revert -m 1 HEAD

Untuk mengembalikan komit gabungan sebelum komit terakhir, Anda akan melakukan:

git revert -m 1 HEAD^

Gunakan git show <merge commit SHA1>untuk melihat orang tua, penomoran adalah urutan kemunculannya misalnyaMerge: e4c54b3 4725ad2

dokumentasi git merge: http://schacon.github.com/git/git-merge.html

diskusi git merge (membingungkan tapi sangat detail): http://schacon.github.com/git/howto/revert-a-faulty-merge.txt

Marcus Ericsson
sumber
36
Bagaimana Anda bisa mendapatkan 'nomor' yang terkait dengan orang tua? Apakah cabang memiliki 'id' numerik intrinsik?
daniyalzade
7
Gunakan git show <merge commit SHA1>untuk melihat orang tua, penomoran adalah urutan kemunculannya, misalnyaMerge: e4c54b3 4725ad2
supermetode
8
Contoh: git revert -m 1 SHA1Perintah itu bekerja bagi saya untuk mengembalikan komit gabungan yang merupakan beberapa komit gabungan sebelum head dan memiliki banyak komit di bawahnya.
c.apolzon
3
Manakah orang tua? E4c54b3 atau 4725ad2?
Dolphin
1
Ini masih belum memberikan info yang cukup tentang bagaimana hasil git show berhubungan dengan nomor induk. Apakah "urutan kemunculannya" berbasis 1? Berbasis 0? Dalam contoh ini secara khusus, apa SHA1 dari induk 1? e4c54b3 atau 4725ad2?
cowlinator
4

Jika saya memahami Anda dengan benar, Anda sedang berbicara tentang melakukan a

svn merge -rn:n-1

untuk mundur dari komit sebelumnya, dalam hal ini, Anda mungkin mencari

git revert
Rudedog
sumber
0
git reset --hard HEAD^ 

Gunakan perintah di atas untuk mengembalikan perubahan gabungan.

kapil chakravarthy
sumber
3
Ini membuang komit gabungan, yang tidak melakukan apa yang diminta oleh poster asli. OP mencoba melakukan tambalan terbalik untuk membatalkan perubahan sebelumnya, bukan sama sekali menghapus riwayat perubahan sebelumnya.
-1

Jika Anda tidak ingin mengkomit, atau ingin mengkomit nanti (pesan komit akan tetap disiapkan untuk Anda, yang juga dapat Anda edit):

git revert -n <commit>
rkrisztian
sumber