Birleştirme çakışmalarını çözdükten sonra birleştirmeyi nasıl bitiririm?


282

Git Topluluk Kitabının Temel Dallanma ve Birleştirme bölümünü okudum .

Bu yüzden takip ediyorum ve bir dal oluşturuyorum experimental.

Sonra ben:

  1. deneysel dala geç (deneysel deneysel git)
  2. bir sürü değişiklik yap
  3. taahhüt et (git taahhüt -a)
  4. ana şubeye geç (git checkout master)
  5. bazı değişiklikler yapın ve orada taahhüt edin
  6. denemeye geri dön (git checkout experimental)
  7. master'ı deneysel olarak birleştir (git merge master)
  8. bazı çakışmalar var ama bunları çözdükten sonra 'git dosyamı ekledim'

  9. Ve şimdi sıkıştım, ustaya geri dönemem

ben yaparken

 $ git checkout master
error: Entry 'res/layout/my_item.xml' would be overwritten by merge. Cannot merge.

Ve yaptım:

$ git rebase --abort

Devam eden rebase yok mu?

Ve yaptım :

$  git add res/layout/socialhub_list_item.xml
$ git checkout master
error: Entry 'res/layout/my_item.xml' would be overwritten by merge. Cannot merge.

Ana şubeme geri dönebilmek için ne yapabilirim?


Çakışmayı giderdikten sonra, ekleme işlemini gerçekleştirin ve ardından taahhüdü gerçekleştirmeye çalıştıktan sonra git commit gf2n.cpp -m "Hand merge gf2n.cpp due to conflicts"sonuçlanır fatal: cannot do a partial commit during a merge.. Ve elbette, "Kısmi taahhütler" git man sayfalarında hiçbir yerde belgelenmiş veya tartışılmış gibi görünmüyor. git mergeDüzeltme sonrası bir sonuç Please, commit your changes before you can merge.Ne kırık bir eşek aracı ...
jww

2
git kesin yollarla kesinleştirme, TANIMLAMA'daki kılavuz sayfasında "3" olarak belgelenmiştir. dosyaları command komutuna argümanlar olarak listeleyerek, bu durumda command dizinde aşamalı değişiklikleri göz ardı eder ve bunun yerine listelenen dosyaların geçerli içeriğini (zaten Git tarafından bilinmesi gerekir) kaydeder; "ve ayrıca '- Birleştirme mesajının, taahhüt komutunun nasıl çalıştığını okuyacağınızı ve bu açıklamadaki "kısmi" kelimesinin anlamını, en azından o zaman olmasa bile, tanıyabileceği varsayılan biri tarafından yazıldığından eminim. tekrar ve daha dikkatli. @jww
jthill

1
Öyleyse, bu vaka çalışması neden anlama için dikkatli okumayı hak ediyor? @jww
jthill

1
Git'i açıkça kullanmak, edinmeye hazır olduğunuzdan daha iyi bir okuma anlama gerektirir. Belki de git olduğundan emin olmaktan çok daha fazla emin değilim.
jthill

1
Git 2.12 (1. Çeyrek 2017) ile yakında bir git merge --continue. Aşağıdaki cevabımı
VonC

Yanıtlar:


267

Birleştirme sırasında çakışma olduğunda, birleştirme işlemini el ile tamamlamanız gerekir. İlk iki adımı uyguladığınız anlaşılıyor, çakışan dosyaları düzenlemek ve daha sonra git addbunları çözülmüş olarak işaretlemek için üzerlerinde çalıştırmak . Son olarak, birleştirme işlemini gerçekleştirmeniz gerekir git commit. Bu noktada tekrar şube değiştirebileceksiniz.


Taahhüt için "git gui &" komutunu kullanırsanız, şube durumunuzun artık "birleşmediğini" fark edemeyebilirsiniz. Şube durumunuzun doğru olduğundan emin olmak için bir "git status" ile devam etmek yardımcı olur.
Tony Ashworth

4
git commit -am "your commit message"Aynı anda ekleme ve ekleme işlemini gerçekleştirmeye çalışın .
vaheeds

3
git commitçalışır. Ve en iyisi, sizin için doldurulmuş varsayılan birleştirme taahhüdü mesajı almak için kullanmaktır. İletiyi geçersiz kılacağından `` git commit -am "'dan
kaçınırım

1
Deneyin git push.
alper

Bu senaryoyu aşağıdaki senaryoda aldım -> X dalını Y dalıyla birleştirdim. Sonra Y dalında yanlış bir şey yaptığımı fark ettim, bu yüzden düzelttim ve sonra Y dalındaki değişikliklerimi "değiştirdim". Değişiklik nedeniyle git yeni taahhüt oluşturmadı. Bu yüzden X dalını güncellenmiş Y dalıyla birleştirdiğimde çatışma çıktı. BTW bu cevap için teşekkürler.
doga

157

Birleştirme çakışmalarını çözdükten sonra birleştirmeyi nasıl bitiririm?

Git 2.12 (Q1 2017) ile daha doğal bir komuta sahip olacaksınız:

git merge --continue

Bkz . Jeff King ( ) tarafından verilen c7d227d (15 Aralık 2016 ) . Bkz. Taahhüt 042e290 , taahhüt c261a87 , taahhüt 367ff69 (14 Aralık 2016), Chris Packham ( ) . (Göre Birleştirilmiş - Junio Cı Hamano - içinde 05f6e1b tamamlama 2016 27 Ara)peff
cpackham
gitster

Bkz. 2.12 sürüm notları .

merge: ' --continue' ile eşanlamlı olarak ' ' seçeneği eklegit commit '

Birleştirmeyi 'tamamlayarak' devam etmesine izin veren seçeneği git merge' öğretin --continue.
Çatışmaları çözdükten sonra birleştirmeyi tamamlamanın geleneksel yolu ' git commit' kullanmaktır .
Şimdi ' git rebase' ve ' git cherry-pick' gibi komutlara sahip ' --continue' seçeneğine sahip olmak ' ' için böyle bir seçenek ekleyerek git mergetutarlı bir kullanıcı arayüzü sunar.


2017'nin ilk çeyreğinde 2.12'de nasıl eklendiğine dair bir yorum yayınlamaya hazırlandım, ancak daha sonra cevabınızın ilk satırını tekrar okudum. Seçenek 2.10 sürümünde benim için bulunamadı!
cjsimon

1
Git merge --continue komutunu denedim ve Git Bash bunu komut olarak tanıyamadı. Ama işe yarayan git commit -m "İşlem mesajı"
Mimi

2
@Mimi Tamam, ama Git 2.12 veya daha fazlasını mı kullanıyorsunuz?
VonC

@VonC haklısın, Git'in eski bir sürümünü kullanıyorum!
Mimi

23

Bir birleştirme / yeniden yapılandırma sırasında takılırsanız, her zaman

git reset --hard

çalışmanızı son taahhüt durumuna geri döndürmek için. Bu, çalışma ağacındaki değişikliklerinizi kaybedecektir, bu nedenle birleştirme işleminden önce yerel değişiklikleriniz varsa, bundan sonra giderler - bu nedenle yerel değişiklikleriniz olduğunda birleştirme başlatmamanız önerilir. :)


16
zorunlu uyarı: git reset --hardtaahhüt edilmemiş değişiklikleri atar
Geoffrey Hale

2
Neden sadece git merge --abort, hiçbir şey kaybetme riski yok ki?
Alexander George


11

Komutu kullanarak iki dalı birleştirdiğinizde git merge brancha branchb, iki olasılık vardır:

  1. Bir şubeye (brancha diyelim) diğer şube (diyelim branb diyelim) taahhüt geçmişini takip ederek ulaşılabilir.

    Ancak, iki dal daha eski bir noktada sapmışsa, git yeni bir anlık görüntü oluşturur ve bunu işaret eden yeni bir taahhüt ekler. Birleştirdiğiniz dallar arasında çakışma olmaması durumunda git sorunsuz bir şekilde yeni bir taahhüt oluşturur.

git logÇakışan olmayan iki dalı birleştirdikten sonra taahhüdü görmek için çalıştırın .

Şimdi, birleşen şubeler arasında birleşme çatışmaları olduğunda ilginç duruma geri dönüyoruz. Bunu https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Birleme sayfasından alıntı yapıyorum

Git otomatik olarak yeni bir birleştirme taahhüdü oluşturmadı. Siz çakışmayı giderirken işlemi duraklattı. Birleştirme çakışmasından sonra herhangi bir noktada hangi dosyaların birleştirilmediğini görmek istiyorsanız,git status


Birleştirme çakışmaları olması durumunda, çatışmayı çözmeniz, sonra yaptığınız değişiklikleri hazırlama alanına kullanarak eklemeniz git add filenameve ardından git commit çakışma nedeniyle git tarafından duraklatılan komutu kullanarak değişiklikleri yapmanız gerekir . sorgu. Ayrıntılı bir anlayış için yukarıdaki bağlantıyı da ziyaret edin. Herhangi bir sorgu durumunda lütfen aşağıdaki yorum, size yardımcı olmaktan mutluluk duyarız.


7

Çakışmaları manuel olarak çözdükten sonraki adımlar: -

  1. git ekleyin.
  2. git status (otomatik birleştirme işlemine devam etmek için hangi komutların gerekli olduğunu gösterir)
  3. [komut git göstermektedir, örneğin git merge --continue, git cherry-pick --continue, git rebase --continue]

16
Git birleştirme yok
Hola Soy Edu Feliz Navidad

@HolaSoyEduFelizNavidad Bu yanlış. Zie git çatışmadan sonra çıktı: - error: Failed to merge in the changes. Patch failed at 0001 ADD: _type to styleguide The copy of the patch that failed is found in: .git/rebase-apply/patch 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".
Timidfriendly


git merge --continueBen de bunu yapmaya çalışıyorum error: unknown option 'continue'. Ben git-mergeman sayfasının listelemediğinden cevabınızın yanlış olduğundan eminim . Git'in hangi sürümünü kullanıyorsunuz? Kullanıyorum git version 1.8.5.2 (Apple Git-48). MacPorts ile de denedim git version 2.9.3.
jww

1
Git 2.10 ile basit bir birleştirme için komut düz eskigit commit
Chris Charabaruk

2

Birleştirmeye çalıştığınız iki dal aynı dosyanın aynı bölümünü değiştirdiğinde bir birleştirme çakışması oluşur. İle bir çakışma listesi oluşturabilirsiniz git status.

Çakışan satırla karşılaşıldığında Git, etkilenen dosyaların içeriğini, çakışan içeriğin her iki tarafını işaretleyen görsel göstergelerle düzenler.

<<<<<<< HEAD
conflicted text from HEAD
=======
conflicted text from merging_branch
>>>>>>> merging_branch

Çakışan dosyalarınızı düzelttiğinizde ve birleştirmeye hazır olduğunuzda, yapmanız gereken tek şey çalıştırmak git addve git commitbirleştirme taahhüdü oluşturmaktır. Taahhüt yapıldıktan sonra git pushşubedeki değişiklikler.

Referans makale: Git birleştirme .


2

Tüm dosyalar eklendikten sonra, bir sonraki adım " git commit " dir.

"git status" ne yapılacağını önerecektir: henüz eklenmeyen dosyalar en altta listelenir ve hepsi tamamlandığında, geçerli dalın birleştirme durumunu açıkladığı en üstte bir taahhüt önerir.


1

Açıklamak istediğim ilk şey, şube adlarının sadece belirli bir taahhüt için bir takma ad olmasıdır. bir taahhüt git'in çalıştığı şeydir, çektiğinizde, birleştirmeyi vb. Her taahhüdün benzersiz bir kimliği vardır.

$ Git merge yaptığınızda, gerçekte olan git git, geçerli dalınızı başvurulan dalın bulunduğu işleme hızlı bir şekilde iletmeye çalışır (diğer bir deyişle her iki şube adı da aynı işleme işaret eder.) Bu senaryo git için en kolay olanıdır. yeni bir taahhüt olmadığı için uğraşmak. Ustanın dalınızın ürediği lilipad'a atlamasını düşünün. --No-ff bayrağını ayarlamak mümkündür; bu durumda git, herhangi bir kod çakışması olup olmadığına bakılmaksızın yeni bir işlem oluşturur.

Birleştirmeye çalıştığınız iki dal arasında kod çakışmalarının olduğu bir durumda (genellikle taahhüt geçmişi geçmişte ortak bir taahhüt paylaşan iki dal), hızlı ileri çalışmaz. git, çakışan dosyadaki her iki dal tarafından aynı satır değiştirilmediği sürece, dosyaları otomatik olarak birleştirebilir. bu durumda git, çakışan dosyaları sizin için birleştirir VE otomatik olarak işler. Git'in nasıl yapıldığını $ git diff --cached yaparak önizleyebilirsiniz. Veya --no-commit bayrağını, eklemeniz ve kaydetmeniz gereken değiştirilmiş dosyaları dizininizde bırakacak olan birleştirme komutuna iletebilirsiniz. Ancak $ git birleştirmenin neyi değiştireceğini incelemek için bu dosyaları dağıtabilirsiniz.

Üçüncü senaryo git'in otomatik olarak çözemediği çatışmalar olduğunda. Bu durumda, bunları manuel olarak birleştirmeniz gerekir. Bence bu araksis birleştirme veya p4merge (ücretsiz) gibi bir birleştirme ile yapmak en kolay. Her iki durumda da, her dosyayı tek tek yapmanız gerekir. Birleştirme sıkışmış gibi görünüyorsa, $ go merge --continue kullanın. Git size devam edip etmeyeceğini ve neden devam edip etmediğini söylemelidir. Birleştirmeyi bir noktada tamamladığınızı düşünüyorsanız, $ git merge --abort yapabilirsiniz ve herhangi bir birleştirme geri alınacak ve baştan başlayabilirsiniz. İşiniz bittiğinde, birleştirdiğiniz her dosya eklenmesi ve işlenmesi gereken değiştirilmiş bir dosya olacaktır. $ Git durumundaki dosyaların nerede olduğunu doğrulayabilirsiniz. Birleştirilmiş dosyaları henüz işlemediyseniz. Birleştirmeyi tamamlamak için bunu yapmanız gerekir.


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.