git yeniden taban birleştirme çakışması


91

Bir github deposunu çatalladım ve github depom üzerinde çalıştım.
Çekme isteklerinde bulundum ve tamamlandı.

Bundan sonra yukarı akışta bazı taahhütler daha vardı, bu yüzden şimdi yeniden baz almak istiyorum, sanırım yapmam gereken bu.
Ama şu birleştirme çatışmalarını alıyorum:

First, rewinding head to replay your work on top of it...
Applying: Issue 135 homepage refresh
Using index info to reconstruct a base tree...
<stdin>:17: trailing whitespace.
      %h4 
warning: 1 line adds whitespace errors.
Falling back to patching base and 3-way merge...
Auto-merging app/views/layouts/application.html.haml
CONFLICT (content): Merge conflict in app/views/layouts/application.html.haml
Auto-merging app/views/home/index.html.haml
CONFLICT (content): Merge conflict in app/views/home/index.html.haml
Auto-merging app/views/home/_group_projects.html.haml
CONFLICT (content): Merge conflict in app/views/home/_group_projects.html.haml
Failed to merge in the changes.
Patch failed at 0001 Issue 135 homepage refresh

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To check out the original branch and stop rebasing run "git rebase --abort".

Bunları nasıl düzelteceğimi bilmiyorum, lütfen yardım edin.


Bu
Abhishek

Yanıtlar:


122

Yeniden başlatma gerçek bir baş ağrısı olabilir. Birleştirme çatışmalarını çözmeniz ve yeniden oluşturmaya devam etmeniz gerekir. Örneğin, birleştirme aracını kullanabilirsiniz (ayarlarınıza bağlı olarak farklılık gösterir)

git mergetool

Sonra değişikliklerinizi ekleyin ve devam edin

git rebase --continue

İyi şanslar


2
evet yeniden bağlama baş ağrısıdır, git pull upstream master'ı kullanabilir miyim?
pahnin

2
Evet bunu deneyebilirsiniz. Aradaki fark, taahhütlerinizin o zaman yukarı akıştan olanların üzerine konulmamasıdır. Potansiyel olarak daha az birleştirme çatışması vardır.
iltempo

7
@iitempo Kayıt yapmanıza gerek yok. Rebase'in devam etmesi için sadece bir git eklentisi yeterlidir.
enigmaticPhysicist

46

Yeniden ödeme sırasında bir çelişki yaşadığınızda üç seçeneğiniz vardır:

  • Yeniden git rebase --aborttemellemeyi tamamen geri almak için koşabilirsiniz . Git, sizi git rebase çağrılmadan önceki halinize şubenizin durumuna döndürecektir.

  • git rebase --skipİşlemi tamamen atlamak için çalıştırabilirsiniz . Bu, sorunlu işlemin getirdiği değişikliklerin hiçbirinin dahil edilmeyeceği anlamına gelir. Bu seçeneği seçmeniz çok nadirdir.

  • Iltempo'nun dediği gibi çatışmayı çözebilirsiniz. Bitirdiğinizde aramanız gerekecek git rebase --continue. Birleştirme aracım kdiff3, ancak çatışmaları çözmek için kullanabileceğiniz daha birçok araç var. Https://git-scm.com/docs/git-mergetool'u çağırdığınızda çağrılabilmesi için birleştirme aracınızı yalnızca git ayarlarında ayarlamanız gerekir.git mergetool

Yukarıdakilerden hiçbiri sizin için işe yaramazsa, yürüyüşe çıkın ve tekrar deneyin :)


2
Evet, ama çatışmayı nasıl düzeltebilirim? işte soru bu. "Çatışmayı düzeltmek" ile "bitirdiğinizde" arasında ne var
KansaiRobot

@KansaiRobot Manuel düzeltmeyi gerçekleştirmek için bir seçenek: çakışan dosyayı bir metin düzenleyicide açın ve şunu arayın<<<<<
Ekim'de

16

Yeniden ödeme yapmak için çok fazla taahhüdünüz varsa ve bunların bir kısmı çatışmalar veriyorsa, bu gerçekten acıtıyor. Ancak "tüm çatışmaların nasıl bastırılacağı" konusunda daha az bilinen bir yaklaşım önerebilirim .

İlk olarak, geçici şubeyi kontrol edin ve standart birleştirmeyi başlatın

git checkout -b temp
git merge origin/master

Anlaşmazlıkları çözmeniz gerekecek, ancak yalnızca bir kez ve yalnızca gerçek olanları. Ardından tüm dosyaları hazırlayın ve birleştirmeyi bitirin.

git commit -m "Merge branch 'origin/master' into 'temp'"

Ardından şubenize geri dönün ( alfa olsun ) ve yeniden ödemeye başlayın, ancak tüm çakışmaları otomatik olarak çözerek.

git checkout alpha
git rebase origin/master -X theirs

Şube yeniden düzenlendi, ancak proje muhtemelen geçersiz durumda. Sorun değil, son bir adımımız var. Sadece proje durumunu geri yüklememiz gerekiyor, bu nedenle şube 'temp' ile aynı olacaktır. Teknik olarak, ağacını (klasör durumunu) düşük seviyeli git commit-tree komutu ile kopyalamamız gerekiyor . Ayrıca, mevcut şubeyle birleştirme, commit oluşturdu.

git merge --ff $(git commit-tree temp^{tree} -m "Fix after rebase" -p HEAD)

Ve geçici şubeyi sil

git branch -D temp

Bu kadar. Gizli birleştirme yoluyla bir geri ödeme yaptık.

Ayrıca bir senaryo yazdım, böylece diyalog yoluyla yapılabilir, burada bulabilirsiniz .


13

Not: Git 2.14.x / 2.15 (Q3 2017) ile, git rebaseçakışma durumunda mesaj daha net olacaktır.

Bkz 5fdacc1 taahhüt tarafından (16 Tem 2017) William Duclot ( williamdclt) .
(Göre Birleştirilmiş - Junio Cı Hamano gitster- içinde 076eeec tamamlama 2017 Ağustos 11)

rebase: deneyimsiz kullanıcılar için mesaj çözümünü daha net hale getirin

Önce:

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort"

Sonra:

Resolve all conflicts manually, 
mark them as resolved with git add/rm <conflicted_files>
then run "git rebase --continue".

You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".')

Git kullanıcı arayüzü, hata mesajlarını yardımcı oldukları kişilere göndererek geliştirilebilir: deneyimsiz ve sıradan git kullanıcıları.
Bu amaçla, bu mesajlarda kullanılan terimlerin bu kullanıcı kesimi tarafından anlaşıldığından ve sorunu çözmek için onlara yol gösterdiklerinden emin olmak faydalı olacaktır.

Özellikle, bir git yeniden temeli sırasında bir yamanın uygulanmaması, deneyimsiz kullanıcılar için oldukça istikrarsızlaştırıcı olabilen yaygın bir sorundur.
Onları çatışmanın çözümüne yönlendirmek (bu 3 aşamalı bir süreçtir, dolayısıyla karmaşıktır) ve başa çıkamayacakları bir durumdan kaçabileceklerine dair güvence vermek " --abort" önemlidir .
Bu commit, çözüm sürecini detaylandırarak ve şifreli git linguo'dan kaçınarak bu iki noktaya cevap verir.


1
Güzel! Yardım sayfası değişikliği yaparak çatışmayı çözmeyi söylüyor, ama hayır! Burada commit'i atlamalı ve bunun yerine birleştirmeye devam etmeliyiz! (yardım sayfası: help.github.com/articles/… )
Jerther
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.