Git unter Windows: Wie richte ich ein Mergetool ein?

346

Ich habe msysGit und Git auf Cygwin ausprobiert. Beide funktionieren an und für sich einwandfrei und beide laufen perfekt mit gitk und git-gui.

Wie zum Teufel konfiguriere ich ein Mergetool? (Vimdiff arbeitet mit Cygwin, aber vorzugsweise möchte ich für einige unserer Windows-liebenden Mitarbeiter etwas Benutzerfreundlicheres.)

Jake
quelle
4
Git Extensions verfügt über eine Git-Benutzeroberfläche mit einem recht guten und benutzerfreundlichen Windows-Tool zum Zusammenführen.
KallDrexx
Sieht aus wie Sie TortoiseGit brauchen?
Sergei

Antworten:

304

Um die Antwort von Charles Bailey weiterzuverfolgen , hier ist mein Git-Setup, das p4merge (kostenloses plattformübergreifendes 3-Wege -Merge-Tool) verwendet. getestet auf der Installation von msys Git (Windows):

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

oder aus einer Windows-cmd.exe-Shell wird die zweite Zeile:

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

Die Änderungen (relativ zu Charles Bailey):

  • zur globalen Git-Konfiguration hinzugefügt, dh gültig für alle Git-Projekte, nicht nur für das aktuelle
  • Der Konfigurationswert für das benutzerdefinierte Tool befindet sich in "mergetool. [tool] .cmd", nicht in "merge. [tool] .cmd".
  • Es wurden doppelte Anführungszeichen für alle Dateinamen hinzugefügt, damit Dateien mit Leerzeichen weiterhin vom Zusammenführungstool gefunden werden können (ich habe dies in msys Git von Powershell getestet).
  • Beachten Sie, dass Perforce standardmäßig sein Installationsverzeichnis zu PATH hinzufügt, sodass im Befehl kein vollständiger Pfad zu p4merge angegeben werden muss

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


BEARBEITEN (Februar 2014)

Wie von @Gregory Pakosz hervorgehoben , unterstützt das neueste msys git jetzt "nativ" p4merge (getestet unter 1.8.5.2.msysgit.0 ).

Sie können eine Liste der unterstützten Tools anzeigen, indem Sie Folgendes ausführen:

git mergetool --tool-help

Sie sollten p4merge entweder in der verfügbaren oder in der gültigen Liste sehen. Wenn nicht, aktualisieren Sie bitte Ihren Git.

Wenn p4merge als verfügbar aufgeführt wurde , befindet es sich in Ihrem PFAD und Sie müssen nur merge.tool festlegen :

git config --global merge.tool p4merge

Wenn es wie aufgeführt war gültig , müssen Sie definieren mergetool.p4merge.path zusätzlich zu merge.tool :

git config --global mergetool.p4merge.path c:/Users/my-login/AppData/Local/Perforce/p4merge.exe
  • Das Obige ist ein Beispielpfad, als p4merge für den aktuellen Benutzer installiert wurde, nicht systemweit (benötigt keine Administratorrechte oder UAC-Erhöhung)
  • Obwohl ~es in das Home-Verzeichnis des aktuellen Benutzers erweitert werden sollte (theoretisch sollte der Pfad so sein ~/AppData/Local/Perforce/p4merge.exe), funktionierte dies bei mir nicht
  • Noch besser wäre es gewesen, eine Umgebungsvariable zu nutzen (z. B. $LOCALAPPDATA/Perforce/p4merge.exe). Git scheint Umgebungsvariablen für Pfade nicht zu erweitern (wenn Sie wissen, wie dies funktioniert, lassen Sie es mich bitte wissen oder aktualisieren Sie diese Antwort).
Milan Gardian
quelle
Hmm - probieren Sie das aus - die erste Konfiguration funktioniert einwandfrei, die nächste zeigt nur den Hilfetext für die Git-Konfiguration an. Nicht sicher warum.
Danny Staple
1
Verstanden - diese einfachen Zitate sehen für mich verdächtig aus. Verdoppeln Sie das einfach und sie funktionieren.
Danny Staple
13
Die Einstellung mergetool.p4merge.cmdfunktioniert nicht mehr, da Git versucht hat, p4merge zu unterstützen libexec/git-core/git-mergetool--lib. stattdessen verwendet es direktmergetool.p4merge.path
Gregory Pakosz
5
Musste den vollen Weg setzen und doppelten Anführungszeichen entkommen:cmd = \""c:/Program Files/TortoiseSVN/bin/TortoiseMerge.exe"\" -base:"$BASE" -theirs:"$REMOTE" -mine:"$LOCAL" -merged:"$MERGED"
Ludovic Kuty
21
Dies tat es für mich: git config --global mergetool.p4merge.cmd '"C:\\Program Files\\Perforce\\p4merge" $BASE $LOCAL $REMOTE $MERGED'auf Windows 7-Maschine
Dan P.
88

Das Festlegen von mergetool.p4merge.cmd funktioniert nicht mehr, da Git versucht hat, p4merge zu unterstützen. Siehe libexec / git-core / git-mergetool--lib. Wir müssen also nur den mergetool-Pfad für git angeben, zum Beispiel p4merge:

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

Dann wird es funktionieren.

daizuozhuo
quelle
1
Funktioniert auch mit Beyond Compare 3. Verwenden Sie stattdessen einfach den Pfad zu BComp.exe. Vielen Dank!
Richard Anthony Hein
4
Mir ist klar, dass dies ein alter Thread ist, aber ich kann diesen Weg nicht zum Laufen bringen. Ich bin ein wenig verwirrt darüber , wie der Pfad soll auf das Zusammenspiel von cmd / msys ... gegeben entwertet werden EDIT Umschalten auf doppelte Anführungszeichen es fest!
Rustavore
Danke Gitninja! Beachten Sie, dass Sie dies in Git Bash eingeben können, aber wenn Sie den Befehl Eingabeaufforderung verwenden, müssen Sie das einfache Anführungszeichen in das doppelte Anführungszeichen ändern
Hải Phong
61

Ich verwende Portable Git unter WinXP (funktioniert ein Vergnügen!) Und musste einen Konflikt lösen, der beim Verzweigen auftrat. Von allen von mir überprüften GUI erwies sich KDiff3 als die transparenteste.

Aber ich habe in diesem Blog-Beitrag die Anweisungen gefunden, die ich brauchte, um es unter Windows zum Laufen zu bringen. Diese Anweisungen unterscheiden sich geringfügig von den anderen hier aufgeführten Ansätzen. Im Grunde ging es darum, diese Zeilen zu meiner .gitconfigDatei hinzuzufügen :

[merge]
    tool = kdiff3

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

Jetzt gut funktionieren!

Dɑvïd
quelle
13
Auf meinem Win7-PC musste ich verwenden path = C:\\Program Files (x86)\\KDiff3\\kdiff3.exe(beachten Sie die doppelten Schrägstriche)
Someone Somewhere
Ich habe eine Fehlermeldung wie die folgende erhalten: "Die Diff-Tool-Meldung ist nicht als 'D: \ software \ melddiff \ Meld.exe' verfügbar"
Allen Vork
Wissen Sie, ob es einen Unterschied in der Reihenfolge gibt, in der die einzelnen Abschnitte hinzugefügt werden? Ich meine, wenn [Zusammenführen] nach [Mergetool] wäre?
Samuel
20

Unter Cygwin, die nur Sache , die für mich gearbeitet ist die folgende:

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)"'

Außerdem möchte ich die Eingabeaufforderung für difftool deaktivieren:

git config --global difftool.prompt false
Spleißer
quelle
16

git mergetool ist vollständig konfigurierbar, sodass Sie so ziemlich Ihr Lieblingswerkzeug auswählen können.

Die vollständige Dokumentation finden Sie hier: http://www.kernel.org/pub/software/scm/git/docs/git-mergetool.html

Kurz gesagt, Sie können ein Standard-Mergetool festlegen, indem Sie die Benutzerkonfigurationsvariable festlegen merge.tool.

Wenn das Zusammenführungswerkzeug eines der von ihm nativ unterstützten ist, müssen Sie nur mergetool.<tool>.pathden vollständigen Pfad zum Werkzeug festlegen ( <tool>durch das ersetzen, was Sie konfiguriert haben) merge.tool.

Andernfalls können Sie mergetool.<tool>.cmdein Stück Shell festlegen, das zur Laufzeit ausgewertet werden soll, wobei die Shell-Variablen $BASE, $LOCAL, $REMOTE, $MERGEDauf die entsprechenden Dateien eingestellt sind. Sie müssen beim Escapezeichen etwas vorsichtig sein, ob Sie eine Konfigurationsdatei direkt bearbeiten oder die Variable mit dem git configBefehl festlegen .

So etwas sollte den Geschmack dessen geben, was Sie tun können ('mymerge' ist ein fiktives Werkzeug).

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

Sobald Sie Ihr bevorzugtes Zusammenführungstool eingerichtet haben, müssen Sie es nur noch ausführen, git mergetoolwenn Sie Konflikte lösen müssen.

Das p4merge-Tool von Perforce ist ein ziemlich gutes eigenständiges Merge-Tool.

CB Bailey
quelle
8

Für mehr als unter Windows 7 zu vergleichen

git config --global merge.tool bc3
git config --global mergetool.bc3.path "C:\Program Files (x86)\Beyond Compare 3\BCompare.exe"
Entwickler747
quelle
2
Ich habe diese Befehle verwendet, aber ich verwende WinMerge anstelle von Beyond Compare.
Brent Keller
6

Es scheint, dass neuere Git-Versionen p4merge direkt unterstützen

git config --global merge.tool p4merge

sollte alles sein, was Sie brauchen, wenn p4merge.exe auf Ihrem Weg ist. Keine Notwendigkeit, cmd oder Pfad einzurichten.

friederbluemle
quelle
Das ist der Schlüssel. Nach der Installation von p4merge und dem genauen Speicherort mergetool.p4merge.path funktionierte dies immer noch nicht. Das Hinzufügen des Installationsordners zum Pfad hat funktioniert.
RichardM
5

Wie hier (und hier und hier ) bereits beantwortet , ist mergetool der Befehl, um dies zu konfigurieren. Für ein schönes grafisches Frontend empfehle ich kdiff3 (GPL).

hlovdal
quelle
4

Ich musste das zusätzliche Angebot mit msysGit unter Windows 7 löschen, nicht sicher warum.

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

Wenn Sie dies über Cygwin tun, müssen Sie möglicherweise Cygpath verwenden:

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`'
idbrii
quelle
3

Bah, das hat endlich bei mir funktioniert (Windows 7 + Cygwin + TortoiseMerge):

In .git / config:

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

Vielen Dank an frühere Poster für den Tipp zur Verwendung von Cygpath!

Nathan McDaniel
quelle
3

Ich benutze eine App namens WinMerge ( http://winmerge.org/ ) Informationen aus ihrem Handbuch ( http://manual.winmerge.org/CommandLine.html )

Dies ist das Bash-Skript, das ich aus der mergetoolDirektive über verwende.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"

Grundsätzlich berücksichtigt die Bash, wann das Ergebnis des Diff in einer leeren Datei und erstellt eine neue temporäre Datei am richtigen Ort.

xero
quelle
3

Ich habe zwei Möglichkeiten gefunden, " SourceGear DiffMerge " als Difftool und Mergetool in Github Windows zu konfigurieren .

Die folgenden Befehle in einem Eingabeaufforderungsfenster aktualisieren Ihre .gitconfig, um GIT mithilfe von DiffMerge zu konfigurieren:

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\"'

[ ODER ]

Fügen Sie Ihrer .gitconfig die folgenden Zeilen hinzu. Diese Datei sollte sich in Ihrem Ausgangsverzeichnis unter C: \ Users \ UserName befinden:

[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\"
Essig
quelle
1

Möglicherweise möchten Sie auch folgende Optionen hinzufügen:

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

Ich weiß auch nicht warum, aber das Zitieren und Schrägstrich aus Milan Gardians Antwort hat die Dinge für mich durcheinander gebracht.

Roberto
quelle
1

Wenn jemand gvim als Diff-Tool für TortoiseGit verwenden möchte, müssen Sie Folgendes in die Texteingabe für den Pfad zum externen Diff-Tool eingeben:

path\to\gvim.exe -f -d -c "wincmd R" -c "wincmd R" -c "wincmd h" -c "wincmd J"
Attila Szeremi
quelle
1

Für IntelliJ IDEA (Community Edition) 3-Wege-Git-Mergetool-Konfiguration in Windows-Umgebung ( ~/.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

Die Datei ~ / winpath.sh dient zum Konvertieren von Pfaden in Windows auf msys und wird aus der Frage zur Konvertierung von msys- Pfaden auf stackoverflow entnommen

#! /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 "$@" 
Usman Saleem
quelle
0

Wenn Sie Probleme beim Öffnen von p4merge über SourceTree haben, suchen Sie unter MyRepo.git nach Ihrer lokalen Konfigurationsdatei config und löschen Sie alle Zusammenführungskonfigurationen. In meinem Fall wurde versucht, Meld zu öffnen, das ich gerade deinstalliert habe

Kautsky Lozano
quelle