Soru Git'te birleştirme çakışmaları nasıl giderilir


Git'deki birleştirme çakışmaları nasıl çözüleceğini açıklamanın iyi bir yolu var mı?


4134
2017-10-02 11:31


Menşei


Aşağıdaki blog yazısı, doğru yönde ilerlemenizi sağlayan Git ile birleştirme çakışmasının nasıl ele alınacağı konusunda çok güzel bir örnek veriyor gibi görünüyor. Git'te Çakışmaları İşleme ve Önleme - mwilliams
Birleştirme aracını yapılandırabilirsiniz (kdiff3 jebaird.com/2013/07/08/...) ve sonra git mergetool kullanın. Büyük geliştirici ekiplerinde çalışırken, her zaman birleştirme çakışmalarıyla karşılaşırsınız. - Grady G Cooper
Birleştirme akışlarını düzenli olarak birleştirerek çoğu birleştirme ihtilafını azaltabileceğinizi unutmayın! - Ant P
Ayrıca bkz. git-tower.com/learn/git/ebook/command-line/tools-services/... - Pacerier
Bu detaylı bir öğretici gibi görünüyor - githubtraining.com/fix-merge-conflict-git-using-sourcetree - Rajavanya Subramaniyan


Cevaplar:


Deneyin: git mergetool

Her çatışmada size yol gösteren bir GUI açar ve nasıl birleştirileceğini seçersiniz. Bazen daha sonra elle biraz düzenleme gerektirir, ancak genellikle kendi başına yeterlidir. Her şeyi el ile yapmaktan çok daha iyidir.

@JoshGlover yorumuna göre:

Bir tane yüklemedikçe, komut mutlaka bir GUI açmaz. Koşu git mergetool benim için sonuçlandı vimdiff Kullanılan. Bunun yerine kullanmak için aşağıdaki araçlardan birini yükleyebilirsiniz: meld, opendiff, kdiff3, tkdiff, xxdiff, tortoisemerge, gvimdiff, diffuse, ecmerge, p4merge, araxis, vimdiff, emerge.

Aşağıda kullanılacak örnek prosedür vimdiff birleştirme çakışmaları çözmek için. Dayalı bu bağlantı

Aşama 1: Terminalinizde aşağıdaki komutları çalıştırın

git config merge.tool vimdiff
git config merge.conflictstyle diff3
git config mergetool.prompt false

Bu, vimdiff'i varsayılan birleştirme aracı olarak ayarlayacaktır.

Adım 2: Terminalde aşağıdaki komutu çalıştırın

git mergetool

Aşama 3: Aşağıdaki formatta bir vimdiff ekran göreceksiniz

  +----------------------+
  |       |      |       |
  |LOCAL  |BASE  |REMOTE |
  |       |      |       |
  +----------------------+
  |      MERGED          |
  |                      |
  +----------------------+

Bu 4 görüş

LOCAL - bu mevcut şubeden dosyadır

BASE - ortak atası, dosyanın her iki değişiklikten önce nasıl göründüğü

REMOTE - şubenize katıldığınız dosya

MERGED - sonuç birleştirme, repoda kurtarılan şey budur

Kullanarak bu görünümler arasında gezinebilirsiniz. ctrl+w. Kullanarak MERGED görünümüne doğrudan ulaşabilirsiniz. ctrl+w bunu takiben j.

Vimdiff navigasyon hakkında daha fazla bilgi İşte ve İşte

4. Adım. MERGED görünümünü aşağıdaki şekilde düzenleyebilirsiniz.

REMOTE'dan değişiklik almak istiyorsanız

:diffg RE  

BASE'den değişiklik almak istiyorsanız

:diffg BA  

LOCAL'dan değişiklik almak isterseniz

:diffg LO 

Adım 5. Kaydet, Çık, Taahhüt ve Temizle

:wqa vi'den kaydet ve çık

git commit -m "message"

git clean Dif aracının yarattığı ekstra dosyaları (ör. * .Orig) kaldırın.


2425
2017-10-02 17:50



FYI kullanabilirsiniz git mergetool -y Bir kerede çok sayıda dosyayı birleştiriyorsanız birkaç tuşa basmak için - davr
Bir tane takmadıkça, mutlaka bir GUI açmaz. Koşu git mergetool benim için sonuçlandı vimdiff Kullanılan. Bunun yerine kullanmak için aşağıdaki araçlardan birini yükleyebilirsiniz: meld opendiff kdiff3 tkdiff xxdiff tortoisemerge gvimdiff diffuse ecmerge p4merge araxis vimdiff emerge. - Josh Glover
İyi nokta Josh. Ubuntu'da, meld ile en iyi şansa sahip oldum, üçlü birleştirme ekranı kötü değil. OSX git'de güzel bir varsayılan seçti. - Peter Burns
Bu KDiff3'ü açtı. Kullanmak için kesinlikle hiçbir fikrim yok. - David Murdoch
Bu cevabın neden bu kadar çok destek aldığını anlamıyorum, sadece bu tek komutu içerdiği ve onu nasıl kullanacağına dair hiçbir açıklama içermediği için gerçekten çok yardımcı olmuyor. Diğerleri dediği gibi, bir vimdiff açtı ve vim'i nasıl kullanacağımı bile bilsem (pencereleri en azından kapat ya da kapat) Her pencerenin ne değiştiğini ne de neyi karşılaştırdığımı veya kabul etmediğini bile bilmiyorum. Böyle bir komutun olduğunu bilmek çok güzel, ama nasıl kullanılacağı ya da başka 3. araçların nasıl kurulacağı hakkında hiçbir açıklama yapılmadan, işe yaramaz bir cevaptır. - Petr


İşte olası bir kullanım çantası, yukarıdan:

Bazı değişiklikler yapacaksın, ama ops, sen güncel değilsin:

git fetch origin
git pull origin master

From ssh://gitosis@example.com:22/projectname
 * branch            master     -> FETCH_HEAD
Updating a030c3a..ee25213
error: Entry 'filename.c' not uptodate. Cannot merge.

Böylece, güncel olsun ve tekrar deneyin, ancak bir çakışma var:

git add filename.c
git commit -m "made some wild and crazy changes"
git pull origin master

From ssh://gitosis@example.com:22/projectname
 * branch            master     -> FETCH_HEAD
Auto-merging filename.c
CONFLICT (content): Merge conflict in filename.c
Automatic merge failed; fix conflicts and then commit the result.

Yani değişikliklere bir göz atmaya karar verdiniz:

git mergetool

Ah, oh, benim üstümde bazı şeyler değişti, ama sadece değişimlerimi kullanmak için ... hayır ... onların değişimleri ...

git checkout --ours filename.c
git checkout --theirs filename.c
git add filename.c
git commit -m "using theirs"

Ve sonra son bir kez deniyoruz

git pull origin master

From ssh://gitosis@example.com:22/projectname
 * branch            master     -> FETCH_HEAD
Already up-to-date.

Sürpriz!


1610
2017-08-04 17:04



Bu çok yararlı oldu çünkü ikili dosyalar (sanat varlıkları) ile birleştirme hataları çok vardı ve bunları birleştirmek her zaman başarısız gibi görünüyor, bu yüzden her zaman yeni dosya ile üzerine yazmak ve "birleştirmek" değil - petrocket
Dikkatli! - ve - anlamların anlamı tersine döndü. - Uzaktan kumanda ==. --theirs == yerel. Görmek git merge --help - mmell
Benim durumumda, şunu teyit ederim - theirs = remote deposu, --ours = kendi yerel depomu. @Mmell yorumlarının tam tersidir. - Aryo
@mmell Sadece görünüşte, bir rebase. Görmek this question - Navin
Çocuklar, "bizimki" ve "onlarınki", birleşme ya da kırılma olup olmadığına bağlı. Eğer öyleysen birleştirmesonra "bizimki", birleştirdiğiniz şubeyi ve "onların", birleştirdiğiniz şubedir. rebasingve sonra "bizimki", yeniden inşa etmek istediğiniz taahhütleri ifade ederken "onların", yeniden düzenlemek istediğiniz taahhütleri ifade eder.


Birleştirme araçlarını nadiren çatışmayı veya çözümü anlamama yardımcı olur. Genellikle bir metin düzenleyicideki çakışma işaretçilerine bakıp, ek olarak git günlüğünü kullanarak daha başarılıyım.

İşte birkaç ipucu:

İpucu Bir

Bulduğum en iyi şey "diff3" birleştirme çakışması stilini kullanmaktır:

git config merge.conflictstyle diff3

Bu, aşağıdaki gibi çakışma belirteçleri üretir:

<<<<<<<
Changes made on the branch that is being merged into. In most cases,
this is the branch that I have currently checked out (i.e. HEAD).
|||||||
The common ancestor version.
=======
Changes made on the branch that is being merged in. This is often a 
feature/topic branch.
>>>>>>>

Orta bölüm ortak ataların neye benzediğidir. Bu, yararlıdır çünkü her bir dalda neyin değiştiğini daha iyi anlamak için, alt ve üst sürümleri karşılaştırabilirsiniz; bu, her değişikliğin amacının ne olduğu konusunda size daha iyi bir fikir verir.

Çatışma sadece birkaç satırsa, bu genellikle çatışmayı çok belirgin hale getirir. (Bir çatışmanın nasıl düzeltileceğini bilmek çok farklıdır, başkalarının üzerinde çalıştıklarının farkında olmanız gerekir. Eğer kafanız karışırsa, o kişiyi odanıza çağırmak en iyisidir. en.)

Çatışma daha uzunsa, üç bölümün her birini "mayın", "ortak" ve "onların" gibi üç ayrı dosyaya kesip yapıştıracağım.

Sonra çakışmaya neden olan iki farklı hunks görmek için aşağıdaki komutları çalıştırabilir:

diff common mine
diff common theirs

Bu, birleştirme aracının, çakışan olmayan farklı hunks öğelerini de içereceğinden, birleştirme aracının kullanılmasıyla aynı şey değildir. Bunu dikkat dağıtıcı buluyorum.

İpucu iki

Birisi bundan daha önce bahsetti, ancak her bir farklılığın ardındaki niyetin anlaşılması, bir çatışmanın nereden geldiğini ve nasıl ele alınacağını anlamak için genellikle çok faydalıdır.

git log --merge -p <name of file>

Bu, ortak ata ile birleştirdiğiniz iki kafa arasında bu dosyaya dokunduğunuz tüm işlemleri gösterir. (Bu nedenle, birleştirmeden önce her iki dalda zaten var olan taahhütleri içermez.) Bu, mevcut ihtilafınızda açıkça bir etken olmayan farksız hunileri görmezden gelmenize yardımcı olur.

İpucu Üç

Otomatik araçlarla değişikliklerinizi doğrulayın.

Otomatik testleriniz varsa bunları çalıştırın. Eğer bir keten tiftiği, koş. Eğer bu inşa edilebilir bir proje ise, işlemeden önce onu inşa edin, vb. Her durumda, değişikliklerin hiçbir şeyi kırmadığından emin olmak için biraz test yapmalısınız. (Heck, çakışma olmadan birleştirme bile çalışma kodunu bozabilir.)

İpucu Dört

Önceden planlamak; İş arkadaşları ile iletişim kurabilir.

İleriyi planlamak ve başkalarının üzerinde çalıştıklarının farkında olmak, çatışmaları birleştirmek ve / veya daha erken çözüme yardımcı olmak için yardımcı olabilir - ayrıntılar hala akılda kalıcıdır.

Örneğin, siz ve başka bir kişinin, aynı dosya grubunu etkileyebilecek farklı bir yeniden düzenleme üzerinde çalıştığını biliyorsanız, her zaman birbirinizle konuşmalı ve her biriniz için ne tür değişiklikler yaptığınıza dair daha iyi bir fikir sahibi olmalısınız. verme. Planlı değişikliklerinizi paralel olarak değil seri olarak gerçekleştirirseniz, önemli ölçüde zaman ve çabadan tasarruf edebilirsiniz.

Büyük bir kod dizisini kesen büyük refactorings için, seri olarak çalışmayı güçlü bir şekilde düşünmelisiniz: Herkes kodun o alanı üzerinde çalışmayı durdurur, bir kişi ise tam bir refakatçiyi gerçekleştirir.

Eğer seri olarak (zaman baskısı, belki de) çalışamıyorsanız, en azından beklenilen birleşme çatışmaları hakkında iletişim kurmak en azından sorunları daha çabuk çözmenize yardımcı olurken, detaylar hala akılda kalıcıdır. Örneğin, bir iş arkadaşı bir haftalık bir süre boyunca bozucu bir dizi taahhütte bulunursa, o işyerinde bu iş birliği dalını bir veya iki kez birleştirmeyi / yeniden düzenlemeyi seçebilirsiniz. Bu şekilde, eğer birleştirme / rebase çatışmaları bulursanız, bunları bir haftada bir araya getirmek için büyük bir yumruda bir araya getirmekten daha çabuk çözebilirsiniz.

İpucu Beş

Birleştirme konusunda emin değilseniz, onu zorlama.

Birleşme, özellikle çok sayıda çakışan dosya olduğunda ve çakışma işaretleyicileri yüzlerce satırı kapsadığında bunaltıcı olabilir. Çoğu zaman, yazılım projelerini tahmin ederken, gnarly birleştirme işleminin üstesinden gelmek için gereken zamana yer vermeyiz, bu yüzden her bir çatışmayı bir kaç saat geçirmek için gerçek bir sürtünme gibi hissederiz.

Uzun vadede, planlamak ve başkalarının üzerinde çalıştıklarının farkında olmak, birleşme çatışmaları öngörmek için en iyi araçlardır ve bunları daha kısa sürede doğru bir şekilde çözmek için kendinizi hazırlar.


685
2017-09-28 21:08



Diff3 seçeneği, birleştirme ile sahip olmak için harika bir özelliktir. Buna rastladığım tek GUI, Perforce’in p4mergePerforce'nin diğer araçlarından ayrı olarak kurulabilir ve kullanılabilir (ki kullanmadım, ancak şikayetler duydum). - alxndr
Bu, internette "birleştirme ihtilaflarınızı nasıl gidereceğiniz" ile ilgili bulduğum en iyi öğretici! - Venkat Sudheer Reddy Aedama
Bu cevap oyları hak edenlerden biri; oylarla dolu olan yukarıdaki iki değil; - DJphy
Birleştirme çakışmasıyla sonuçlanan bir rebase girişiminden sonra: $ git log --merge -p build.xml çıktı: ölümcül: MERGE_HEAD olmadan --merge? - Ed Randall
Bir dosyada branch1'den değişiklik yaparsam ve o dosyanın branch2'de silinmesi durumunda. Bu birleşme çatışmasını nasıl çözebilirim? Bir dalın değişikliklerini koruyarak onları birleştirebileceğim git kullanmanın bir yolu var mı? - Honey


  1. Hangi dosyaların çakıştığını belirleyin (Git bunu size söylemelidir).

  2. Her dosyayı açın ve diffs'i inceleyin; Git onları sınırlar. Umarım her bloğun hangi versiyonunun tutulacağı açık olacaktır. Kodu işleyen diğer geliştiricilerle tartışmanız gerekebilir.

  3. Çakışma bir dosyada çözüldükten sonra git add the_file.

  4. Bir kez çözdünüz herşey çatışmalar git rebase --continue ya da her ne buysa Git, tamamladığında yap dedi.


321
2017-10-02 12:41



@Justin Git'i izleme olarak düşünün içerik dosyaları izlemek yerine. Ardından, güncellediğiniz içeriğin görülmesi kolay değil depoda ve eklenmesi gerekiyor. Bu şekilde düşünme, Git'in neden boş klasörleri izlemediğini de açıklar: Teknik olarak dosya olsalar da, izlenmesi gereken herhangi bir içerik yoktur. - Gareth
içerik var, içeriğin 2 sürümü olduğundan çakışma meydana geliyor. Bu nedenle "git add" doğru gelmiyor. Çatışma çözüldükten sonra yalnızca bir dosya işlemek istiyorsanız ("öldürme: kısmi bir taahhütte bulunamazsınız") işe yaramıyor (git eklenti, git taahhüt).) - Dainius
Evet, teknik olarak, bu, sorulan soruya cevap veriyor, ama kullanılabilecek bir cevap değil, bence, üzgünüm. Bu ne puan Bir dalı diğeriyle aynı yapmanın mı? Elbette bir birleşme çatışmaya girecek .. - Thufir
Trakya: kim bir dalın diğeriyle aynı şey yaptığını söyledi? "Bir dalı diğeriyle aynı yapma" olmadan, birleştirmeniz gereken farklı senaryolar vardır. Biri, bir geliştirme dalı ile işiniz bittiğinde ve değişikliklerini ana şubeye dahil etmek istediğinizde; Bundan sonra geliştirme dalı silinebilir. Bir diğeri ise, nihai nihai birleştirmeyi kolaylaştırmak için geliştirme dalınızı yeniden düzenlemek istediğiniz zaman. - Teemu Leisti
@JustinGrant git add dizindeki dosyaları aşamalar; o yapar değil depoya herhangi bir şey eklemek. git commit depoya bir şeyler ekler. Bu kullanım birleştirme için mantıklıdır - birleştirme otomatik olarak birleştirilebilen tüm değişiklikleri otomatik olarak aşamalandırır; Bu değişikliklerin geri kalanını birleştirmek ve işiniz bittiğinde endekse eklemek sizin sorumluluğunuzdadır. - Mark E. Haase


Stack Overflow sorusundaki cevaplara göz atın Git'te bir birleştirme işlemini iptal etme, özellikle Charles Bailey'nin cevabı Örneğin, dosyanın farklı sürümlerini problemlerle nasıl görüntüleyeceğinizi gösterir.

# Common base version of the file.
git show :1:some_file.cpp

# 'Ours' version of the file.
git show :2:some_file.cpp

# 'Theirs' version of the file.
git show :3:some_file.cpp

97
2017-10-03 15:15



Ayrıca "git checkout -m" için "-m" seçeneğini işaretleyin - farklı sineklerinizi çalışma alanınıza geri almanızı sağlar - qneill
Bu beni kurtardı. Her dosyaya ayrı ayrı baktığımda her dalda ne yaptığımı hatırlamamı sağladı. Sonra seçim kararını verebilirim. - Rohmer


Birleştirme aynı anda bir dosyada yapıldığında çakışmaları olur. İşte nasıl çözülür.

git CLI

Çakışan duruma geçtiğinizde yapmanız gereken basit adımlar şunlardır:

  1. Aşağıdakilerle çakışan dosyaların listesini not edin: git status (altında Unmerged paths Bölüm).
  2. Her bir dosya için çakışmaları ayrı ayrı aşağıdaki yaklaşımlardan biri ile çözün:

    • Çakışmaları çözmek için GUI kullanın: git mergetool (en kolay yol).

    • Uzak / diğer sürümü kabul etmek için şunu kullanın: git checkout --theirs path/file. Bu, söz konusu dosya için yaptığınız tüm yerel değişiklikleri reddeder.

    • Yerel / sürümümüzü kabul etmek için şunu kullanın: git checkout --ours path/file

      Bununla birlikte, dikkatli olmalısınız, çünkü herhangi bir nedenden ötürü çatışmaların yapıldığı uzaktan değişiklikler.

      İlgili: Git bizim "bizim" ve "onların" kesin anlamı nedir?

    • Çakışan dosyaları manuel olarak düzenleyin ve kod bloğunu ara <<<<</>>>>> Daha sonra ya aşağıdan ya da aşağıdan versiyonu seçin =====. Görmek: Çatışmalar nasıl sunuldu.

    • Yol ve dosya adı çakışmaları çözülebilir git add/git rm.

  3. Son olarak, aşağıdakileri kullanarak taahhüt için hazır dosyaları gözden geçirin: git status.

    Hala dosyalarınız varsa Unmerged pathsÇatışmayı elle çözdünüz, sonra Git'i çözdüğünüzü bildirin: git add path/file.

  4. Tüm çakışmalar başarıyla çözülmüşse, değişiklikleri şu şekilde yapın: git commit -a ve her zamanki gibi uzaktan itin.

Ayrıca bakınız: Birleştirme çakışmasını komut satırından çözümleme GitHub'da

DiffMerge

Başarıyla kullandım DiffMerge Windows, macOS ve Linux / Unix'te dosyaları görsel olarak karşılaştırabilir ve birleştirebilir.

Grafiksel olarak 3 dosya arasındaki değişiklikleri gösterebilir ve otomatik olarak birleştirme (bunu yapmak güvenli olduğunda) ve sonuçtaki dosyanın düzenlenmesi üzerinde tam denetim sağlar.

DiffMerge

Resim kaynağı: DiffMerge (Linux ekran görüntüsü)

Sadece indirin ve repo olarak çalıştırın:

git mergetool -t diffmerge .

Mac os işletim sistemi

MacOS'ta şunları yükleyebilirsiniz:

brew install caskroom/cask/brew-cask
brew cask install diffmerge

Ve muhtemelen (eğer sağlanmamışsa), PATH'nuza yerleştirilmiş aşağıdaki ekstra basit sargıya ihtiyacınız vardır (ör. /usr/bin):

#!/bin/sh
DIFFMERGE_PATH=/Applications/DiffMerge.app
DIFFMERGE_EXE=${DIFFMERGE_PATH}/Contents/MacOS/DiffMerge
exec ${DIFFMERGE_EXE} --nosplash "$@"

Sonra aşağıdaki klavye kısayollarını kullanabilirsiniz:

  • -Alt-yukarı/Aşağı Önceki / sonraki değişikliklere geçmek için.
  • -Alt-Ayrıldı/Sağ soldan veya sağdan değişikliği kabul etmek

Alternatif olarak kullanabilirsiniz opendiff Üçüncü bir dosya veya dizin oluşturmak için iki dosya veya dizini birleştirmenizi sağlayan Xcode Araçları'nın bir parçasıdır.


88
2017-08-05 14:29





Sık sık küçük işler yapıyorsanız, yorum işlemlerine şu adresten bakarak başlayın: git log --merge. Sonra git diff size çatışmaları gösterecek.

Birkaç satırdan daha fazlasını içeren çakışmalar için, harici bir GUI aracında neler olduğunu görmek daha kolaydır. Opendiff'i seviyorum - Git ayrıca vimdiff, gvimdiff, kdiff3, tkdiff, meld, xxdiff'i destekliyor ve kutudan çıkıp başkalarını da yükleyebilirsiniz: git config merge.tool "your.tool" seçtiğiniz aracı ve sonra git mergetool başarısız bir birleşmeden sonra, bağlamdaki farklılıkları gösterecektir.

Bir çakışmayı çözmek için her dosyayı düzenlediğinizde, git add filename dizini günceller ve farkınız artık gösterilmeyecektir. Bütün anlaşmazlıklar ele alındığında ve dosyaları git add-ed, git commit birleştirme işlemini tamamlayacak.


73
2017-10-02 16:11



"Git ekle" yi kullanmak, gerçek hiledir. İşlem yapmak bile istemeyebilirsiniz (belki de saklamak isteyebilirsiniz), ancak birleştirmeyi tamamlamak için "git ekle" yi yapmanız gerekir. Ben mergetool sizin için bir eklenti olduğunu düşünüyorum (manpage içinde olmasa da), ancak el ile birleştirme yaparsanız, tamamlamak için "git eklemeyi" kullanmanız gerekir (bunu yapmak istemiyorsanız bile). - nobar


Görmek Çatışmalar Nasıl Sunuyor veya, Git’te git merge çakışma belirleyicilerinin neleri birleştirdiğini anlamak için belgeler.

Ayrıca Çatışmalar Nasıl Çözülür? bölüm çatışmaların nasıl çözüleceğini açıklar:

Bir çatışma gördükten sonra iki şey yapabilirsiniz:

  • Birleştirmemeye karar verin. İhtiyacınız olan tek temizlik, dizin dosyasını HEAD 2'yi tersine çevirmek ve 2. ve 3. tarafından yapılan çalışma ağacı değişikliklerini temizlemek; git merge --abort Bunun için kullanılabilir.

  • Çatışmaları çöz. Git, çalışan ağaçtaki çatışmaları işaretleyecektir. Dosyaları şekle ve git add onları endekse. kullanım git commit anlaşmayı imzalamak.

Çatışmada bir takım araçlarla çalışabilirsiniz:

  • Bir mergetool kullanın. git mergetool Birleştirme yoluyla çalışacak bir grafiksel mergetool başlatmak için.

  • Farklara bak. git diff iki yönlü değişiklikleri gösteren, üç yönlü bir fark gösterecektir. HEAD ve MERGE_HEAD sürümleri.

  • Her şubeden farklı olanlara bakın. git log --merge -p <path> ilk önce farklılıkları gösterecek HEAD sürüm ve sonra MERGE_HEAD sürümü.

  • Orijinallere bak. git show :1:filename ortak atayı gösterir, git show :2:filename gösterir HEAD sürüm ve git show :3:filename gösterir MERGE_HEAD sürümü.

Birleştirme çakışması işaretleyicilerini ve bunları nasıl çözeceğinizi de okuyabilirsiniz. Pro Git Kitap bölümü Temel Birleştirme Çatışmaları.


43
2017-07-14 18:34





İçin Emacs birleştirme çözmek isteyen kullanıcılar yarı manuel olarak çakışıyor:

git diff --name-status --diff-filter=U

uyuşmazlık çözümü gerektiren tüm dosyaları gösterir.

Bu dosyaların her birini tek tek veya tümünü bir kerede açın:

emacs $(git diff --name-only --diff-filter=U)

Emacs'te düzenleme gerektiren bir arabelleği ziyaret ettiğinizde,

ALT+x vc-resolve-conflicts

Bu üç arabellek (mayın, onların ve çıkış tamponu) açacaktır. 'N' (sonraki bölge), 'p' (prevision region) düğmesine basarak gezinin. Madeni veya onların bölgelerini sırasıyla çıktı arabelleğine kopyalamak için 'a' ve 'b' tuşlarına basın. Ve / veya doğrudan çıktı tamponunu düzenleyin.

Bittiğinde: 'q' tuşuna basın. Emacs, bu arabelleği kaydetmek isteyip istemediğinizi sorar: evet. Bir tampon işaretini bitirdikten sonra teriminalden çalışarak çözülür:

git add FILENAME

Tüm arabellek türüyle bittiğinde

git commit

birleşmeyi bitirmek için.


36
2018-02-22 23:04