web-dev-qa-db-ja.com

Git on Windows:どうやってmergetoolを設定しますか?

CygwinでmsysGitとGitを試しました。どちらもうまく機能しており、どちらもgitkとgit-guiを完全に実行します。

さて、私はどうやってmergetoolを設定するのですか? (VimdiffはCygwin上で動作しますが、Windowsを愛する同僚の中には、もう少しユーザーフレンドリーなものが欲しいのです。)

332
Jake

Charles Baileyの答えをフォローアップするために、これが私のgitセットアップです p4merge (無料のクロスプラットフォーム3wayマージツール)。 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"の中にあります。
  • すべてのファイル名に二重引用符を追加して、スペースを含むファイルをマージツールで見つけられるようにしました(Powershellのmsys Gitでテストしました)。
  • デフォルトでは、PERFORCEはインストールディレクトリをPATHに追加します。したがって、コマンドでp4mergeへのフルパスを指定する必要はありません。

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


EDIT(2014年2月)

@ Gregory Pakosz 、最新の msys git で指摘されているように、p4merge1.8.5.2.msysgit.)でテストされています。

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

git mergetool --tool-help

p4mergeavailableまたはvalidリストのどちらかに表示されるはずです。そうでない場合は、gitを更新してください。

p4mergeavailableとしてリストされていれば、それはあなたのPATHの中にあり、設定する必要があるのはmerge.tool =:

git config --global merge.tool p4merge

validと表示されている場合は、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はパスの環境変数を拡張しているようには見えません(これをうまく機能させる方法がわかっている場合は、お知らせください)
294
Milan Gardian

gitがp4mergeをサポートしようとし始めたので、mergetool.p4merge.cmdの設定はもう機能しません。libexec/git-core/git-mergetool--lib.soを見てください。例えばg4のためのmergetoolパスを指定する必要があります、例えばp4merge:

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

それでうまくいきます。

87
daizuozhuo

私はWinXPでPortable Gitを使っていますが(処理はうまくいきます)、分岐で発生した競合を解決する必要がありました。私がチェックしたすべてのguiのうち、 KDiff が最も透明度が高いことが証明されました。

しかし、私はそれをWindowsで動かすために必要な指示を このブログ記事 に見いだしました。それは基本的に私の.gitconfigファイルにこれらの行を追加することになりました:

[merge]
    tool = kdiff3

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

今うまく働きます!

58
Dɑvïd

Cygwinの下で、私のために働いていたonlyことは以下の通りです:

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
20
splicer

git mergetoolは完全に設定可能なので、あなたは大体お気に入りのツールを選ぶことができます。

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

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

マージツールがネイティブにサポートされているツールの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ツールは、非常に優れたスタンドアロンのマージツールです。

16
CB Bailey

Windows 7で比較する

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

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

git config --global merge.tool p4merge

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

6
friederbluemle

すでにここで答えたように(そして here そして here )、mergetoolはこれを設定するためのコマンドです。 Niceのグラフィカルフロントエンドには、 kdiff (GPL)をお勧めします。

5
hlovdal

私はwindows 7でmsysGitを使って余分な引用をやめなければなりませんでした、理由はわかりません。

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

私は彼らのマニュアルからのWinMerge( http://winmerge.org/ )情報( http://manual.winmerge.org/CommandLine.html )というアプリを使っています。

これは私がmergetoolディレクティブから.gitconfigを介して使用するbashスクリプトです。

#!/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は、差分の結果が空のファイルに格納され、正しい場所に新しい一時ファイルを作成するときを考慮します。

3
xero

Bah、これついに私のために働いた(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
Nathan McDaniel

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
idbrii

私はgithubウィンドウで "SourceGear DiffMerge"をdifftoolとmergetoolとして設定する方法を2つ見つけました。

コマンドプロンプトウィンドウに次のコマンドを入力すると、GITがDiffMergeを使用するように.gitconfigが更新されます。

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

[OR]

以下の行をあなたの.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\"
2
vineel

IntelliJの場合IDEA(Community Edition)Windows環境での3-way 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 "$@" 
1
Usman Saleem

あなたもこれらのオプションを追加したいかもしれません:

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

また、私には理由がわかりませんが、Milan Gardianの回答からの引用とスラッシュが原因で、私には困惑しました。

1
Roberto

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

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

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

0
Kautsky Lozano

Mergeとdiffの両方のウィンドウにchocolateyを使用してインストールされたp4mergeをセットアップするには、以下をご覧ください。 https://Gist.github.com/CamW/88e95ea8d9f0786d746a

0
CamW