Sonunda git dosyasının hangi sürümü kullanılacak: LOCAL, BASE veya REMOTE?


174

Sırasında git mergebir çarpışma olduğunda, Meld adında bir birleştirme aracı açıyorum . Üç dosyayı LOCAL, BASE ve REMOTE açar. LOCAL yerel şubem olduğunu okuduğumdan, BASE ortak atadır ve UZAKTAN birleştirilecek daldır.

Şimdi sorum: nihayet dosyanın hangi sürümü kullanılacak? UZAKTAN MI? Öyleyse, örneğin BASE dalında ne olursa olsun, istediğim gibi düzenleyebilir miyim?

Yanıtlar:


142

Ortada bir tane: BASE.

Aslında, BASEortak atası, ancak çatışmalar ile işaretlenmiştir yarım kalmış birleştirme değildir >>>>ve <<<<.

Dosya düzenleme penceresinin üst kısmında dosya adlarını görebilirsiniz.

Ekran görüntüsüne buradan bakın

meld tabanı

Sen düzenleyebilir BASEile veya zihin birleştirme komutlarını kullanmadan istediğiniz dosyayı.
Ayrıca meld kurtulmak ve sadece favori metin editörü ile dosyayı düzenleyebilirsiniz.

  • <<<< HEADVe =====işaretçileri arasındaki kod , birleştirme işleminden önceki yerel dosyanızdan biridir.
  • Arasındaki kod ====ve >>>> <branch name>uzaktan dosyasının biridir.

3
Bazı kişiler, merge.conflictstyleyapılandırma seçeneği diff3varsayılan olarak ayarlanmışsa otomatik birleştirmede başarısız olan bir dosyadaki çakışan parçaları daha iyi anlarlar merge.
kostix

3
Aslında HEAD'i göremiyorum, <<< ve === şarkı söylüyor. Sağladığınız durumda orta pencere boş olacaktır. Ama bu sadece diğerleri için bir not, cevabınız için teşekkürler.
tsusanka

Eğer görmüyorsanız HEAD, <<<<<ve =====işaretler, hiç ihtilaf bulunmadığını anlamına gelir. Bu durumda, orta pencere boş olmayacak, birleştirme sonucunu gösterecektir, ancak "kırmızı" bir bölüm olmayacaktır
Fabien Quatravaux

10
Ben Meld ile birleştirir yapıyorum, ben herhangi görmüyorum <<<<<<, ======ne de >>>>>>ya orta bölmede belirteçleri (BASE versiyonu yani); ve bazen, aGr'nin bildirdiği gibi orta bölme boş olacaktır. Belki de bu fark farklı ayarlardan kaynaklanmaktadır. Ben Meld aracını başlattığınızda, aşağıdaki dosyalar deposundaki dosyanın adı olduğunu varsayarak var olacaktır X.java: X.java, X.java.orig, X.java.BACKUP.#, X.java.BASE.#, X.java.LOCAL.#, X.java.REMOTE.#, nerede #bazı sayıdır. Birleştirme sonucunu çağırmak BASE sürümü kafa karıştırıcı; MERGED daha iyi olurdu.
Teemu Leisti

3
BASE aslında ortak atadır, MERGED, içinde kısmi birleştirme bilgisi bulunan dosyanın adıdır. Benim soru cevap bakınız oluşturma ve git difftool ve mergetool olarak Meld kullanarak tam olarak nasıl çalıştığını açıklar. HTH.
matt

107

Meld, 4. parametreyi ileterek etkinleştirilen gizli bir 3 yönlü birleştirme özelliğine sahiptir :

meld $LOCAL $BASE $REMOTE $MERGED

Sağ ve sol paneller salt okunur modda açılır, böylece yanlışlıkla yanlış yolu birleştiremezsiniz. Orta bölme birleştirme sonucunu gösterir. Çatışmalar için temel sürümü gösterir, böylece tüm önemli bitleri görebilirsiniz: ortadaki orijinal metin ve her iki tarafta da çelişkili değişiklikler. Son olarak, "Kaydet" düğmesine bastığınızda, $ MERGED dosyası aynen git tarafından beklendiği gibi yazılır.

Kullandığım ~ / .gitconfig dosyası aşağıdaki ayarları içerir:

[merge]
tool = mymeld
conflictstyle = diff3
[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE $MERGED

Bu, 3 sekmeli, birleştirmeye çalıştığım basit farkları içeren 1. ve 2. sekmeyi açar ve varsayılan olarak açık olan 3. sekme 3 yönlü birleştirme görünümünü gösterir.

Şimdi, özelliğin gizlenmesinin nedeni, henüz yeterince parlak olmamasıdır. Şu an olduğu gibi çok faydalı, ancak kaynak yazarı Kai Willadsen, ütülemeye ihtiyaç duyan birkaç kırışıklığa işaret etti. Örneğin, 3 yönlü birleştirme modunu başlatmak için bir GUI yoktur, komut satırı sözdizimi biraz gizlidir ve bu tür. Python konuşuyorsanız ve ellerinizde biraz zaman varsa - ne yapacağınızı biliyorsunuz.

Düzenleme: Meld'in yeni sürümlerinde sinax biraz değişti. Bu yorumlardandı, ancak cevaba aittir.

Meld komutu şimdi --output seçeneğini kullanıyor, bu nedenle yukarıdaki snippet'ten son satır şu şekilde olmalıdır:

cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED

7
@Jesse, @lumbric, meld'in yeni sürümlerinin --output$ MERGED sonucu için bayrağı kullandığı anlaşılıyor. Git sürümümle
Johann

1
@lumbric İnanıyorum ki, Meld 1.7.x + ile --output option. Lansman komut dosyasında bu satıra bakın:"$merge_tool_path" --output "$MERGED" "$LOCAL" "$BASE" "$REMOTE"
Johann

12
Son modelde (sürüm> 1.8.4), - otomatik birleştirme seçeneğini kullanmak zorundayız. cmd = meld --diff $ BASE $ LOCAL --diff $ BASE $ REMOTE --auto-merge $ LOCAL $ BASE $ REMOTE
çıktı

7
Meld 1.8.4 kullanarak @pingpongboss ile aynı problemi yaşadım: Meld, 3. sekmeyi açmak yerine işleri ayrı bir bölmede açıyordu. Komut nihayet çalıştı gayet: cmd = meld $LOCAL $BASE $REMOTE --auto-merge --output $MERGED. Böylece, bu 3 sekme açar (iyi eski yol), otomatik, çakışmayan birleşmeleri ortada birleştirir, burada orta $ MERGED'dir ve çakışma çözümü çıktısı olarak kullanılır.
farmir

2
Çıktı için sözdizimi olabilir --output=<file>veya -o <file>bkz.meld --help
levsa

57

4 dosya var:

  1. $LOCALBirleştirdiğiniz daldaki dosya; size gösterildiğinde birleştirme işlemine dokunulmaz

  2. $REMOTEBirleştirdiğiniz daldaki dosya; size gösterildiğinde birleştirme işlemine dokunulmaz

  3. $BASE$ LOCAL ve $ REMOTE'un ortak atası, yani. iki şubenin dikkate alınan dosyayı yönlendirmeye başladığı nokta; size gösterildiğinde birleştirme işlemine dokunulmaz

  4. $MERGEDKısmen birleştirilmiş dosya, çakışmalarla; bu, birleştirme işleminin dokunduğu tek dosyadır ve aslında size hiç gösterilmezmeld


$MERGEDDosya içeren biridir <<<<<<, >>>>>>, =====(ve belki, ||||||) işaretleri (yani sınırlandırmaktadır çatışmalar). Bu , çakışmaları düzeltmek için manuel olarak düzenlediğiniz dosyadır .

Manuel çakışma düzenleme ve görsel çakışma düzenleme farklı dosyalarda yapılır ve farklı bilgiler sunulur.

Mergetool (varsayalım kullanırken meld), burada görüyoruz dosyalar şunlardır: $LOCAL, $BASE, $REMOTE. $MERGEDDosyayı görmediğinizi unutmayın , ancak bu, melddüzenlemenin sonucunu buraya yazmak için gizli bir parametre olarak iletilir .

Başka bir deyişle, içinde melddosyayı ortada, dosyayı düzenliyorsunuz ve $BASEtüm değişiklikleri soldan veya sağdan manuel olarak seçiyorsunuz . Birleştirme işlemi tarafından dokunulmamış temiz bir dosyadır. Tek aksaklık, kaydettiğinizde, $BASEdosyaya kaydetmezsiniz , ancak dördüncü gizli parametresinde meld, $MERGEDdosyadır (görmediğiniz bile). $BASEDosya yok değil çünkü herhangi bir çatışma veya kısmi başarılı birleştirmeleri ihtiva değil $MERGEDdosya .

Görsel düzenlemede, $BASEdosyayı size sunarken (dosya yerine $MERGED) gittemel olarak birleştirme işlemini gerçekleştirme girişimlerinin tümünü atar (isterseniz bu girişimler $ MERGED dosyasında görünür) ve birleştirmeyi tamamen yapmanızı sağlar sıfırdan .

Sonuç olarak, manuel ve görsel birleştirme çakışmalarında aynı dosyalara bakmıyorsunuz, ancak nihai sonuç aynı dosyaya ( $MERGEDdosyadır) yazılır .

Çatışmaların manuel düzeltme yapılır $MERGEDçünkü git hayır demek var bu yüzden üç dosya (bilgi squashes, size üç dosya sunmak $LOCAL, $BASE, $REMOTEki) $MERGEDdosyası.

Ama görsel araçlar araçlara sahip sana üç dosyaları göstermek için: onlar size göstermek $LOCAL, $BASE, $REMOTEdosyaları. $LOCALVe $REMOTEdosyalarından değişiklikleri seçiyorsunuz ve bunları $BASEdosyaya getiriyorsunuz, dosyayı yeniden birleştirmenin başarısız girişimini tamamen yeniden oluşturuyor ve hatta üzerine yazıyorsunuz $MERGED.


Sadece tüm dosyaları gösterecek araçlar (örneğin karşılaştırmanın ötesinde) olmasını istedim
yoniLavi

@yoniYalovitsky: evet veya p4merge
user1284631

ClearCase paketinden birleştirme aracı kullanıyordum
mishmashru

@yoniLavi - bu araçlar 4 bölme gösterir , ancak bu yanıtta açıklandığı gibi dört dosyanın tümünü göstermez . Özellikle, size göstermek için bu 4-bölmeli araçlar kurabilirsiniz $LOCAL, $REMOTE, $BASEve çıkış başlangıçta için eşit $BASE, fakat farklı olan $MERGEDbu dosyaları ve çatışma işaretleri ve böylece birleştirme için git girişimini yok içinde. Aslında, LOCAL / REMOTE / BASE + OUTPUT'un birleştirilmiş görünmeyen 3 bölmeli yaklaşımına en çok benzeyen bu araçları kullanmanın yolu bu olacaktır. 4. bölme sadece tabanı çıkıştan ayırmanıza izin verir.
BeeOnRope

16

Cosmin'in çözümü çalışıyor, ancak $ BASE dosyası güncellendi - $ MERGED değil . Bu işlem $ MERGED dosyasını güncelleyecektir :

Meld: v1.8.4

[merge]
  conflictstyle = diff3
  tool = mymeld
[mergetool "mymeld"]
  cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE --diff $BASE $LOCAL --diff $BASE $REMOTE

Bunu doğrulayabilirim.Saad'ın çözümü Ubuntu'da benim için çalışıyor. Orijinal soruya gelince, bu geçerli doğru cevaptır.
cosmin

3
cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
Meld

neden --diff $BASE $LOCAL --diff $BASE $REMOTEsonunda ihtiyacın olsun ki? 1.8.4 benim için, bu iyi çalışıyor (görebildiğim kadarıyla):cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
farmir

1
@farmir: Gerekli değil. Birbirine göre BASE'e kıyasla LOCAL ve REMOTE'i görebilmeniz için meld'de iki sekme daha açar.
Sam Kauffman

1
Bu bağımsız değişkenlerle hangi sırayı denediğim önemli değil, üç yönlü sekme her zaman üçüncü sekmedir, ilk sekme ise her zaman varsayılan olarak seçilidir. Üç yollu sekmeyi varsayılan olarak seçmenin bir yolu var mı?
Sam Kauffman

13

Meld 1.7 ile Tomek Bury'nin Çözümü artık çalışmıyor.

Varsayılan ayarlar beni tatmin etmedi:

Varsayılan ayarları

Bunun yerine Meld> = 1.7 için diğer iki çözümden birini öneririm.

İlk çözüm :

 meld $LOCAL $BASE $REMOTE --auto-merge

ilk çözüm

İkinci çözüm :

 meld $LOCAL $MERGED $REMOTE

ikinci çözüm

.gitconfig

.gitconfigYukarıda açıklanan çözümleri almak için bunu kopyalayıp dosyanıza yapıştırın :

[merge]
    tool = meld16
[mergetool "meld17"]
    # use this for Meld >=1.7
    # see http://stackoverflow.com/a/22911793/859591
    # second solution:
    cmd = meld $LOCAL $MERGED $REMOTE
    # first solution:
    #cmd = meld $LOCAL $BASE $REMOTE --auto-merge
[mergetool "meld16"]
    cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED

[include]
    # requires git v1.7.10+
    path = .gitconfig.local

.gitconfig.local.Gitconfig dosyanızı birden çok makinede kullanmanız durumunda, meld17 veya meld16 değerini yalnızca bu makine için ayarlamak üzere bir dosyaya kopyalayıp yapıştırın :

# This is a host specific config file!
# Note that git 1.7.10+ is needed
# http://stackoverflow.com/a/9733277/859591
[merge]
    tool = meld17

Bu Meld 1.8.4 üzerinde çalışmaz. Çalıştırırsanız cmd = meld $LOCAL $BASE $REMOTE --auto-merge, orta bölme, çakışma çözümünün çıktısı olarak kullanılan $ MERGE değil, $ BASE olur.
farmir

1
@farmir İkinci sekme olarak $ BASE'i seçtiniz.
Alex78191

11

Gösterilen varsayılan dosyaların hiçbirinin kaydedilmediğini buldum. zihin birleştirme gösteriyordu $LOCAL, $REMOTEve $BASEvarsayılan olarak. O iş yapmak için, ben zihin birleştirme göstermek için gerekli $MERGEDyerine $BASE. Bunu düzeltmek benim ~/.gitconfigiçin koymak :

[merge]
        tool = mymeld
[mergetool "mymeld"]
        cmd = meld "$LOCAL" "$MERGED" "$REMOTE"

Ben Arch kullanıyorum:

$ git --version
git version 1.8.2
$ meld --version
meld 1.7.1

Affedersiniz, bu yapılandırma inux uyumlu mu?
MadMad666

2

Herhangi bir nedenden ötürü, meld'in en yeni sürümleri çatışmalar için eklenen işaret çizgilerini görüntülemez (<<<<<<<, =======, >>>>>>>). Bu satırları görmek istiyorsanız, meld v 1.3.3 veya önceki sürümünü kurmalısınız.



2

Doğru cevap için lütfen Saad'ın cevabına bakınız.

Ubuntu 1.8 meld ile

--diff'e yanlış sayıda bağımsız değişken sağlandı

ve $ MERGED $ 'ı düzeltmeden önce --output'u ekledim:

[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED
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.