Birleşme çatışmasıyla karşılaştım. Birleştirmeyi nasıl iptal edebilirim?


2539

Ben kullanılan git pullve bir birleştirme çatışma vardı:

unmerged:   _widget.html.erb

You are in the middle of a conflicted merge.

Dosyanın diğer sürümünün iyi olduğunu ve benimkinin kötü olduğunu biliyorum, bu yüzden tüm değişikliklerim terk edilmeli. Bunu nasıl yapabilirim?


30
Bunun çok eski bir soru olduğunu anlıyorum, ancak tüm birleştirmeyi iptal etmek mi ve birleştirdiğiniz şubeyi ayrılmamak mı yoksa daha büyük bir birleştirmenin parçası olarak bu dosyayı görmezden gelmek mi, diğer tüm dosyaların normal? Bana göre, başlığınız ilkini ima ediyor, soru bedeniniz ikincisini istiyor. Cevaplar her şeyi açıklığa kavuşturmadan yapar.
rjmunro

Taahhütte, otomatik birleştirmenin başarısız olduğunu söyleyerek benzer bir dava aldım; çatışmaları düzeltin ve sonucu [rejected] gh-pages -> gh-pages (non-fast-forward)
kesin

4
Gwyn, burada kabul edilmiş bir cevap seçmek yararlı olabilir. Üst oy bir daha güncel çözümlerin bazılarından biraz daha az güvenli, bu yüzden başkalarına vurgulamak için yardımcı olacağını düşünüyorum :)
Dostça

Yanıtlar:


2220

Senin yana pulloldu sonra başarısız HEAD(değil HEAD^) son "geçerli" senin şube üzerinde:

git reset --hard HEAD

İstediğiniz diğer parça, değişikliklerinizin değişikliklerinizi aşmasına izin vermektir.

Git'in eski sürümleri "onların" birleştirme stratejisini kullanmanıza izin verdi:

git pull --strategy=theirs remote_branch

Ancak bu mesaj, Junio ​​Hamano (Git sürdürücüsü) tarafından açıklandığı gibi kaldırıldı . Bağlantıda belirtildiği gibi , bunun yerine şunları yaparsınız:

git fetch origin
git reset --hard origin

49
Donanımdan sıfırlama yapmak yerine, bunu daha ayrıntılı bir düzeye getirebilirsiniz: git fetch origin -> git reset origin (soft reset, your changes are still present) -> git checkout file_to_use_their_version_of another_file (steamroll your own changes back to match the origin) Asla git pull'u artık kullanmıyorum. En son kodum ve kökeni arasındaki kavgada, kökeni her zaman kazanmalı, her zaman git fetchve git rebase origin. Bu aslında birleşmelerimi ve çatışmalarımı az ve çok yapar.
Kzqai

7
Katılıyorum. Ayrıca önce getirmeyi ve sonra yukarı yönlü değişiklikleri ( git log ..@{upstream}veya git diff ..@{upstream}) incelemeyi seviyorum . Ondan sonra, senin gibi, işimi yeniden kazanacağım.
Pat Notz

162
Daha yeni bir cevapta belirtildiği gibi, 1.6.1 sürümünden itibaren, 'git reset --merge'
Matt Ball

5
Bir seçenek gibi görünüyor git merge -X theirs remote_branchyerine kullanılırgit pull --strategy=theirs remote_branchtheirsrecursive
mlt

14
git merge --abortçok tercih edilir.
Daniel Cassidy

1956

Git sürümünüz> = 1.6.1 ise, kullanabilirsiniz git reset --merge.

Ayrıca @Michael Johnson'un belirttiği gibi, git sürümünüz> = 1.7.4 ise de kullanabilirsiniz git merge --abort.

Her zaman olduğu gibi, birleştirmeye başlamadan önce taahhüt edilmemiş değişiklikleriniz olmadığından emin olun.

Gönderen git birleştirme adam sayfası

git merge --abortmevcut git reset --mergeolduğunda eşdeğerdir MERGE_HEAD.

MERGE_HEAD birleştirme işlemi devam ederken kullanılabilir.

Ayrıca, bir birleştirmeye başlarken taahhüt edilmemiş değişikliklerle ilgili olarak:

Birleştirme işlemine başlamadan önce işlemek istemediğiniz değişiklikler varsa, yalnızca git stashbirleştirme git stash popişleminden önce ve birleştirmeyi bitirdikten veya iptal ettikten sonra bunları yapmak istersiniz .


3
İlginç - ama kılavuz beni korkutuyor. Tam olarak ne zaman kullanılır? Ne zaman isteğe bağlı belirtmelisiniz <commit>? #GitMoment: -o
conny

1
Birleştirmeyi en baştan yeniden yapmak istediğinizde bunu genellikle kullanırsınız. Ben hiçbir zaman isteğe bağlı taahhüt kendimi belirtmek zorunda kaldım, bu yüzden varsayılan (isteğe bağlı <commit>) gayet iyi.
Carl

44
Keşke bu cevabın daha fazla oyu olsaydı! Bu noktada, birçok durumda en uygun çözüm gibi görünüyor.
Jay Taylor

1
Değişmez değişikliklerle bile git, birleştirmeden önce durumu geri yükleyebildi. Güzel!
T3rm1

2
Mi git merge --abortsadece eş anlamlısı git reset --merge? İsim kesinlikle daha mantıklı, ancak aynı işlevselliğe sahip mi?
Tikhon Jelvis

518
git merge --abort

Mevcut çatışma çözümleme sürecini iptal edin ve birleştirme öncesi durumunu yeniden yapılandırmaya çalışın.

Birleştirme başladığında taahhüt edilmemiş çalışma ağacı değişiklikleri varsa git merge --abort, bazı durumlarda bu değişiklikleri yeniden yapılandıramaz. Bu nedenle git merge çalıştırmadan önce her zaman değişikliklerinizi yapmanız veya saklamanız önerilir.

git merge --abortmevcut git reset --mergeolduğunda eşdeğerdir MERGE_HEAD.

http://www.git-scm.com/docs/git-merge


16
Bu, git v1.7.4'ten beri mevcuttur. Git reset --merge için bir takma addır.
Michael Johnson

162

Çok basit.

git merge --abort

Git'in kendisi bu tür bir sorunla karşılaştığınızda size çözümü gösterir ve git status komutunu çalıştırır.

git status

Umarım bu insanlara yardım eder.


97

Sanırım git resetihtiyacın var.

Dikkat edin git revert, diyelim ki, çok farklı araçlar şey svn revertoysa Subversion Geri döndürme deposundan geçerli sürüme dosyayı dönen, sizin (kaydedilmemiş) değişiklikler kaybolacak, - git revert"geri alır" bir taahhüt.

git resetsvn revertİstenmeyen değişikliklerin eşdeğerini , yani istenmeyen değişiklikleri atmalısınız .


76

Bu özel kullanım durumunda, birleştirmeyi gerçekten iptal etmek istemezsiniz, sadece çatışmayı belirli bir şekilde çözebilirsiniz.

Farklı bir stratejiyle sıfırlamanın ve birleştirmenin özel bir gereği yoktur. Çakışmalar git tarafından doğru bir şekilde vurgulanmıştır ve diğer taraf değişikliklerini kabul etme gereksinimi sadece bu dosya içindir.

Bir çakışmadaki birleştirilmemiş dosya için git, dizindeki dosyanın ortak taban, yerel ve uzak sürümlerini kullanılabilir kılar. (Burada 3 yönlü fark aracında kullanılmak üzere okundukları yerdir git mergetool.) Bunları git showgörüntülemek için kullanabilirsiniz .

# common base:
git show :1:_widget.html.erb

# 'ours'
git show :2:_widget.html.erb

# 'theirs'
git show :3:_widget.html.erb

Uzak sürüm kelimesi kelimesini kullanma çakışmasını çözmenin en basit yolu:

git show :3:_widget.html.erb >_widget.html.erb
git add _widget.html.erb

Veya git> = 1.6.1 ile:

git checkout --theirs _widget.html.erb

5
ipucu için teşekkürler. Bu kötü git kullanıcı arayüzü smack değil mi?
Peter

@Peter: İkna olmadım. İstenilen sonuç, basit seçeneklere sahip birkaç temel komutla elde edilebilir. Ne gibi iyileştirmeler önerirsiniz?
CB Bailey

10
Bence git 1.6.1emir çok mantıklı ve iyi. Ben de tam olarak bunu isterdim. 1.6.1 öncesi çözümün yetersiz olduğunu ve git çözümleme işleminden ayrılması gereken git'in diğer bölümleri hakkında bilgi gerektirdiğini düşünüyorum. Ama yeni sürüm harika!
Peter

67

Gibi senaryo için, yaptım git fetchve git pullsonra, memba şubesinin ana dal olmadığını fark ettim, bu da istenmeyen çatışmalara yol açtı.

git reset --merge 

Bu, yerel değişikliklerimi sıfırlamadan geri döndü.


45

Yorumlar bunun git reset --mergeiçin bir takma ad olduğunu gösteriyor git merge --abort. Sadece a'nın mevcut git merge --abortolduğu git reset --mergegöz önüne alındığında eşdeğer olduğunu fark etmek gerekir MERGE_HEAD. Bu, birleştirme komutu için git yardımında okunabilir.

git merge --abort, MERGE_HEAD mevcut olduğunda git reset --merge öğesine eşdeğerdir.

Başarısız bir birleştirme işleminden sonra, hayır MERGE_HEADolduğunda, başarısız birleştirme işlemi geri alınabilir git reset --mergeancak zorunlu olarak değil git merge --abort. Aynı şey için sadece eski ve yeni sözdizimi değildir .

Şahsen, git reset --mergetarif edilene benzer senaryolar için çok daha güçlü buluyorum ve genel olarak başarısız birleşmeler.


2
burada "başarısız birleştirme" ile kastedilen nedir? Çatışmalarla veya başka bir şeyle birleşmek mi? Veya yeniden ifade etmek için: MERGE_HEAD ne zaman mevcut değildir? Takip eden sorum, "git reset --merge" işlevinin daha iyi kullanımını anlamak.
Ewoks

@Ewoks git stash applybenim için birleşme çatışmasına neden oldu, ancak git merge --abortyardımcı git reset --mergeolmadı.
nitzel

27

Birleştirme çakışmasıyla sonuçlanırsanız ve taahhüt edilecek bir şey yoksa, ancak yine de bir birleştirme hatası görüntülenir. Aşağıda belirtilen tüm komutları uyguladıktan sonra,

git reset --hard HEAD
git pull --strategy=theirs remote_branch
git fetch origin
git reset --hard origin

Lütfen kaldır

.git \ index.lock

Dosyayı [kurtarma durumunda başka bir yere kes yapıştırma] dosyalayın ve ardından istediğiniz sürüme bağlı olarak aşağıdaki komutlardan birini girin.

git reset --hard HEAD
git reset --hard origin

Umarım yardımcı olur!!!


19

Çalışan kopyanın durumunu koruyan bir alternatif:

git stash
git merge --abort
git stash pop

Genellikle buna karşı tavsiyede bulunuyorum çünkü Subversion'da bir sonraki taahhütte şube ilişkilerini attığı için etkili bir şekilde birleşmek gibi.


Yanlışlıkla git-svn dalına birleştiğimde bu yaklaşımı yararlı buldum, ki bu da iyi işlemiyor. Squash birleştirme veya kiraz seçtikleri git-svn izleme dalları ile çalışırken daha iyidir. Aslında benim çözümüm, bir birleşmeyi gerçeğin ardından bir kabak birleşmesine dönüştürür.
Alain O'Dea


18

Git 1.6.1.3 git checkoutbir birleştirmenin her iki tarafından da ödeme yapabildiğinden:

git checkout --theirs _widget.html.erb

3

Aşağıdakilerin benim için çalıştığını buldum (birleştirme öncesi tek bir dosyayı geri döndür):

git reset *currentBranchIntoWhichYouMerged* -- *fileToBeReset*

-5

SourceTree

Birleştirme işleminizi gerçekleştirmediğiniz için, başka bir şubeye çift tıklayın (yani ödeme anlamına gelir) ve sourcetree size tüm değişiklikleri atmayı sorduğunda kabul edin :)

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.