Git difftool ve mergetool olarak Meld'i kurma ve kullanma


256

Bu soru ve yanıttaki bilgilerin çoğu StackOverflow'da mevcut olsa da, birçok sayfaya ve yanlış veya yanıltıcı olan diğer yanıtların yanı sıra yayılmıştır. Bilmek istediğim her şeyi bir araya getirmek biraz zamanımı aldı.

Git difftool ve mergetool olarak kullanılabilecek birçok farklı program var ve hangisinin en iyisi olduğu konusunda kesinlikle bir fikir birliği yoktur (görüşler, gereksinimler ve işletim sistemleri açıkça farklı olacaktır).

Meld, StackOverflow sorusunda gösterildiği gibi popüler bir ücretsiz, açık kaynak ve çapraz platform (UNIX / Linux, OSX, Windows) seçimidir , Git için en iyi görsel birleştirme aracı nedir? Meld'in önerdiği cevabın, herhangi bir araç gibi 3 kattan fazla oyu var.

Aşağıdaki 2 soru aşağıdaki cevabımda cevaplanacaktır:

  • Meld'i git difftool'um olarak nasıl kurabilirim ve kullanabilirim?
  • Meld'i git mergetool'um olarak nasıl kurabilirim ve kullanabilirim?

Not: Hem difftool hem de mergetool ile aynı programı kullanmanız gerekmez, her ikisi için de farklı programlar ayarlanabilir.


Yanıtlar:


423

Meld'i git difftool'um olarak nasıl kurabilirim ve kullanabilirim?

git difftool dif'yi terminalinizdeki diff çıkışını göstermek yerine GUI dif programı (yani Meld) kullanarak görüntüler.

GUI programını komut satırında ayarlayabilmenize rağmen -t <tool> / --tool=<tool>, .gitconfigdosyanızda yapılandırmak daha mantıklıdır . [Not: En alttaki tırnak işaretleri ve Windows yollarıyla ilgili bölümlere bakın.]

# Add the following to your .gitconfig file.
[diff]
    tool = meld
[difftool]
    prompt = false
[difftool "meld"]
    cmd = meld "$LOCAL" "$REMOTE"

[Not: Bu ayarlar, davranışları git diffher zamanki gibi çalışmaya devam edecek olan davranışını değiştirmez .]

Sen kullanmak git difftoolkullanmak tam olarak aynı şekilde git diff. Örneğin

git difftool <COMMIT_HASH> file_name
git difftool <BRANCH_NAME> file_name
git difftool <COMMIT_HASH_1> <COMMIT_HASH_2> file_name

Düzgün yapılandırılmışsa farkın GUI arabirimini kullanarak görüntülendiği bir Meld penceresi açılacaktır.

Meld GUI pencere camlarının sırası sırasına ile kontrol edilebilir $LOCALve $REMOTEde cmdsağ bölmede sol bölmede ve burada gösterilmiş olan dosya demek,. Onları başka bir şekilde istiyorsanız, onları şöyle değiştirin:

    cmd = meld "$REMOTE" "$LOCAL"

Son olarak, prompt = falsesatır git'in Meld'i başlatmak isteyip istemediğinizi sormasını durdurur, varsayılan olarak git bir istem verir.


Meld'i git mergetool'um olarak nasıl kurabilirim ve kullanabilirim?

git mergetool , birleştirme sırasında oluşan birleştirme çakışmalarını çözmek için bir GUI birleştirme programı (örn. Meld) kullanmanızı sağlar.

Difftool gibi GUI programını komut satırında kullanarak ayarlayabilirsiniz, -t <tool> / --tool=<tool>ancak daha önce olduğu gibi, .gitconfigdosyanızda yapılandırmak daha mantıklıdır . [Not: En alttaki tırnak işaretleri ve Windows yollarıyla ilgili bölümlere bakın.]

# Add the following to your .gitconfig file.
[merge]
    tool = meld
[mergetool "meld"]
    # Choose one of these 2 lines (not both!) explained below.
    cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"
    cmd = meld "$LOCAL" "$BASE" "$REMOTE" --output "$MERGED"

git mergetoolGerçek bir birleştirme gerçekleştirmek için KULLANMAYIN . Kullanmadan önce git mergetoolgit ile her zamanki gibi birleştirme gerçekleştirirsiniz. Örneğin

git checkout master
git merge branch_name

Bir birleştirme çakışması varsa git şöyle bir şey görüntüler:

$ git merge branch_name
Auto-merging file_name
CONFLICT (content): Merge conflict in file_name
Automatic merge failed; fix conflicts and then commit the result.

Bu noktada file_name, birleştirme çakışması bilgileriyle kısmen birleştirilmiş dosyayı içerecektir (içindeki tüm >>>>>>>ve <<<<<<<girişlerinin bulunduğu dosyadır ).

Mergetool artık birleştirme çakışmalarını çözmek için kullanılabilir. Çok kolay başlıyorsunuz:

git mergetool

Düzgün yapılandırılırsa, bir Meld penceresi açılarak 3 dosya görüntülenir. Her dosya, GUI arayüzünün ayrı bir bölmesinde bulunacaktır.

.gitconfigYukarıdaki örnek girişte, satır olarak 2 satır önerilir [mergetool "meld"] cmd. Aslında, gelişmiş kullanıcıların cmdsatırı yapılandırması için her türlü yol vardır , ancak bu, bu cevabın kapsamı dışındadır.

Bu cevap cmd, aralarında çoğu kullanıcıya hitap edecek 2 alternatif çizgiye sahiptir ve aracı bir sonraki karmaşıklık seviyesine taşımak isteyen ileri düzey kullanıcılar için iyi bir başlangıç ​​noktası olacaktır.

İlk olarak parametrelerin anlamı şudur:

  • $LOCAL geçerli daldaki dosyadır (örn. ana).
  • $REMOTE , birleştirilen daldaki dosyadır (örneğin, şube_adı).
  • $MERGED içinde birleştirme çakışması bilgileri bulunan kısmen birleştirilmiş dosyadır.
  • $BASEpaylaşılan taahhüt atasıdır $LOCALve $REMOTEbu, dosyayı içeren dalın $REMOTEorijinal olarak oluşturulduğu haliyle olduğu anlamına gelir .

Bunlardan birini kullanmanızı öneririm:

[mergetool "meld"]
    cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"

veya:

[mergetool "meld"]
    cmd = meld "$LOCAL" "$BASE" "$REMOTE" --output "$MERGED"
    # See 'Note On Output File' which explains --output "$MERGED".

Seçim kullanımına olup olmadığıdır $MERGEDveya $BASEaradaki $LOCALve $REMOTE.

Her iki durumda da Meld 3 bölmeleri gösterir $LOCALve $REMOTEsol ve sağ bölmelerinde ve ya $MERGEDveya $BASEorta bölmede.

Her iki durumda da orta bölme, birleştirme çakışmalarını çözmek için düzenlemeniz gereken dosyadır. Aradaki fark, hangi başlangıç ​​düzenleme pozisyonunu tercih edeceğinizdir; $MERGEDBirleştirme çatışma bilgilerle veya kısmen birleştirilmiş dosyayı içeren dosya için $BASEpaylaşılan atası taahhüt için $LOCALve $REMOTE. [Her iki cmdsatır da faydalı olabileceğinden ikisini de dosyamda .gitconfigsaklıyorum. Çoğu zaman $MERGEDçizgiyi kullanıyorum ve çizgi $BASEyorumlanıyor, ancak $BASEsatırı kullanmak istersem yorum yapma değiştirilebiliyor .]

Çıktı Dosyası Not: Do not endişe --output "$MERGED"kullanılan cmdbakılmaksızın olmadığı $MERGEDveya $BASEdaha önce kullanılmıştır cmdhattı. Bu --outputseçenek, Meld'e hangi dosya adı git'in çakışma çözümleme dosyasının kaydedilmesini istediğini söyler. Meld, kullandığınız $MERGEDveya $BASEbaşlangıçtaki düzenleme noktanızdan bağımsız olarak bu dosyadaki çakışma düzenlemelerinizi kaydeder .

Birleştirme çakışmalarını gidermek için orta bölmeyi düzenledikten sonra dosyayı kaydedin ve Meld penceresini kapatın. Git güncellemeyi otomatik olarak yapar ve geçerli daldaki (örn. Ana dosya) dosya artık orta bölmede bulduğunuz her şeyi içerecektir.

git .orig, orijinal dosya adına ekleyerek içindeki birleştirme çakışması bilgileriyle kısmen birleştirilmiş dosyanın yedeğini almış olacaktır . örn file_name.orig. Birleştirme işleminden memnun olup olmadığınızı ve yapmak isteyebileceğiniz tüm testleri gerçekleştirdikten sonra .origdosya silinebilir.

Bu noktada, artık değişiklikleri taahhüt etme taahhüdünde bulunabilirsiniz.

Meld'deki birleştirme çakışmalarını düzenlerken, Meld kullanımını bırakmak ve orta bölmede birleştirme çözünürlüğü dosyasını kaydetmeden Meld'den çıkın. git iletiyi yanıtlar file_name seems unchangedve sonra Was the merge successful? [y/n]yanıtlarsanız n, birleştirme çakışması çözümlemesi iptal edilir ve dosya değişmeden kalır. Dosyayı herhangi bir noktada Meld'e kaydettiyseniz, git'ten uyarı ve istem almazsınız. [Tabii ki sadece dosyayı silebilir ve .origgit sizin için yapılmış yedekleme dosyası ile değiştirebilirsiniz .]

Birleştirme çakışmalarına sahip birden fazla dosyanız varsa git, hepsi bitene kadar her biri için birbiri ardına yeni bir Meld penceresi açar. Hepsi aynı anda açılmayacak, ancak çakışmaları bir arada düzenlemeyi bitirip Meld'i kapattığınızda, git bir sonrakini açar ve tüm birleştirme çakışmaları çözülene kadar devam eder.

Canlı bir projede kullanmadan git mergetoolönce kullanımını test etmek için kukla bir proje oluşturmak mantıklı olacaktır . İşletim sisteminizin satırdaki tırnak işaretlerinden kaçmanızı gerektirmesi durumunda testinizde boşluk içeren bir dosya adı kullandığınızdan emin olun , aşağıya bakın.cmd


Alıntı karakterlerden kaçış

Bazı işletim sistemlerinin tırnak işaretleri arasında yer alması gerekebilir cmd. Daha az deneyimli kullanıcılar, yapılandırma komut satırlarının boşluk içeren dosya adlarıyla sınanması gerektiğini ve cmdsatırlar boşluk içeren dosya adlarıyla çalışmazsa, tırnak işaretlerinden kaçmayı deneyin. Örneğin

cmd = meld \"$LOCAL\" \"$REMOTE\"

Bazı durumlarda daha karmaşık alıntılardan kaçış gerekebilir. Aşağıdaki Windows yolu bağlantılarından 1'i, her alıntıdan üç kez kaçmanın bir örneğini içerir. Bir delik ama bazen gerekli. Örneğin

cmd = meld \\\"$LOCAL\\\" \\\"$REMOTE\\\"

Windows yolları

Windows kullanıcılarının muhtemelen Meld cmdhatlarına ek yapılandırma eklemesi gerekecektir . meldcKomut satırından Windows'ta çağrılacak şekilde tasarlanmış tam yolunu kullanmaları gerekebilir veya bir sarıcı kullanmak isteyebilir veya kullanmak isteyebilirler. Aşağıda , Windows için doğru Meld satırını ayarlamakla ilgili olan StackOverflow sayfalarını okumalıdırlar cmd. Linux kullanıcısı olduğum için, çeşitli Windows cmdsatırlarını test edemiyorum ve konu hakkında Meld'e tam bir yol meldceklenerek veya Meld program klasörünü eklemenizi tavsiye etmekten başka daha fazla bilgim yok path.

Meld ile sondaki boşlukları yok saymak

Meld, GUI'de yapılandırılabilecek bir dizi tercihe sahiptir.

Tercihler Text Filterssekmesinde, bir fark gerçekleştirirken yorumlar gibi şeyleri yok saymak için birkaç yararlı filtre vardır. Yoksayılacak filtreler olmasına rağmen All whitespaceve Leading whitespaceyoksay Trailing whitespacefiltresi yok (bu, Meld posta listesine ek olarak önerildi, ancak sürümümde mevcut değil).

Sondaki boşlukları yok saymak, özellikle işbirliği yaparken genellikle çok kullanışlıdır ve Meld tercihleri Text Filterssekmesindeki basit bir normal ifadeyle kolayca eklenebilir .

# Use either of these regexes depending on how comprehensive you want it to be.
[ \t]*$
[ \t\r\f\v]*$

Umarım bu herkese yardımcı olur.


2
Teşekkürler, kullanımı çok daha kolay olduğunu [mergetool "meld"] cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"yılında ~/.gitconfig, o zaman sadece orta tavada kırmızı vurgulanan çatışmaları çözmek ve tasarruf edin! Varsayılan ayar olmalıdır.
KrisWebDev

1
$LOCAL $MERGED $REMOTEÇoğu zaman kullandığım ayardır, çözmek için sadece birkaç çakışma olduğunda mükemmeldir ve benim varsayılanımdır. $LOCAL $BASE $REMOTEgerçekten yapılacak çok şey olduğunda kendi başına gelir ve tam olarak hangi kod bölümlerinin hangi dosyadan geldiğini bilirsiniz; paylaşılan taahhüt atası büyük bir dağınıklıktan bağımsız bir başlangıç ​​noktası olabilir, bazen vurgulama çatışması aslında yoluna girer ve daha temiz bir üs bir nimettir.
Matt

4
Not: OSX üzerindeyseniz ve homebrew üzerinden meld yüklüyseniz, çıkış parametresi aşağıdakine =benzer:cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output="$MERGED"
Alteisen


3
Git Configuration - git mergetool'daki açıklamadan çok daha iyi . Özellikle $ MERGED ve $ BASE arasındaki farkı açıkladığınız için çok teşekkür ederiz. Beni delirmekten kurtardı!
ChrisG

81

Diğer cevap doğru olsa da, işte Meld'i görsel fark aracınız olarak yapılandırmanın en hızlı yolu. Sadece kopyala / yapıştır:

git config --global diff.tool meld
git config --global difftool.prompt false

Şimdi git difftoolbir dizinde çalıştırın ve Meld her farklı dosya için başlatılacak.

Yan not: Meld, CSV dosyalarını karşılaştırma konusunda şaşırtıcı derecede yavaş ve bulduğum hiçbir Linux fark aracı, Karşılaştır It adlı bu Windows aracından daha hızlı değil ! (en son 2010 yılında güncellenmiştir).


13
Muhtemelen git config --global difftool.meld.cmd 'meld "$LOCAL" "$REMOTE"'orada da bir çizgi istiyorsun . Bu "varsayılan", ancak bir yapılandırmak yakında kadar mergetool, difftoolfark yapılandırma bulunmazsa, varsayılan olarak mergetool yapılandırmayı kullanarak başlayacaktır. Birleştirme genellikle 3 yollu birleştirme için üç dosyayı geçirecek şekilde yapılandırıldığından, meld fark pencerenizde aniden anlamsız bir şekilde üç bölme olur.
BeeOnRope

$ Git config -l
agfe2

56

Windows için . Git Bash'de şu komutları çalıştırın:

git config --global diff.tool meld
git config --global difftool.meld.path "C:\Program Files (x86)\Meld\Meld.exe"
git config --global difftool.prompt false

git config --global merge.tool meld
git config --global mergetool.meld.path "C:\Program Files (x86)\Meld\Meld.exe"
git config --global mergetool.prompt false

(Sizinkinden farklıysa Meld.exe dosya yolunu güncelleyin.)

Linux için . Git Bash'de şu komutları çalıştırın:

git config --global diff.tool meld
git config --global difftool.meld.path "/usr/bin/meld"
git config --global difftool.prompt false

git config --global merge.tool meld
git config --global mergetool.meld.path "/usr/bin/meld"
git config --global mergetool.prompt false

Bu komutu kullanarak Meld'in yolunu doğrulayabilirsiniz:

which meld

1
Git difftool'u çalıştırdığımda bir hata aldım "diff aracı meld 'D: \ software \ melddiff \ Meld.exe' olarak kullanılamıyor"
Allen Vork

@AllenVork: Meld.exe dosyasının belirttiğiniz klasörde olduğunu doğruladınız mı? Git'in dışında başarıyla çalıştırabilir misiniz? Git çalıştırdığınızda ne döndürür git config --global --get-regex diff*?
MarredCheese

Çözdüm. Bunu "D: /software/melddiff/Meld.exe" olarak değiştiriyorum ve çalışıyor. .Gitconfig'in biçimi ubuntu değil windows.
Allen Vork

Olması gerekmez: git config --global difftool.meld.path "C:\Program Files (x86)\Meld\Meld.exe"?
Jonathan Rosenne

@AllenVork, cygwin için git kullanıyor musunuz?
Adrian

25

Ben meld ayrı bir komut olarak kurulum tercih, şöyle:

git config --global alias.meld '!git difftool -t meld --dir-diff'

Bu, git-meld.pl komut dosyasına benzer yapar: https://github.com/wmanley/git-meld

Sonra sadece koşabilirsin

git meld

Cygwin'le çalışmayı başardım ve şimdi kırıldı. Bu sorunu düzeltti. Teşekkürler! (Ben --dir-diffkişisel tercihi olarak bölümü kaldırdı rağmen .)
PfunnyGuy

3

Windows 10 için bunu .gitconfig dosyama koymak zorunda kaldım:

[merge]
  tool = meld
[mergetool "meld"]
  cmd = 'C:/Program Files (x86)/Meld/Meld.exe' $LOCAL $BASE $REMOTE --output=$MERGED
[mergetool]
  prompt = false

Bilmeniz gereken her şey bu süperde yazılıyor cevapta yukarıda mattst .

Not: Nedense, bu sadece Meld 3.18.x ile çalıştı, Meld 3.20.x bana bir hata veriyor.


1

Bu, diff aracının yol sözdizimi diğer platformlardan farklı olduğu için öncelikle Windows kullanan geliştiricileri hedefleyen bir yanıttır.

Git mergetool olarak Kdiff3 kullanıyorum, ancak git difftool'u Meld olarak ayarlamak için ilk önce Meldmerge.org'dan Meld'in en son sürümünü yükledim ve aşağıdakileri kullanarak global .gitconfig'ime şunları ekledim:

git config --global -e

Ana ditor olarak varsayılan Vim yerine Sublime Text 3 olmasını istiyorsanız, bunu .gitconfig dosyasına ekleyebilirsiniz:

[core]
editor = 'c:/Program Files/Sublime Text 3/sublime_text.exe'

Sonra diftool olarak inn Meld ekleyin

[diff]
tool = meld
guitool = meld 

[difftool "meld"]
cmd = \"C:/Program Files (x86)/Meld/Meld.exe\" \"$LOCAL\" \"$REMOTE\" --label \"DIFF 
(ORIGINAL MY)\"
prompt = false
path = C:\\Program Files (x86)\\Meld\\Meld.exe

Yukarıdaki cmd'de önde gelen eğik çizgiye dikkat edin, Windows'ta gereklidir.

Mevcut git farkını bir --dir-diff ile göstermek için bir takma ad ayarlamak da mümkündür seçeneğiyle . Bu, Meld içindeki değiştirilmiş dosyaları listeleyecektir, bu da birden fazla dosyayı değiştirdiğinizde kullanışlıdır (gerçekten çok yaygın bir senaryo).

Takma ad, [takma ad] bölümünün altındaki .gitconfig dosyasının içinde şöyle görünür :

showchanges = difftool --dir-diff

Ben kodda yaptığım değişiklikleri göstermek için sadece aşağıdaki komutu girin:

git showchanges

Aşağıdaki resim bu --dir-diff seçeneğinin değiştirilmiş dosyaların bir listesini nasıl gösterebileceğini göstermektedir (örnek): $ LOCAL ve $ REMOTE arasında değişiklik gösteren dosyaların listesini gösteren Meld

Daha sonra her bir dosyaya tıklayıp Meld içindeki değişiklikleri göstermek mümkündür.


0

Kafanızdaki bir farkı farklı bölümlerden $ MERGED olarak hesaplamak ve uygulamak karmaşık olabilir. Kurulumumda, meld size bu farkları görsel olarak göstererek yardımcı olur:

[merge]
    tool = mymeld
    conflictstyle = diff3

[mergetool "mymeld"]
    cmd = meld --diff $BASE $REMOTE --diff $REMOTE $LOCAL --diff $LOCAL $MERGED

Garip görünüyor, ancak üç sekme kullanarak çok uygun bir iş akışı sunuyor:

  1. sekme 1'de birleştirme çakışmasını çözmek için sekme 2'de yapmanız gereken değişikliği (soldan sağa) görürsünüz.

  2. 2. sekmenin sağ tarafında "yapmanız gereken değişikliği" uygular ve dosya içeriğinin tamamını panoya kopyalarsınız (ctrl-a ve ctrl-c kullanarak).

  3. sekme 3'te sağ tarafı pano içeriğiyle değiştirin. Her şey doğruysa, şimdi - soldan sağa - sekme 1'de gösterilenle aynı değişikliği göreceksiniz (ancak farklı bağlamlarda). Bu sekmede yapılan değişiklikleri kaydedin.

Notlar:

  • sekmedeki hiçbir şeyi düzenleme
  • sekme 2'de hiçbir şey kaydetmeyin, çünkü bu sekme 3'te can sıkıcı pop-up'lar oluşturur

Bu, tek bir sekmedeki 3 yollu birleştirmeden (yerel / temel / uzak) daha iyi mi?
André Werlang

@ AndréWerlang Tek bir sekmedeki 3 yönlü birleştirmenin avantajı, yalnızca çakışan değişikliklerle uğraşmanız gerektiğidir (diğer değişiklikler otomatik olarak birleştirilir). Ancak, 3 yönlü birleşmede neyin değiştiğini ve tüm değişiklikleri koruyacak şekilde nasıl birleştirileceğini anlamanın zor olduğu durumlarda "benim" yaklaşımımı tercih ediyorum. Bir noktada 3-yollu birleştirme artık beni şaşırtmıyorsa, o zaman ona geri dönebilirim.
mnieber

Kullanıcının belirttiği gibi, birleştirme işlemine başlamak $BASEyerine kullanabilirsiniz$MERGED
André Werlang
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.