Saya menemukan penjelasan yang bagus untuk Cara Mengembalikan Penggabungan dari tautan ini dan saya menyalin rekatkan penjelasan di bawah ini dan akan sangat membantu kalau-kalau tautan di bawah tidak berfungsi.
Cara mengembalikan gabungan yang salah
Alan (alan@clueserver.org) berkata:
Saya memiliki cabang utama. Kami memiliki cabang dari beberapa pengembang yang sedang mengerjakan. Mereka mengklaim siap. Kami menggabungkannya ke cabang master. Itu merusak sesuatu sehingga kami mengembalikan penggabungan. Mereka membuat perubahan pada kode. mereka sampai pada titik di mana mereka mengatakan itu ok dan kita bergabung lagi. Ketika diperiksa, kami menemukan bahwa perubahan kode yang dibuat sebelum pengembalian tidak di cabang master, tetapi perubahan kode setelah berada di cabang master. dan meminta bantuan untuk pulih dari situasi ini.
Sejarah segera setelah "kembalikan penggabungan" akan terlihat seperti ini:
---o---o---o---M---x---x---W
/
---A---B
di mana A dan B berada di sisi pengembangan yang tidak begitu baik, M adalah gabungan yang membawa perubahan prematur ini ke garis utama, x adalah perubahan yang tidak terkait dengan apa yang cabang samping lakukan dan sudah dibuat pada garis utama, dan W adalah " kembali dari penggabungan M "(bukankah W terlihat terbalik?) TKI, "diff W ^ .. W" mirip dengan "diff -RM ^ .. M".
"Kembalikan" penggabungan dapat dilakukan dengan:
$ git revert -m 1 M
Setelah pengembang cabang samping memperbaiki kesalahan mereka, sejarahnya mungkin terlihat seperti ini:
---o---o---o---M---x---x---W---x
/
---A---B-------------------C---D
di mana C dan D akan memperbaiki apa yang rusak di A dan B, dan Anda mungkin sudah memiliki beberapa perubahan lain pada garis utama setelah W.
Jika Anda menggabungkan cabang samping yang diperbarui (dengan D di ujungnya), tidak ada perubahan yang dibuat dalam A atau B akan ada dalam hasilnya, karena mereka dikembalikan oleh W. Itulah yang dilihat Alan.
Linus menjelaskan situasinya:
Mengembalikan komit reguler hanya secara efektif membatalkan apa yang komit lakukan, dan cukup mudah. Namun, mengembalikan komit gabungan juga membatalkan data yang diubah komit tersebut, tetapi itu sama sekali tidak berdampak pada sejarah yang dimiliki oleh gabungan tersebut. Jadi penggabungan akan tetap ada, dan itu masih akan dilihat sebagai menggabungkan dua cabang bersama, dan penggabungan di masa depan akan melihat penggabungan tersebut sebagai keadaan bersama terakhir - dan pengembalian yang mengembalikan gabungan yang dibawa tidak akan memengaruhi sama sekali. Jadi "kembalikan" membatalkan perubahan data, tetapi sangat tidak"undo" dalam arti bahwa itu tidak membatalkan efek komit pada sejarah repositori. Jadi, jika Anda berpikir tentang "kembalikan" sebagai "kembalikan", maka Anda akan selalu kehilangan bagian ini dari kembalinya. Ya, itu membatalkan data, tetapi tidak, itu tidak membatalkan sejarah. Dalam situasi seperti itu, Anda ingin mengembalikan yang sebelumnya, yang akan membuat sejarah terlihat seperti ini:
---o---o---o---M---x---x---W---x---Y
/
---A---B-------------------C---D
di mana Y adalah revert dari W. "Revert of the revert" dapat dilakukan dengan:
$ git revert W
Riwayat ini akan (mengabaikan kemungkinan konflik antara apa yang diubah W dan W..Y) setara dengan tidak memiliki W atau Y sama sekali dalam sejarah:
---o---o---o---M---x---x-------x----
/
---A---B-------------------C---D
dan menggabungkan cabang samping lagi tidak akan memiliki konflik yang timbul dari pengembalian sebelumnya dan pengembalian kembali.
---o---o---o---M---x---x-------x-------*
/ /
---A---B-------------------C---D
Tentu saja perubahan yang dibuat dalam C dan D masih dapat bertentangan dengan apa yang dilakukan oleh salah satu dari x, tetapi itu hanya konflik gabungan normal.