とgit diff
入力すると、選択したビジュアル差分ツール (Windows では SourceGear "diffmerge") で出力を表示したいと考えています。これを行うには git をどのように設定すればよいですか?
26 に答える
Git1.6.3 以降、 git difftool スクリプトを使用できます。以下の私の回答を参照してください。
この記事がお役に立てば幸いです。最良の部分は次のとおりです。
外部差分ツールを指定するには、2 つの異なる方法があります。
1 つ目は、GIT_EXTERNAL_DIFF 変数を設定して使用した方法です。ただし、変数は実行可能ファイルのフル パスを指しているはずです。さらに、GIT_EXTERNAL_DIFF で指定された実行可能ファイルは、固定された 7 つの引数セットで呼び出されます。
path old-file old-hex old-mode new-file new-hex new-mode
ほとんどの diff ツールは引数の異なる順序 (および一部のみ) を必要とするため、代わりに実際の diff ツールを呼び出すラッパー スクリプトを指定する必要があります。
私が好む2番目の方法は、「git config」を介して外部差分ツールを構成することです。これが私がしたことです:
1)次のようなものを含むラッパースクリプト「git-diff-wrapper.sh」を作成します
-->8-(snip)--
#!/bin/sh
# diff is called by git with 7 parameters:
# path old-file old-hex old-mode new-file new-hex new-mode
"<path_to_diff_executable>" "$2" "$5" | cat
--8<-(snap)--
ご覧のとおり、2 番目 ("old-file") と 5 番目 ("new-file") の引数のみが diff ツールに渡されます。
2) タイプ
$ git config --global diff.external <path_to_wrapper_script>
コマンドプロンプトで、「git-diff-wrapper.sh」へのパスに置き換えて、 ~/.gitconfig が含まれるようにします
-->8-(snip)--
[diff]
external = <path_to_wrapper_script>
--8<-(snap)--
正しい構文を使用して、ラッパー スクリプトと diff ツールへのパスを指定してください。つまり、バックスラッシュの代わりにスラッシュを使用してください。私の場合、私は持っています
[diff]
external = \"c:/Documents and Settings/sschuber/git-diff-wrapper.sh\"
.gitconfig および
"d:/Program Files/Beyond Compare 3/BCompare.exe" "$2" "$5" | cat
ラッパースクリプトで。末尾の「猫」に注意してください。
(「| cat
」は、適切な、または一貫した戻りステータスを返さない可能性のある一部のプログラムにのみ必要だと思います。差分ツールに明示的な戻りステータスがある場合は、末尾の猫なしで試してください)
( Diomidis Spinellisはコメントに追加します:
ファイルが異なる場合、 はデフォルトでエラー コードで終了するため、この
cat
コマンドは必須です。 Git は、メモリ不足などの実際のエラーが発生した場合にのみ、外部 diff プログラムがエラー コードで終了することを期待します。の出力をゼロ以外のエラー コード にパイプすることにより、マスクされます。 より効率的に、プログラムは 0 の引数で実行できます。)diff(1)
git
cat
exit
それ(上記の記事)は、(環境変数ではなく)構成ファイルを介して定義された外部ツールの理論です。
実際には(外部ツールの構成ファイル定義については引き続き)、次を参照できます。
- msysgit / gitk で DiffMerge をセットアップするにはどうすればよいですか? MsysGit と gitk の DiffMerge と WinMerge の具体的な設定を示しています。
- Windows で Git と連携するようにエディターを設定するにはどうすればよいですか? Notepad++ を外部エディターとして定義するため。
上記の以前の「diff.external」構成の回答を完了するには:
Jakub が述べたように、 Git1.6.3 はgit difftoolを導入しました。最初は 2008 年 9 月に提案されました。
USAGE= '[--tool=tool] [--commit=ref] [--start=ref --end=ref] [--no-prompt] [file to merge]'
(--extcmd
この回答の最後の部分を参照)
$LOCAL
開始リビジョン$REMOTE
のファイルの内容と終了リビジョンのファイルの内容が含まれます。
$BASE
wor 内のファイルの内容を含む
基本的
git-mergetool
にgit index/worktree上で動作するように修正しています。
xxdiff
このスクリプトの通常の使用例は、ステージングされた変更またはステージングされていない変更があり、横に並べた差分ビューアー (たとえば、tkdiff
、 など)で変更を確認したい場合です。
git difftool [<filename>*]
もう 1 つの使用例は、同じ情報を表示したいが、任意のコミットを比較する場合です (これは、revarg の解析が改善される可能性がある部分です)。
git difftool --start=HEAD^ --end=HEAD [-- <filename>*]
最後の使用例は、現在のワークツリーを HEAD 以外のもの (タグなど) と比較したい場合です。
git difftool --commit=v1.0.0 [-- <filename>*]
注: Git 2.5 以降git config diff.tool winmerge
で十分です。
「git mergetool winmerge」を参照してください
また、Git 1.7.11 以降--dir-diff
では、ファイル ペアごとに 1 回外部ツールのインスタンスを実行する代わりに、2 つの一時ディレクトリにデータを入力した後、一度に 2 つのディレクトリ階層を比較できる外部差分ツールを生成するためのオプションがあります。
Git 2.5 より前:
difftool
カスタム diff ツールを使用して構成する実際のケース:
C:\myGitRepo>git config --global diff.tool winmerge
C:\myGitRepo>git config --global difftool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\""
C:\myGitRepo>git config --global difftool.prompt false
winmerge.sh が PATH のディレクトリ部分に保存されている場合:
#!/bin/sh
echo Launching WinMergeU.exe: $1 $2
"C:/Program Files/WinMerge/WinMergeU.exe" -u -e "$1" "$2" -dl "Local" -dr "Remote"
別のツール (kdiff3、P4Diff など) がある場合は、別のシェル スクリプトと適切な構成difftool.myDiffTool.cmd
ディレクティブを作成します。その後、設定
でツールを簡単に切り替えることができます。diff.tool
他の詳細を追加するために、Dave によるこのブログ エントリもあります。
(またはオプションのこの質問)winmergeu
この設定で興味深いのはwinmerge.sh
スクリプトです。特殊なケースを考慮してスクリプトをカスタマイズできます。
たとえば、以下を扱う例については、以下のDavid Marbleの回答を参照してください。
- 元または宛先の新しいファイル
- 元または宛先のいずれかで削除されたファイル
Kem Masonが彼の回答で言及しているように、オプションを使用してラッパーを回避--extcmd
することもできます。
--extcmd=<command>
差分を表示するためのカスタム コマンドを指定します。
git-difftool
構成されたデフォルトを無視し、$command $LOCAL $REMOTE
このオプションが指定されたときに実行されます。
たとえば、これはツールgitk
を実行/使用できるdiff
方法です。
新しい git difftoolを使用すると、これを.gitconfigファイルに追加するのと同じくらい簡単です。
[diff]
tool = any-name
[difftool "any-name"]
cmd = "\"C:/path/to/my/ext/diff.exe\" \"$LOCAL\" \"$REMOTE\""
オプションで、以下も追加します。
[difftool]
prompt = false
また、 diffallもチェックしてください。これは、それぞれを順番に開くという面倒な (IMO) デフォルトの diff 動作を拡張するために私が書いた単純なスクリプトです。
Windows のグローバル .gitconfig は%USERPROFILE%\.gitconfig
Git バージョン 1.6.3 以降、お気に入りのグラフィカル diff ツールを使用するように構成できる" git difftool " があります。
現在サポートされている (この回答を書いている時点で) KDiff3、Kompare、tkdiff、Meld、xxdiff、 emerge 、 vimdiff 、 gvimdiff 、 ecmerge 、Diffuse、およびopendiffです。使用したいツールがこのリストにない場合は、いつでも ' difftool.<tool>.cmd
' 構成オプションを使用できます。
「git difftool」は「git diff」と同じオプションを受け入れます。
これに1つ追加があります。デフォルト ツールの 1 つとしてサポートされていない差分アプリ (万華鏡など) を定期的に使用するのが好きです。
git difftool -t
diff
また、デフォルトを通常のコマンドラインにすることも好きなので、GIT_EXTERNAL_DIFF
変数を設定することはオプションではありません。
次のコマンドを使用して、任意のdiff
アプリを 1 回限り使用できます。
git difftool --extcmd=/usr/bin/ksdiff
指定したコマンドに2つのファイルを渡すだけなので、おそらくラッパーも必要ありません。
ファイルの削除と追加に対処するための VonC の回答に基づいて、次のコマンドとスクリプトを使用します。
git config --global diff.tool winmerge
git config --global difftool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\" \"$BASE\""
git config --global difftool.prompt false
これは、これをグローバルファイル.gitconfigに入れるのと同じです:
[diff]
tool = winmerge
[difftool "winmerge"]
cmd = winmerge.bat "$LOCAL" "$REMOTE" "$BASE"
[difftool]
prompt = false
次に、パス上にある必要があるファイルwinmerge.shに次を入力します。
#!/bin/sh
NULL="/dev/null"
if [ "$2" = "$NULL" ] ; then
echo "removed: $3"
elif [ "$1" = "$NULL" ] ; then
echo "added: $3"
else
echo "changed: $3"
"C:/Program Files (x86)/WinMerge/WinMergeU.exe" -e -ub -dl "Base" -dr "Mine" "$1" "$2"
fi
Windows/ MSYS Git向けソリューション
回答を読んだ後、1 つのファイルのみを変更するより簡単な方法を発見しました。
引数 2 と 5 を使用して、差分プログラムを呼び出すバッチ ファイルを作成します。このファイルは、パスのどこかにある必要があります。(場所がわからない場合は、C:\windowsに入れてください。)たとえば、「gitdiff.bat」と呼びます。私は:
@echo off REM This is gitdiff.bat "C:\Program Files\WinMerge\WinMergeU.exe" %2 %5
バッチ ファイルを指すように環境変数を設定します。例:
GIT_EXTERNAL_DIFF=gitdiff.bat
. または、PowerShell を使用して と入力しますgit config --global diff.external gitdiff.bat
。引用符を使用したり、パス情報を指定したりしないことが重要です。そうしないと機能しません。そのため、パスにgitdiff.batが必要です。
「git diff」と入力すると、外部の差分ビューアーが呼び出されます。
Cygwinを介してこれを行っている場合は、 cygpathを使用する必要がある場合があります。
$ git config difftool.bc3.cmd "git-diff-bcomp-wrapper.sh \$LOCAL \$REMOTE"
$ cat git-diff-bcomp-wrapper.sh
#!/bin/sh
"c:/Program Files (x86)/Beyond Compare 3/BComp.exe" `cygpath -w $1` `cygpath -w $2`
これは Windows 7 で動作します。中間のshスクリプトは必要ありません。
.gitconfig の内容:
[diff]
tool = kdiff3
[difftool]
prompt = false
[difftool "kdiff3"]
path = C:/Program Files (x86)/KDiff3/kdiff3.exe
cmd = "$LOCAL" "$REMOTE"
以前の優れた回答の簡単な要約:
git difftool --tool-help
git config --global diff.tool <chosen tool>
git config --global --add difftool.prompt false
次に、次のように入力して使用します(オプションでファイル名も指定します)。
git difftool
序章
参考までに、 VonC's answerに私のバリエーションを含めたいと思います。PATH を変更した Git の MSys バージョン (現時点では 1.6.0.2) を使用しており、Bash シェルではなく PowerShell (または cmd.exe) から Git 自体を実行していることに注意してください。
新しいコマンドgitdiff
. このコマンドを一時的に実行するgit diff
と、選択したビジュアル差分プログラムを使用するように一時的にリダイレクトされます (永続的に行う VonC のソリューションとは対照的です)。git diff
これにより、デフォルトの Git diff 機能 ( ) とビジュアル diff 機能 ( )の両方を使用できますgitdiff
。どちらのコマンドも同じパラメーターを使用するため、たとえば、特定のファイルの変更を視覚的に比較するには、次のように入力できます
gitdiff path/file.txt
設定
$GitInstall
Git がインストールされているディレクトリのプレースホルダーとして使用されることに注意してください。
新しいファイルを作成し、
$GitInstall\cmd\gitdiff.cmd
@echo off setlocal for /F "delims=" %%I in ("%~dp0..") do @set path=%%~fI\bin;%%~fI\mingw\bin;%PATH% if "%HOME%"=="" @set HOME=%USERPROFILE% set GIT_EXTERNAL_DIFF=git-diff-visual.cmd set GIT_PAGER=cat git diff %* endlocal
新しいファイルを作成します(プレースホルダーを、選択した差分プログラムへのフル パスに
$GitInstall\bin\git-diff-visual.cmd
置き換えます)。[visual_diff_exe]
@echo off rem diff is called by git with 7 parameters: rem path old-file old-hex old-mode new-file new-hex new-mode echo Diffing "%5" "[visual_diff_exe]" "%2" "%5" exit 0
これで完了です。Git リポジトリ内から実行
gitdiff
すると、変更されたすべてのファイルに対してビジュアル diff プログラムが呼び出されるようになりました。
これは、Windows で動作するバッチ ファイルです。DiffMerge が既定の場所にインストールされていることを前提としており、x64 を処理し、必要に応じてバックスラッシュの置換を処理し、それ自体をインストールする機能を備えています。DiffMerge をお気に入りの diff プログラムに簡単に置き換えることができるはずです。
インストールするには:
gitvdiff --install
gitvdiff.bat:
@echo off
REM ---- Install? ----
REM To install, run gitvdiff --install
if %1==--install goto install
REM ---- Find DiffMerge ----
if DEFINED ProgramFiles^(x86^) (
Set DIFF="%ProgramFiles(x86)%\SourceGear\DiffMerge\DiffMerge.exe"
) else (
Set DIFF="%ProgramFiles%\SourceGear\DiffMerge\DiffMerge.exe"
)
REM ---- Switch forward slashes to back slashes ----
set oldW=%2
set oldW=%oldW:/=\%
set newW=%5
set newW=%newW:/=\%
REM ---- Launch DiffMerge ----
%DIFF% /title1="Old Version" %oldW% /title2="New Version" %newW%
goto :EOF
REM ---- Install ----
:install
set selfL=%~dpnx0
set selfL=%selfL:\=/%
@echo on
git config --global diff.external %selfL%
@echo off
:EOF
1.6.3 (1.6.3 は Git に difftool を追加) より前の Git バージョンで diff ツールを構成する方法の Linux バージョンについては、これは非常に簡潔なチュートリアルです。
簡単に言えば:
ステップ 1: これを .gitconfig に追加します
[diff]
external = git_diff_wrapper
[pager]
diff =
ステップ 2: git_diff_wrapper という名前のファイルを作成し、$PATH のどこかに配置します
#!/bin/sh
vimdiff "$2" "$5"
UbuntuでKompareを使用しています:
sudo apt-get install kompare
2 つのブランチを比較するには:
git difftool -t kompare <my_branch> master
私は~/.gitconfig
長い間ファイルでこのビットを使用してきました:
[diff]
external = ~/Dropbox/source/bash/git-meld
とgit-meld
:
#!/bin/bash
if [ "$DISPLAY" = "" ];
then
diff $2 $5
else
meld $2 $5
fi
しかし、今ではグラフィカル環境で常にMeldを使用することにうんざりしており、このセットアップで通常の diff を呼び出すのは簡単ではないため、次のように切り替えました。
[alias]
v = "!sh -c 'if [ $# -eq 0 ] ; then git difftool -y -t meld ; else git difftool -y $@ ; fi' -"
この設定では、次のようなことが機能します。
git v
git v --staged
git v -t kompare
git v --staged -t tkdiff
そして、私はまだ古き良きものを保つことができgit diff
ます。
Git/SVN diff の GUI ラッパーであるxdを試してみることをお勧めします。それ自体は差分ツールではありません。
実行xd
したいときに実行するgit diff
かsvn diff
、ファイルのリスト、プレビュー ウィンドウが表示され、tkdiff、xxdiff、gvimdiff、Emacs (ediff)、XEmacs (ediff)、Meldなど、好きな差分ツールを起動できます。ディフューズ、コンパレ、KDiff3。カスタム ツールを実行することもできます。
残念ながら、このツールは Windows をサポートしていません。
開示: 私はこのツールの作成者です。
コマンド ラインに慣れていない場合は、TortoiseGitをインストールすると、ファイルを右クリックして、「後で差分」オプションを含む TortoiseGit サブメニューを取得できます。
最初のファイルでこれを選択すると、2 番目のファイルを右クリックして、TortoiseGit サブメニューに移動し、「Diff with ==yourfilehere==. これにより、結果の TortoiseGit マージ GUI が提供されます。