Bunun "kutsanmış" yolu olup olmadığından emin değilim, ama işte aynı sorunu "zorla itmeye" veya böyle kaba bir şeye gerek kalmadan çözmek için yaptığım şey.
Diyelim ki tarihiniz böyle bir şeye benziyor (ve M dalgalı birleşme):
-A--B--C--M (master points here)
\ /
D----E
Koşmak git checkout -b merge_fix <commit ID E>
, herhangi bir hata yapmadan önce bir şube oluşturur:
-A--B--C--M (master points here)
\ /
D----E (HEAD and merge_fix point here)
Şimdi yeni şubemizdeki birleşmeyi tekrar yapalım. Sadece birleşemeyiz master
, bu yüzden kötü birleşmemizden önce taahhüdü manuel olarak seçmemiz gerekir: git merge <commit ID C>
Geçen sefer yaptığınız hataları yapmayın!
-A--B--C--M (master points here)
\ X
D----E-G (HEAD and merge_fix point here)
Bu taahhüdün G
iyi göründüğünü varsayarsak , şimdi master
şubenin üst kısmı ile senkronize etmek istiyoruz . Bu komut, git'e master için yapılan değişiklikleri yok saymasını ve değişikliklerimizi birleştirme sonucu olmaya zorlar:git merge -s ours master
-A--B--C--M (master points here)
\ X \
D----E-G--H (HEAD and merge_fix point here)
Son olarak, (yine, taahhüdün H
iyi göründüğü varsayılarak, master
sabit birleştirmemizi dahil etmek için hızlı ileri almak istiyoruz :
git checkout master
git merge merge_fix
Bu sadece master
şube işaretçisini hareket ettiriyor H
, ancak ASCII sanatımı biraz temizleme fırsatını alacağım:
-A--B--C--M--H (HEAD, master, and merge_fix all point here)
\ X /
D----E--G
İşte buyur! geçmişi geçersiz kılmadan birleştirmeyi başarıyla yeniden yaptınız!