Tidak yakin apakah ini adalah cara "diberkati" untuk melakukannya, tetapi inilah yang saya lakukan untuk menyelesaikan masalah yang sama tanpa harus "memaksakan dorongan" atau hal-hal kotor seperti itu.
Mari kita asumsikan riwayat Anda terlihat seperti ini (dan M adalah penggabungan flubbed):
-A--B--C--M (master points here)
\ /
D----E
Berlari git checkout -b merge_fix <commit ID E>membuat cabang sebelum kami melakukan kesalahan:
-A--B--C--M (master points here)
\ /
D----E (HEAD and merge_fix point here)
Sekarang, mari kita lakukan penggabungan kembali pada cabang baru kami. Kami tidak bisa begitu saja bergabung master, jadi kami harus memilih komit secara manual sebelum penggabungan yang buruk: git merge <commit ID C>Jangan membuat kesalahan yang sama seperti yang Anda lakukan sebelumnya!
-A--B--C--M (master points here)
\ X
D----E-G (HEAD and merge_fix point here)
Dengan asumsi komit Gterlihat bagus, sekarang kami ingin menyinkronkan dengan bagian atas mastercabang. Perintah ini memberitahu git untuk mengabaikan perubahan yang dibuat untuk dikuasai, dan memaksa perubahan kita untuk menjadi hasil gabungan:git merge -s ours master
-A--B--C--M (master points here)
\ X \
D----E-G--H (HEAD and merge_fix point here)
Akhirnya, (sekali lagi dengan anggapan bahwa komit Hterlihat bagus, kami ingin mempercepat masteruntuk memasukkan penggabungan tetap kami:
git checkout master
git merge merge_fix
Ini benar-benar hanya memindahkan masterpointer cabang ke H, tapi saya akan mengambil kesempatan untuk membersihkan seni ASCII saya sedikit:
-A--B--C--M--H (HEAD, master, and merge_fix all point here)
\ X /
D----E--G
Dan begitulah! Anda telah berhasil melakukan penggabungan kembali tanpa membatalkan riwayat apa pun!