WindowsのGit:どのようにしてmergetoolを設定しますか?


346

CygwinでmsysGitとGitを試しました。どちらも問題なく動作し、両方ともgitkとgit-guiを完全に実行します。

では、mergetoolをどのように構成すればよいのでしょうか。(VimdiffはCygwinで動作しますが、できればWindowsを愛する一部の同僚にとって、もう少しユーザーフレンドリーなものが欲しいです。)



4
Git Extensionsには、非常に優れたWindowsのユーザーフレンドリーなマージツールを備えたgit UIがあります。
KallDrexx 2011年

TortoiseGitが必要ですか?
セルゲイ

回答:


304

Charles Baileyの回答をフォローアップするために、p4merge(無料のクロスプラットフォーム3wayマージツール)を使用しているgitセットアップを以下に示します。msys Git(Windows)インストールでテスト済み:

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

または、Windowsのcmd.exeシェルから、2行目は次のようになります。

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

変更(Charles Baileyに関連):

  • グローバルgit構成に追加、つまり現在のプロジェクトだけでなくすべてのgitプロジェクトに有効
  • カスタムツールの構成値は、「merge。[tool] .cmd」ではなく、「mergetool。[tool] .cmd」にあります(愚かなことに、gitが存在しないツールについて文句を言い続けた理由のトラブルシューティングに1時間費やしました)
  • すべてのファイル名に二重引用符を追加し、スペースを含むファイルをマージツールで引き続き検索できるようにしました(Powershellのmsys Gitでテストしました)。
  • デフォルトではPerforceはインストールディレクトリをPATHに追加するため、コマンドでp4mergeへのフルパスを指定する必要がないことに注意してください

ダウンロード:http : //www.perforce.com/product/components/perforce-visual-merge-and-diff-tools


編集(2014年2月)

尖った出たよう@Gregory Pakosz、最新MSYSはgitの「ネイティブ」サポートは、今P4MERGE(上でテスト1.8.5.2.msysgit.0)。

次のコマンドを実行すると、サポートされているツールのリストを表示できます。

git mergetool --tool-help

利用可能リストまたは有効なリストにp4mergeが表示れます。そうでない場合は、gitを更新してください。

場合P4MERGEをとしてリストされた利用できる、それはあなたの中にあるPATHとあなただけ設定する必要がmerge.tool

git config --global merge.tool p4merge

有効と表示されている場合はmerge.toolに加えてmergetool.p4merge.pathを定義する必要があります。

git config --global mergetool.p4merge.path c:/Users/my-login/AppData/Local/Perforce/p4merge.exe
  • 上記は、システム全体ではなく、現在のユーザーに対してp4mergeがインストールされた場合のパスの例です(管理者権限またはUAC昇格は必要ありません)。
  • ~(その理論的にパスがある必要があり、現在のユーザのホームディレクトリに展開する必要があります~/AppData/Local/Perforce/p4merge.exe)、これは私のために動作しませんでした
  • 環境変数(など$LOCALAPPDATA/Perforce/p4merge.exe)を利用する方がよかったでしょう。gitはパスの環境変数を拡張していないようです(これを機能させる方法を知っている場合は、私に知らせてください、またはこの回答を更新してください)。

うーん-これを試してみてください-最初の設定はうまくいきます、次はgit configのヘルプテキストを表示するだけです。なぜだかわかりません。
ダニーステープル2010年

1
了解しました。これらの単一引用符は私には疑わしいようです。これを2倍にするだけで機能します。
ダニーステープル2010年

13
mergetool.p4merge.cmdGitがp4mergeのサポートを試み始めたため、設定は機能しなくなりましたlibexec/git-core/git-mergetool--lib。を参照してください。代わりに直接使用mergetool.p4merge.path
Gregory Pakosz 2010年

5
:完全なパスを入れて、二重引用符エスケープしなければならなかったcmd = \""c:/Program Files/TortoiseSVN/bin/TortoiseMerge.exe"\" -base:"$BASE" -theirs:"$REMOTE" -mine:"$LOCAL" -merged:"$MERGED"
ルドビクKuty

21
これは私のためにそれをやった:git config --global mergetool.p4merge.cmd '"C:\\Program Files\\Perforce\\p4merge" $BASE $LOCAL $REMOTE $MERGED'Windows 7のマシン上
ダン・P.

88

Gitがp4mergeのサポートを開始したため、mergetool.p4merge.cmdの設定は機能しなくなりました。libexec/ git-core / git-mergetool--lib.soを参照してください。gitのmergetoolパスを指定するだけです。たとえば、p4merge:

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

その後、動作します。


1
Beyond Compare 3でも動作します。代わりにBComp.exeへのパスを使用してください。ありがとう!
Richard Anthony Hein

4
これは古いスレッドですが、そのパスを機能させることができません。cmd / msysの相互作用を考慮してパスがどのようにエスケープされることになっているのか少し混乱しています... 編集二重引用符に切り替えて修正しました!
Rustavore 2013

ギトニンジャありがとう!あなたがGitのバッシュにこれを入力することができますが、プロンプトのコマンドを使用する場合は、二重引用符に単一引用符を変更しなければならないことに注意してください
ハイフォン

61

私はWinXPでPortable Gitを使用しており(問題なく動作します)、分岐で発生した競合を解決する必要がありました。チェックしたすべてのGUIのうち、KDiff3が最も透過的に使用できることが判明しました。

しかし、Windowsで動作させるために必要な手順をこのブログの投稿で見つけました。この手順は、ここに記載されている他のアプローチとは少し異なります。基本的に、これらの行を.gitconfigファイルに追加することになります。

[merge]
    tool = kdiff3

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

今すぐうまくいきます!


13
Win7 PCでは、使用する必要がありましたpath = C:\\Program Files (x86)\\KDiff3\\kdiff3.exe(二重のバックスラッシュに注意してください)
Someone Somewhere

「diffツールmeldは「D:\ software \ melddiff \ Meld.exe」として利用できません」というエラーが表示されました
Allen

各セクションが追加される順序に違いがあるかどうか知っていますか。つまり、[merge]が[mergetool]の後にある場合、
サミュエル

20

Cygwinの下で、私にとってうまくいった唯一のものは次のとおりです:

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

また、difftoolのプロンプトメッセージをオフにしたい:

git config --global difftool.prompt false

16

git mergetool 完全に構成可能であるため、お気に入りのツールをほぼ選択できます。

完全なドキュメントはここにあります:http : //www.kernel.org/pub/software/scm/git/docs/git-mergetool.html

簡単に言うと、ユーザー設定変数を設定することで、デフォルトのmergetoolを設定できますmerge.tool

マージツールがネイティブでサポートされているものの1つである場合はmergetool.<tool>.path、ツールへのフルパスを設定するだけです(置換<tool>構成済みのものにmerge.toolます)。

それ以外の場合はmergetool.<tool>.cmd、シェル変数$BASE, $LOCAL, $REMOTE, $MERGEDを適切なファイルに設定して、実行時に評価されるように少しのシェルに設定できます。設定ファイルを直接編集するか、変数を設定してエスケープするかについては、少し注意する必要があります。git configコマンドで。

このようなものは、あなたができることの味を与えるはずです( 'mymerge'は架空のツールです)。

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

お気に入りのマージツールをセットアップしたら、それを実行するだけです。 git mergetool、解決する必要がある競合が発生したときするだけです。

PERFORCEのp4mergeツールは、非常に優れたスタンドアロンのマージツールです。


8

Windows 7での比較を超えて

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

2
これらのコマンドを使用しましたが、Beyond Compareの代わりにWinMergeを使用しています。
ブレントケラー

6

新しいgitバージョンはp4mergeを直接サポートしているようです。

git config --global merge.tool p4merge

p4merge.exeがパス上にある場合は、必要なものがすべて必要です。cmdまたはパスを設定する必要はありません。


これが鍵です。p4mergeをインストールし、mergetool.p4merge.pathを正確な場所に設定した後も、機能しませんでした。パスにインストールフォルダーを追加しても機能しました。
RichardM

5

ここ(およびここここ)ですでに回答したように、mergetoolはこれを構成するコマンドです。優れたグラフィカルフロントエンドには、kdiff3(GPL)をお勧めします


4

Windows 7でmsysGitを使用して余分なクォートを削除する必要がありましたが、その理由はわかりません。

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

3

cygwinを使用してこれを行う場合は、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`'

3

ええと、これは最終的に私のため働きました(Windows 7 + Cygwin + TortoiseMerge):

.git / config:

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

cygpathを使用するためのヒントを以前のポスターに感謝します!


3

私は彼らのマニュアル(http://manual.winmerge.org/CommandLine.html)からWinMerge(http://winmerge.org/)と呼ばれるアプリを使用しています

これは私がmergetoolディレクティブから使用するbashスクリプトです.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"

基本的にbashは、diffの結果が空のファイルにある場合を考慮し、正しい場所に新しい一時ファイルを作成します。


3

github Windowsで「SourceGear DiffMerge」をdifftoolとmergetoolとして構成する2つの方法を見つけました。

コマンドプロンプトウィンドウで次のコマンドを実行すると、.gitconfigが更新され、GITが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\"'

[ または ]

次の行を.gitconfigに追加します。このファイルは、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\"

1

これらのオプションを追加することもできます。

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

また、理由はわかりませんが、ミラノガルディアンの回答からの引用とスラッシュは、私を混乱させました。


1

TortoiseGitのdiffツールとしてgvimを使用したい場合は、外部のdiffツールへのパスをテキスト入力に入力する必要があります。

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

1

IntelliJ IDEA(Community Edition)の場合、Windows環境での3方向のgit mergetool構成(~/.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はmsysでパスをWindowsに変換するためのもので、stackoverflowのmsysパス変換の質問から取得されます

#! /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

マージと差分の両方のウィンドウにChocolateyを使用してインストールされたp4mergeをセットアップするには、こちらをご覧くださいhttps ://gist.github.com/CamW/88e95ea8d9f0786d746a


0

SourceTreeからp4mergeを開くときに問題が発生した場合は、MyRepo.gitの下にあるconfigという名前のローカル構成ファイルを探し、マージ構成を削除してください。私の場合、アンインストールしたMeldを開こうとした

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.