Ambil contoh berikut:
Saya memiliki beberapa pekerjaan di cabang topik dan sekarang saya siap untuk bergabung kembali ke master:
* eb3b733 3 [master] [origin/master]
| * b62cae6 2 [topic]
|/
* 38abeae 1
Saya melakukan penggabungan dari master, menyelesaikan konflik dan sekarang saya memiliki:
* 8101fe3 Merge branch 'topic' [master]
|\
| * b62cae6 2 [topic]
* | eb3b733 3 [origin/master]
|/
* 38abeae 1
Sekarang, penggabungan ini memakan waktu lama, jadi saya melakukan pengambilan lagi dan perhatikan bahwa cabang master jarak jauh memiliki perubahan baru:
* 8101fe3 Merge branch 'topic' [master]
|\
| * b62cae6 2 [topic]
| | * e7affba 4 [origin/master]
| |/
|/|
* | eb3b733 3
|/
* 38abeae 1
Jika saya mencoba 'git rebase origin / master' dari master, saya terpaksa menyelesaikan semua konflik lagi, dan saya juga kehilangan komit gabungan:
* d4de423 2 [master]
* e7affba 4 [origin/master]
* eb3b733 3
| * b62cae6 2 [topic]
|/
* 38abeae 1
Apakah ada cara bersih untuk memulai kembali komit gabungan jadi saya berakhir dengan sejarah seperti yang saya tunjukkan di bawah ini?
* 51984c7 Merge branch 'topic' [master]
|\
| * b62cae6 2 [topic]
* | e7affba 4 [origin/master]
* | eb3b733 3
|/
* 38abeae 1
git
merge
rebase
git-rebase
git-rewrite-history
jipumarino
sumber
sumber
git rebase --preserve-merges origin/master
git config --global pull.rebase preserve
untuk selalu menjaga komitmen gabungan selama rebasegit --rebase-merges
pada akhirnya akan menggantikan yang lamagit --preserve-merges
. Lihat Apa sebenarnya yang dilakukan Git "rebase --preserve-merges
(dan mengapa?)--preserve-merges
sudah ditinggalkan. Gunakangit rebase --rebase-merges origin/master
Jawaban:
Ada dua opsi di sini.
Pertama adalah melakukan rebase interaktif dan mengedit komit penggabungan, mengulang penggabungan secara manual dan melanjutkan rebase.
Cara lain adalah dengan menggunakan
--rebase-merges
opsi aktifgit rebase
, yang dijelaskan sebagai berikut dari manual: "Secara default, rebase hanya akan menjatuhkan komit gabungan dari daftar todo, dan menempatkan komit rebased ke cabang tunggal linier. Dengan --rebase- penggabungan, rebase sebagai gantinya akan mencoba untuk melestarikan struktur percabangan di dalam komit yang akan direbase, dengan menciptakan kembali komit penggabungan. Setiap konflik penggabungan yang diselesaikan atau amandemen manual dalam komit gabungan ini harus diselesaikan / diterapkan kembali secara manual. "sumber
Oke, itu pertanyaan lama dan sudah menerima jawaban
@siride
, tetapi jawaban itu tidak cukup untuk saya, karena--preserve-merges
memaksa Anda menyelesaikan semua konflik untuk kedua kalinya. Solusi saya berdasarkan ide dengan@Tobi B
tetapi dengan perintah langkah demi langkah yang tepatJadi kita akan mulai pada keadaan seperti itu berdasarkan contoh dalam pertanyaan:
Perhatikan bahwa kita memiliki 2 komit di depan, jadi cherry-pick tidak akan berfungsi.
Pertama-tama, mari kita buat riwayat yang benar yang kita inginkan:
Kami gunakan
--preserve-merges
untuk menyimpan komit gabungan kami dalam sejarah. Kami gunakan--strategy=ours
untuk mengabaikan semua konflik penggabungan karena kami tidak peduli tentang konten apa yang akan ada dalam komit gabungan, kami hanya perlu riwayat yang bagus sekarang.Sejarah akan terlihat seperti itu (mengabaikan master):
Ayo dapatkan indeks yang benar sekarang.
Kami mungkin mendapatkan beberapa konflik penggabungan tambahan di sini, tetapi itu hanya akan menjadi konflik dari file yang diubah antara
8101fe3
danf5a7ca8
, tetapi tidak termasuk konflik yang sudah diselesaikan daritopic
Sejarah akan terlihat seperti ini (mengabaikan riwayat yang benar):
Tahap terakhir adalah menggabungkan cabang kami dengan riwayat yang benar dan cabang dengan indeks yang benar
Kami menggunakan
reset --soft
untuk mengatur ulang cabang kami (dan sejarah) untuk mengoreksi-sejarah, tetapi biarkan indeks dan pohon yang bekerja apa adanya. Lalu kami gunakancommit --amend
untuk menulis ulang komit gabungan kami, yang dulu memiliki indeks salah, dengan indeks baik kami dari master.Pada akhirnya kita akan memiliki status seperti itu (perhatikan id lain dari komit atas):
sumber
git commit --amend
menambahkan perubahan ke komit terakhir (HEAD, dalam hal ini komit gabungan). Karena konten komit berubah, hash diperbarui.Mengingat bahwa saya baru saja kehilangan satu hari mencoba mencari tahu ini dan benar-benar menemukan solusi dengan bantuan rekan kerja, saya pikir saya harus berpadu.
Kami memiliki basis kode yang besar dan kami harus berurusan dengan 2 cabang yang sedang dimodifikasi secara bersamaan. Ada cabang utama dan cabang sekunder jika Anda mau.
Sementara saya menggabungkan cabang sekunder ke cabang utama, pekerjaan berlanjut di cabang utama dan pada saat saya selesai, saya tidak dapat mendorong perubahan saya karena mereka tidak kompatibel.
Karena itu saya perlu "rebase" "gabungan" saya.
Beginilah akhirnya kami melakukannya:
1) membuat catatan SHA. mis .: c4a924d458ea0629c0d694f1b9e9576a3ecf506b
2) Buat riwayat yang tepat tetapi ini akan memecah gabungan.
3) membuat catatan SHA. mis .: 29dd8101d78
4) Sekarang reset ke tempat Anda sebelumnya
5) Sekarang gabungkan master saat ini ke cabang kerja Anda
6) Sekarang Anda memiliki file yang tepat, tetapi riwayat yang salah, dapatkan riwayat yang tepat di atas perubahan Anda dengan:
7) Dan kemudian - ubah hasil di komit gabungan asli Anda
Voila!
sumber
Sepertinya yang ingin Anda lakukan adalah menghapus gabungan pertama Anda. Anda dapat mengikuti prosedur berikut:
Itu akan memberi Anda apa yang Anda inginkan.
sumber
sumber