Windows'ta Git: Birleştirme aracını nasıl kurarsınız?


347

Cygwin'de msysGit ve Git'i denedim. Her ikisi de kendi içinde gayet iyi çalışıyor ve her ikisi de gitk ve git-gui'yi mükemmel şekilde çalıştırıyor.

Şimdi bir birleştirme aracını nasıl yapılandırırım? (Vimdiff Cygwin üzerinde çalışıyor, ancak tercihen Windows seven bazı iş arkadaşları için biraz daha kullanıcı dostu bir şey istiyorum.)



4
Git Extensions, oldukça iyi ve Windows kullanıcı dostu bir birleştirme aracına sahip bir git kullanıcı arabirimine sahiptir.
KallDrexx

TortoiseGit'e ihtiyacınız var gibi görünüyor?
Sergei

Yanıtlar:


305

Charles Bailey'nin cevabını takip etmek için, p4merge (ücretsiz çapraz platform 3 yollu birleştirme aracı) kullanan git kurulumum ; msys Git (Windows) yüklemesinde test edildi:

git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"'

veya bir windows cmd.exe kabuğundan, ikinci satır şöyle olur:

git config --global mergetool.p4merge.cmd "p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\""

Değişiklikler (Charles Bailey'e göre):

  • global git config'e eklendi, yani sadece geçerli olanı değil tüm git projeleri için geçerlidir
  • özel araç yapılandırma değeri "birleştirme. [araç] .cmd" değil, "birleştirme aracı. [araç] .cmd" 'de bulunur (aptalca, git var olmayan araç hakkında şikayet etmeye neden bir saat sorun giderme yaptı)
  • boşlukları olan dosyaların birleştirme aracı tarafından hala bulunabilmesi için tüm dosya adları için çift tırnak ekledi (Bunu Powershell'den msys Git'te test ettim)
  • Perforce'ın kuruluş dizinini varsayılan olarak PATH'a ekleyeceğini unutmayın, bu nedenle komutta p4merge için tam yol belirtmeye gerek yoktur

İndir: http://www.perforce.com/product/components/perforce-visual-merge-and-diff-tools


EDIT (Şub 2014)

Tarafından sivri dışarı olarak @Gregory Pakosz , son msys git'e "doğal" destekler artık p4merge (üzerinde test 1.8.5.2.msysgit.0 ).

Aşağıdaki araçları çalıştırarak desteklenen araçların listesini görüntüleyebilirsiniz:

git mergetool --tool-help

Görmeliydin p4merge birinde mevcut veya geçerli listeye. Değilse, lütfen git'inizi güncelleyin.

Eğer p4merge olarak yer aldı kullanılabilir , bu ise PATH ve sadece set zorunda merge.tool :

git config --global merge.tool p4merge

Geçerli olarak listelenmişse , merge.tool'a ek olarak mergetool.p4merge.path tanımlamanız gerekir :

git config --global mergetool.p4merge.path c:/Users/my-login/AppData/Local/Perforce/p4merge.exe
  • Yukarıdaki, sistem genelinde değil, geçerli kullanıcı için p4merge yüklendiğinde örnek bir yoldur (yönetici haklarına veya UAC yükseltmesine gerek yoktur)
  • Her ne ~kadar mevcut kullanıcının ana dizinine genişlemesine rağmen (teoride yol olmalı ~/AppData/Local/Perforce/p4merge.exe), bu benim için işe yaramadı
  • Daha da iyisi bir ortam değişkeninden yararlanmak (örneğin $LOCALAPPDATA/Perforce/p4merge.exe), git yollar için ortam değişkenlerini genişletiyor gibi görünmüyor (eğer bunu nasıl çalıştıracağınızı biliyorsanız, lütfen bana bu cevabı bildirin veya güncelleyin)

Hmm - bunu denemek - ilk yapılandırma iyi çalışıyor, bir sonraki sadece git config için yardım metnini görüntüler. Emin değilim neden.
Danny Staple

1
Anladım - bu tek alıntılar bana şüpheli görünüyor. Sadece ikiye katlayın ve işe yarıyorlar.
Danny Staple

13
mergetool.p4merge.cmdGit p4merge özelliğini desteklemeye çalıştığından ayar artık çalışmaz, bkz libexec/git-core/git-mergetool--lib. bunun yerine doğrudan kullanırmergetool.p4merge.path
Gregory Pakosz

5
Tam yolu koymak ve çift tırnak kaçmak zorunda kaldı:cmd = \""c:/Program Files/TortoiseSVN/bin/TortoiseMerge.exe"\" -base:"$BASE" -theirs:"$REMOTE" -mine:"$LOCAL" -merged:"$MERGED"
Ludovic Kuty

21
Bu benim için yaptı: git config --global mergetool.p4merge.cmd '"C:\\Program Files\\Perforce\\p4merge" $BASE $LOCAL $REMOTE $MERGED'Windows 7 makinesinde
Dan P.

88

Git p4merge'yi desteklemeye çalıştığından mergetool.p4merge.cmd ayarı artık çalışmaz, bkz. libexec / git-core / git-mergetool--lib.so, git için sadece birleştirme yolunu belirtmemiz gerekir, örneğin p4merge:

git config --global mergetool.p4merge.path 'C:\Program Files\Perforce\p4merge.exe'
git config --global merge.tool p4merge

Sonra işe yarayacak.


1
Beyond Compare 3 ile de çalışır. Bunun yerine BComp.exe yolunu kullanın. Teşekkürler!
Richard Anthony Hein

4
Bunun eski bir iş parçacığı olduğunu anlıyorum, ama bu yolu işe alamıyorum. Ben cmd / msys etkileşimi göz önüne alındığında yol kaçması gerekiyordu hakkında biraz karışık ... EDIT Çift tırnak geçiş düzeltildi!
Rustavore

Teşekkürler Gitninja! Bunu Git Bash'e yazabileceğinizi unutmayın, ancak Komut İstemi komutunu kullanırsanız, tek tırnak
işaretini

61

WinXP üzerinde Taşınabilir Git kullanıyorum (bir tedavi çalışıyor!) Ve dallanmada ortaya çıkan bir çatışmayı çözmek için gerekli. Kontrol ettiğim tüm gui'lerden KDiff3 , en şeffaf kullanım olduğunu kanıtladı.

Ancak, bu blog yayınında Windows'ta çalışmasını sağlamak için gerekli talimatları buldum, burada listelenen diğer yaklaşımlardan biraz farklı talimatlar. Temelde bu satırları dosyama eklemek oldu .gitconfig:

[merge]
    tool = kdiff3

[mergetool "kdiff3"]
    path = C:/YourPathToBinaryHere/KDiff3/kdiff3.exe
    keepBackup = false
    trustExitCode = false

Şimdi güzel çalışıyor!


13
Win7 bilgisayarımda kullanmak zorunda kaldım path = C:\\Program Files (x86)\\KDiff3\\kdiff3.exe(çift sırt eğik çizgilerini fark ettim )
Birisi

Bunun gibi bir hata aldım "diff aracı meld 'D: \ yazılım \ melddiff \ Meld.exe' olarak kullanılamaz"
Allen Vork

Her bölümün eklendiği sıra ile bir fark olup olmadığını biliyor musunuz? Yani, [mergeto] [mergetool] 'dan sonra olursa?
Samuel

20

Cygwin'e göre, benim için çalışan tek şey şudur:

git config --global merge.tool myp4merge
git config --global mergetool.myp4merge.cmd 'p4merge.exe "$(cygpath -wla $BASE)" "$(cygpath -wla $LOCAL)" "$(cygpath -wla $REMOTE)" "$(cygpath -wla $MERGED)"'
git config --global diff.tool myp4diff
git config --global difftool.myp4diff.cmd 'p4merge.exe "$(cygpath -wla $LOCAL)" "$(cygpath -wla $REMOTE)"'

Ayrıca, difftool için bilgi istemini kapatmak istiyorum:

git config --global difftool.prompt false

16

git mergetool tamamen yapılandırılabilir, böylece favori aracınızı hemen hemen seçebilirsiniz.

Belgelerin tamamı burada: http://www.kernel.org/pub/software/scm/git/docs/git-mergetool.html

Kısacası, kullanıcı yapılandırma değişkenini ayarlayarak varsayılan bir birleştirme aracı ayarlayabilirsiniz merge.tool.

Birleştirme aracı, yerel olarak desteklenenlerden biriyse, aracın mergetool.<tool>.pathtam yolunu ayarlamanız gerekir ( <tool>yapılandırmak merge.tooliçin yapılandırdığınızla değiştirin).

Aksi takdirde, mergetool.<tool>.cmdkabuk değişkenleri $BASE, $LOCAL, $REMOTE, $MERGEDuygun dosyalara ayarlanmış olarak çalışma zamanında değerlendirilmek üzere bir kabuk kabuğuna ayarlayabilirsiniz. Doğrudan bir config dosyasını düzenliyor veya değişkeni git configkomutla ayarlıyor olsanız kaçış konusunda biraz dikkatli olmalısınız .

Böyle bir şey yapabileceklerinizin lezzetini vermelidir ('mymerge' kurgusal bir araçtır).

git config merge.tool mymerge
git config merge.mymerge.cmd 'mymerge.exe --base "$BASE" "$LOCAL" "$REMOTE" -o "$MERGED"'

En sevdiğiniz birleştirme aracını git mergetoolayarladıktan sonra, çözülmesi gereken çakışmalarınız olduğunda bu sadece bir çalışma sorunudur .

Perforce'nin p4merge aracı oldukça iyi bir bağımsız birleştirme aracıdır.


8

Windows 7'de karşılaştırmak için

git config --global merge.tool bc3
git config --global mergetool.bc3.path "C:\Program Files (x86)\Beyond Compare 3\BCompare.exe"

2
Bu komutları kullandım, ancak Beyond Compare yerine WinMerge kullanıyorum.
Brent Keller

6

Yeni git sürümleri doğrudan p4merge'yi destekliyor gibi görünüyor, bu yüzden

git config --global merge.tool p4merge

p4merge.exe yolunuzda ise, ihtiyacınız olan her şey olmalıdır. Cmd veya yol ayarlamanıza gerek yoktur.


Bu anahtar. P4merge'i yükledikten ve mergetool.p4merge.path dosyasını tam olarak ayarladıktan sonra, yine de çalışmadı. Yükleme klasörünü yola eklemek işe yaradı.
RichardM

5

Daha önce burada (ve burada ve burada ) yanıtlandığı gibi , mergetool bunu yapılandırma komutudur. Güzel bir grafik ön uç için kdiff3 (GPL) öneririm .


4

Neden emin değilim, windows 7 msysGit kullanarak ekstra tırnak bırakmak zorunda kaldı.

git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge $BASE $LOCAL $REMOTE $MERGED'

3

Bunu cygwin üzerinden yapıyorsanız, cygpath kullanmanız gerekebilir:

git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge `cygpath -w $BASE` `cygpath -w $LOCAL` `cygpath -w $REMOTE` `cygpath -w $MERGED`'

3

Bah, bu sonunda benim için çalıştı (Windows 7 + Cygwin + TortoiseMerge):

.Git / config içinde:

cmd = TortoiseMerge.exe /base:$(cygpath -d \"$BASE\") /theirs:$(cygpath -d \"$REMOTE\") /mine:$(cygpath -d \"$LOCAL\") /merged:$(cygpath -d \"$MERGED\")

İpucu cygpath kullanmak için önceki posterler için teşekkürler!


3

kendi kılavuzlarından ( http://manual.winmerge.org/CommandLine.html ) WinMerge ( http://winmerge.org/ ) bilgisi adlı bir uygulama kullanıyorum

Bu mergetooldirektif üzerinden kullandığım bash betiği.gitconfig

#!/bin/sh
# using winmerge with git
# replaces unix style null files with a newly created empty windows temp file

file1=$1
if [ "$file1" == '/dev/null' ] || [ "$file1" == '\\.\nul' ] || [ ! -e "$file1" ]
    then 
       file1="/tmp/gitnull"
       `echo "">$file1`
fi
file2=$2
if [ "$file2" == '/dev/null' ] || [ "$file2" == '\\.\nul' ] || [ ! -e "$file2" ]
    then 
       file2="/tmp/gitnull"
       `echo "">$file2`
fi
echo diff : $1 -- $2
"C:\Program files (x86)\WinMerge\WinMergeU.exe" -e -ub -dl "Base" -dr "Mine" "$file1" "$file2"

temelde bash, boş bir dosyadaki farkın sonucunu hesaplar ve doğru yerde yeni bir geçici dosya oluşturur.


3

Github Windows'ta " SourceGear DiffMerge " yi difftool ve mergetool olarak yapılandırmanın iki yolunu buldum .

Komut İstemi penceresindeki aşağıdaki komutlar, GIT DiffMerge kullanımını kullanacak şekilde yapılandırmak için .gitconfig dosyanızı güncelleştirir:

git config --global diff.tool diffmerge
git config --global difftool.diffmerge.cmd 'C:/Program\ Files/SourceGear/Common/DiffMerge/sgdm.exe  \"$LOCAL\" \"$REMOTE\"'

git config --global merge.tool diffmerge
git config --global mergetool.diffmerge.cmd  'C:/Program\ Files/SourceGear/Common/DiffMerge/sgdm.exe  -merge  -result=\"$MERGED\" \"$LOCAL\" \"$BASE\" \"$REMOTE\"'

[ VEYA ]

Aşağıdaki satırları .gitconfig dosyanıza ekleyin. Bu dosya C: \ Users \ KullanıcıAdı'nda ana dizininizde olmalıdır:

[diff]
    tool = diffmerge
[difftool "diffmerge"]
    cmd = C:/Program\\ Files/SourceGear/Common/DiffMerge/sgdm.exe \"$LOCAL\" \"$REMOTE\"

[merge]
    tool = diffmerge
[mergetool "diffmerge"]
    trustExitCode = true
    cmd = C:/Program\\ Files/SourceGear/Common/DiffMerge/sgdm.exe -merge -result=\"$MERGED\" \"$LOCAL\" \"$BASE\" \"$REMOTE\"

1

Bu seçenekleri de eklemek isteyebilirsiniz:

git config --global merge.tool p4mergetool
git config --global mergetool.p4merge.cmd 'p4merge $BASE $LOCAL $REMOTE $MERGED'
git config --global mergetool.p4mergetool.trustExitCode false
git config --global mergetool.keepBackup false

Ayrıca, nedenini bilmiyorum ama Milan Gardian'ın cevabındaki alıntı ve eğiklik işleri benim için mahvetti.


1

Herkes TortoiseGit üzerinde diff aracı olarak gvim kullanmak istiyorsa, o zaman harici fark aracına giden yol için metin girişine girmeniz gerekir:

path\to\gvim.exe -f -d -c "wincmd R" -c "wincmd R" -c "wincmd h" -c "wincmd J"

1

IntelliJ IDEA (Topluluk Sürümü) için Windows ortamında 3 yönlü git mergetool yapılandırması ( ~/.gitconfig)

Cygwin

[mergetool "ideamerge"]
     cmd = C:/Program\\ Files\\ \\(x86\\)/JetBrains/IntelliJ\\ IDEA\\ Community\\ Edition\\ 14.1.3/bin/idea.exe merge `cygpath -wa $LOCAL` `cygpath -wa $REMOTE` `cygpath -wa $BASE` `cygpath -wa $MERGED`
[merge]
     tool = ideamerge

msys

[mergetool "ideamerge"]
cmd = "/c/Program\\ Files\\ \\(x86\\)/JetBrains/IntelliJ\\ IDEA\\ Community\\ Edition\\ 14.1.3/bin/idea.exe" merge `~/winpath.sh $LOCAL` `~/winpath.sh $REMOTE` `~/winpath.sh $BASE` `~/winpath.sh $MERGED`
[merge]
 tool = ideamerge

~ / Winpath.sh, yolları msys üzerinde Windows'a dönüştürmektir ve stackoverflow'taki msys yolu dönüştürme sorusundan alınır

#! /bin/sh                                                               

function wpath {                                                         
    if [ -z "$1" ]; then                                                 
        echo "$@"                                                        
    else                                                                 
        if [ -f "$1" ]; then                                             
            local dir=$(dirname "$1")                                    
            local fn=$(basename "$1")                                    
            echo "$(cd "$dir"; echo "$(pwd -W)/$fn")" | sed 's|/|\\|g';  
        else                                                             
            if [ -d "$1" ]; then                                         
                echo "$(cd "$1"; pwd -W)" | sed 's|/|\\|g';              
            else                                                         
                echo "$1" | sed 's|^/\(.\)/|\1:\\|g; s|/|\\|g';          
            fi                                                           
        fi                                                               
    fi                                                                   
}                                                                        

wpath "$@" 


0

SourceTree'den p4merge açarken sorun yaşıyorsanız, MyRepo.git altında config adlı yerel yapılandırma dosyasını arayın ve herhangi bir birleştirme yapılandırmasını silin. Benim durumumda, kaldırdığım Meld'i açmaya çalışıyordu

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.