Git'te birleşmeyi yeniden yapmanın bir yolu var mı?


17

Bu yüzden oldukça büyük bir hata yaptım. Bir taahhütte bulundum, çektim, birleştirdim (ancak bunu yaparken kodu berbat ettim) ve sonra ittim. Bu birleştirmeyi yeniden yapmak ve kodu doğru şekilde almak istiyorum. Bunu yapmanın bir yolu var mı?

Bitbucket kullanıyorum.

git 

10
Sadece bir not - bu aslında konuyla SO üzerinde ve gerektiği değil taşınmıştır. Bazen kendi yardım sayfalarınızı okumayı deneyin ve programcılar satırı tarafından yaygın olarak kullanılan yazılım araçlarını not edin . Bununla birlikte, burada da konu - SwiftCore, taşındığı için kötü hissetme, bu senin hatan değildi.
Bob

Yanıtlar:


13

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 Giyi 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 Hiyi göründüğü varsayılarak, mastersabit 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!


6

Bunu şu şekilde yapabilirsiniz:

  1. Birleştirmeden önce taahhüdü sıfırlayın.
  2. Birleştirme işlemini tekrar gerçekleştirin
  3. Zorla itme

Yani:

git reset --hard SHA1
git merge branchname
git commit
git push --force remotename branchname

Sadece akılda tutmak git push --forceuzak şubede vardı ve bu kolu kullanarak diğer insanların da bu etkilenebilir ne olursa olsun yeniden. (Normalde bunu yapmamalısınız.)


6
git push --force
Yapmanın

1

git merge --abort ve sonra tekrar birleşebilirsiniz


Sadece "iptal etmek için bir birleştirme yok" mesajı alıyorum

3
Bu ancak birleştirme çakışmaları olduğunda yapılabilir.
chanchal118

neden eksi bir? bu bana yardımcı oldu.
swdev

Çünkü soru, birleştirmeyi (yanlış) zaten bitirip ittiğinizle ilgilidir.
Robin Green

-1

Lütfen bu umudun sizin için yararlı olduğunu kontrol edin

https://www.kernel.org/pub/software/scm/git/docs/howto/revert-branch-rebase.html

Bu OP sorusunu cevaplayabilse de, sadece link cevapları SO'da iyi kabul edilmez. Ancak cevabınızdan bağlantıdan en alakalı alıntıları alıntılayabilirsiniz.

Bu bağlantı soruyu cevaplayabilirken, cevabın önemli kısımlarını buraya eklemek ve bağlantıyı referans olarak sağlamak daha iyidir. Bağlantı verilen sayfa değişirse, yalnızca bağlantı yanıtları geçersiz olabilir.
Pranav 웃
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.