Git sous Windows: comment configurer un mergetool?

346

J'ai essayé msysGit et Git sur Cygwin. Les deux fonctionnent très bien en eux-mêmes et exécutent parfaitement gitk et git-gui.

Maintenant, comment diable puis-je configurer un mergetool? (Vimdiff fonctionne sur Cygwin, mais de préférence je voudrais quelque chose d'un peu plus convivial pour certains de nos collègues amoureux de Windows.)

Jake
la source
4
Git Extensions a une interface utilisateur git qui a un assez bon outil de fusion convivial pour Windows.
KallDrexx
On dirait que vous avez besoin de TortoiseGit?
Sergei

Réponses:

304

Pour faire le suivi de la réponse de Charles Bailey, voici ma configuration git qui utilise p4merge (outil de fusion multiplateforme 3 voies gratuit); testé sur l'installation de msys Git (Windows):

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

ou, à partir d'un shell Windows cmd.exe, la deuxième ligne devient:

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

Les changements (par rapport à Charles Bailey):

  • ajouté à la configuration globale de git, c'est-à-dire valable pour tous les projets git et pas seulement celui en cours
  • la valeur de configuration de l'outil personnalisé réside dans "mergetool. [tool] .cmd", pas dans "merge. [tool] .cmd" (idiot, j'ai passé une heure à dépanner pourquoi git continuait de se plaindre d'un outil inexistant)
  • ajout de guillemets doubles pour tous les noms de fichiers afin que les fichiers avec des espaces puissent toujours être trouvés par l'outil de fusion (j'ai testé cela dans msys Git de Powershell)
  • notez que par défaut Perforce ajoutera son répertoire d'installation à PATH, donc pas besoin de spécifier le chemin complet vers p4merge dans la commande

Téléchargement: http://www.perforce.com/product/components/perforce-visual-merge-and-diff-tools


EDIT (févr.2014)

Comme l'a souligné @Gregory Pakosz , le dernier msys git prend désormais "nativement" en charge p4merge (testé sur 1.8.5.2.msysgit.0 ).

Vous pouvez afficher la liste des outils pris en charge en exécutant:

git mergetool --tool-help

Vous devriez voir p4merge dans la liste disponible ou valide . Sinon, veuillez mettre à jour votre git.

Si p4merge était répertorié comme disponible , il se trouve dans votre PATH et vous n'avez qu'à définir merge.tool :

git config --global merge.tool p4merge

S'il était répertorié comme valide , vous devez définir mergetool.p4merge.path en plus de merge.tool :

git config --global mergetool.p4merge.path c:/Users/my-login/AppData/Local/Perforce/p4merge.exe
  • Ce qui précède est un exemple de chemin lorsque p4merge a été installé pour l'utilisateur actuel, pas à l'échelle du système (n'a pas besoin de droits d'administrateur ou d'élévation UAC)
  • Bien que cela ~devrait s'étendre au répertoire personnel de l'utilisateur actuel (donc en théorie, le chemin devrait être ~/AppData/Local/Perforce/p4merge.exe), cela n'a pas fonctionné pour moi
  • Encore mieux aurait été de profiter d'une variable d'environnement (par exemple $LOCALAPPDATA/Perforce/p4merge.exe), git ne semble pas étendre les variables d'environnement pour les chemins (si vous savez comment faire fonctionner cela, veuillez me le faire savoir ou mettre à jour cette réponse)
Milan Gardian
la source
Hmm - en essayant cela - la première configuration fonctionne bien, la suivante affiche simplement le texte d'aide pour la configuration git. Pas certain de pourquoi.
Danny Staple
1
J'ai compris - ces citations simples me semblent suspectes. Il suffit de doubler cela et ils fonctionnent.
Danny Staple
13
Ce paramètre mergetool.p4merge.cmdne fonctionnera plus depuis que Git a commencé à essayer de prendre en charge p4merge, voir libexec/git-core/git-mergetool--lib. à la place, il utilise directementmergetool.p4merge.path
Gregory Pakosz
5
A dû mettre le chemin complet et échapper aux doubles guillemets:cmd = \""c:/Program Files/TortoiseSVN/bin/TortoiseMerge.exe"\" -base:"$BASE" -theirs:"$REMOTE" -mine:"$LOCAL" -merged:"$MERGED"
Ludovic Kuty
21
Cela l'a fait pour moi: git config --global mergetool.p4merge.cmd '"C:\\Program Files\\Perforce\\p4merge" $BASE $LOCAL $REMOTE $MERGED'sur la machine Windows 7
Dan P.
88

définir mergetool.p4merge.cmd ne fonctionnera plus depuis que Git a commencé à essayer de prendre en charge p4merge, voir libexec / git-core / git-mergetool--lib.so nous avons juste besoin de spécifier le chemin mergetool pour git, par exemple le p4merge:

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

Ensuite, cela fonctionnera.

daizuozhuo
la source
1
Fonctionne également avec Beyond Compare 3. Utilisez simplement le chemin d'accès à BComp.exe à la place. Merci!
Richard Anthony Hein
4
Je me rends compte que c'est un vieux fil, mais je ne peux pas obtenir ce chemin pour travailler. Je suis un peu confus sur la façon dont le chemin est censé être échappé étant donné l'interaction de cmd / msys ... EDIT Le passage aux guillemets doubles l'a corrigé!
Rustavore
Merci Gitninja! Notez que vous pouvez taper ceci dans Git Bash, mais si vous utilisez l'invite de commande, vous devez changer le guillemet simple en guillemet double
Hải Phong
61

J'utilise Portable Git sur WinXP (ça marche un régal!), Et j'avais besoin de résoudre un conflit survenu lors de la création de branches. De tous les gui que j'ai vérifiés, KDiff3 s'est avéré être le plus transparent à utiliser.

Mais j'ai trouvé les instructions dont j'avais besoin pour le faire fonctionner dans Windows dans ce billet de blog , des instructions qui diffèrent légèrement des autres approches répertoriées ici. Cela revenait essentiellement à ajouter ces lignes à mon .gitconfigfichier:

[merge]
    tool = kdiff3

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

Fonctionne bien maintenant!

Dɑvïd
la source
13
sur mon PC Win7, je devais utiliser path = C:\\Program Files (x86)\\KDiff3\\kdiff3.exe(remarquez les doubles barres obliques)
Someone Somewhere
J'ai reçu une erreur comme celle-ci "La fusion de l'outil de différenciation n'est pas disponible en tant que 'D: \ software \ melddiff \ Meld.exe'"
Allen Vork
Savez-vous s'il existe une différence avec l'ordre dans lequel chaque section est ajoutée. Je veux dire, si [fusionner] serait après [mergetool]?
Samuel
20

Sous Cygwin, la seule chose qui a fonctionné pour moi est la suivante:

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

De plus, j'aime désactiver le message d'invite pour difftool:

git config --global difftool.prompt false
épisseur
la source
16

git mergetool est entièrement configurable pour que vous puissiez à peu près choisir votre outil préféré.

La documentation complète est ici: http://www.kernel.org/pub/software/scm/git/docs/git-mergetool.html

En bref, vous pouvez définir un mergetool par défaut en définissant la variable de configuration utilisateur merge.tool.

Si l'outil de fusion est l'un de ceux pris en charge nativement par lui, il vous suffit de définir mergetool.<tool>.pathle chemin d'accès complet à l'outil (à remplacer <tool>par ce que vous avez configuré merge.toolpour être.

Sinon, vous pouvez définir mergetool.<tool>.cmdun peu de shell à évaluer au moment de l'exécution avec les variables de shell $BASE, $LOCAL, $REMOTE, $MERGEDdéfinies dans les fichiers appropriés. Vous devez être un peu prudent avec l'échappement si vous modifiez directement un fichier de configuration ou définissez la variable avec la git configcommande.

Quelque chose comme ça devrait donner la saveur de ce que vous pouvez faire ('mymerge' est un outil fictif).

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

Une fois que vous avez configuré votre outil de fusion préféré, il suffit de lancer git mergetoolchaque fois que vous avez des conflits à résoudre.

L'outil p4merge de Perforce est un très bon outil de fusion autonome.

CB Bailey
la source
8

Au-delà de la comparaison sur Windows 7

git config --global merge.tool bc3
git config --global mergetool.bc3.path "C:\Program Files (x86)\Beyond Compare 3\BCompare.exe"
developer747
la source
2
J'ai utilisé ces commandes mais j'utilise WinMerge au lieu de Beyond Compare.
Brent Keller
6

Il semble que les nouvelles versions de git prennent directement en charge p4merge, donc

git config --global merge.tool p4merge

devrait être tout ce dont vous avez besoin, si p4merge.exe est sur votre chemin. Pas besoin de configurer cmd ou chemin.

friederbluemle
la source
C'est la clé. Après avoir installé p4merge et défini le mergetool.p4merge.path à l'emplacement exact, cela n'a toujours pas fonctionné. L'ajout du dossier d'installation au chemin a fonctionné.
RichardM
5

Comme déjà répondu ici (et ici et ici ), mergetool est la commande pour configurer cela. Pour une belle interface graphique, je recommande kdiff3 (GPL).

hlovdal
la source
4

J'ai dû abandonner les citations supplémentaires en utilisant msysGit sur Windows 7, je ne sais pas pourquoi.

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

Si vous faites cela via cygwin, vous devrez peut-être utiliser cygpath:

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
la source
3

Bah, cela a finalement fonctionné pour moi (Windows 7 + Cygwin + TortoiseMerge):

Dans .git / config:

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

Merci aux affiches précédentes pour le conseil d'utilisation de cygpath!

Nathan McDaniel
la source
3

j'utilise une application appelée WinMerge ( http://winmerge.org/ ) info de leur manuel ( http://manual.winmerge.org/CommandLine.html )

c'est le script bash que j'utilise depuis la mergetooldirective via.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"

fondamentalement, le bash tient compte du résultat du diff dans un fichier vide et crée un nouveau fichier temporaire au bon endroit.

xero
la source
3

J'ai trouvé deux façons de configurer " SourceGear DiffMerge " comme difftool et mergetool dans github Windows.

Les commandes suivantes dans une fenêtre d'invite de commandes mettront à jour votre .gitconfig pour configurer GIT utiliser DiffMerge:

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

[ OU ]

Ajoutez les lignes suivantes à votre .gitconfig. Ce fichier doit se trouver dans votre répertoire personnel dans C: \ Users \ UserName:

[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\"
vigne
la source
1

Vous pouvez également ajouter ces options:

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

De plus, je ne sais pas pourquoi, mais la citation et la barre oblique de la réponse de Milan Gardian ont foiré les choses pour moi.

Roberto
la source
1

Si quelqu'un veut utiliser gvim comme outil de diff sur TortoiseGit, alors c'est ce que vous devez entrer dans la saisie de texte pour le chemin vers l'outil de diff externe:

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

Pour la configuration IntelliJ IDEA (Community Edition) git mergetool à 3 voies dans l'environnement Windows ( ~/.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

Le ~ / winpath.sh consiste à convertir les chemins vers Windows sur msys et provient de la question de conversion de chemin msys sur stackoverflow

#! /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
la source
0

Si vous rencontrez des problèmes pour ouvrir p4merge à partir de SourceTree, recherchez votre fichier de configuration local nommé config sous MyRepo.git et supprimez toute configuration de fusion. Dans mon cas, il essayait d'ouvrir Meld que je viens de désinstaller

Kautsky Lozano
la source