794

git diff入力すると、選択したビジュアル差分ツール (Windows では SourceGear "diffmerge") で出力を表示したいと考えています。これを行うには git をどのように設定すればよいですか?

4

26 に答える 26

400

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)

gitcat
exit


それ(上記の記事)は、(環境変数ではなく)構成ファイルを介して定義された外部ツールの理論です。
実際には(外部ツールの構成ファイル定義については引き続き)、次を参照できます。

于 2008-10-31T23:03:43.460 に答える
219

上記の以前の「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のファイルの内容と終了リビジョンのファイルの内容が含まれます。
$BASEwor 内のファイルの内容を含む

基本的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方法です。

于 2009-06-04T08:25:41.700 に答える
117

このソリューションを試してください:

$ meld my_project_using_git

MeldはGitを理解し、最近の変更をナビゲートします。

于 2010-03-14T16:28:42.500 に答える
46

新しい 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

于 2009-08-27T09:39:30.063 に答える
43

Git バージョン 1.6.3 以降、お気に入りのグラフィカル diff ツールを使用するように構成できる" git difftool " があります。

現在サポートされている (この回答を書いている時点で) KDiff3KomparetkdiffMeldxxdiff、 emerge 、 vimdiff 、 gvimdiff 、 ecmerge 、Diffuse、およびopendiffです。使用したいツールがこのリストにない場合は、いつでも ' difftool.<tool>.cmd' 構成オプションを使用できます。

「git difftool」は「git diff」と同じオプションを受け入れます。

于 2009-05-23T11:37:18.927 に答える
25

これに1つ追加があります。デフォルト ツールの 1 つとしてサポートされていない差分アプリ (万華鏡など) を定期的に使用するのが好きです。

git difftool -t

diffまた、デフォルトを通常のコマンドラインにすることも好きなので、GIT_EXTERNAL_DIFF変数を設定することはオプションではありません。

次のコマンドを使用して、任意のdiffアプリを 1 回限り使用できます。

git difftool --extcmd=/usr/bin/ksdiff

指定したコマンドに2つのファイルを渡すだけなので、おそらくラッパーも必要ありません。

于 2011-02-03T00:16:47.537 に答える
20

ファイルの削除と追加に対処するための 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
于 2010-11-07T07:12:50.220 に答える
12

Windows/ MSYS Git向けソリューション

回答を読んだ後、1​​ つのファイルのみを変更するより簡単な方法を発見しました。

  1. 引数 2 と 5 を使用して、差分プログラムを呼び出すバッチ ファイルを作成します。このファイルは、パスのどこかにある必要があります。(場所がわからない場合は、C:\windowsに入れてください。)たとえば、「gitdiff.bat」と呼びます。私は:

    @echo off
    REM This is gitdiff.bat
    "C:\Program Files\WinMerge\WinMergeU.exe" %2 %5
    
  2. バッチ ファイルを指すように環境変数を設定します。例: GIT_EXTERNAL_DIFF=gitdiff.bat. または、PowerShell を使用して と入力しますgit config --global diff.external gitdiff.bat

    引用符を使用したり、パス情報を指定したりしないことが重要です。そうしないと機能しません。そのため、パスにgitdiff.batが必要です。

「git diff」と入力すると、外部の差分ビューアーが呼び出されます。

于 2009-02-21T19:10:35.320 に答える
9

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`
于 2010-03-30T17:42:42.490 に答える
8

これは Windows 7 で動作します。中間のshスクリプトは必要ありません。

.gitconfig の内容:

    [diff]
      tool = kdiff3

    [difftool]
       prompt = false

    [difftool "kdiff3"]
      path = C:/Program Files (x86)/KDiff3/kdiff3.exe
      cmd = "$LOCAL" "$REMOTE"
于 2012-02-02T21:26:34.793 に答える
7

以前の優れた回答の簡単な要約:

git difftool --tool-help
git config --global diff.tool <chosen tool>
git config --global --add difftool.prompt false

次に、次のように入力して使用します(オプションでファイル名も指定します)。

git difftool
于 2014-11-04T10:36:46.460 に答える
6

序章

参考までに、 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

設定

$GitInstallGit がインストールされているディレクトリのプレースホルダーとして使用されることに注意してください。

  1. 新しいファイルを作成し、$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
    
  2. 新しいファイルを作成します(プレースホルダーを、選択した差分プログラムへのフル パスに$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
    
  3. これで完了です。Git リポジトリ内から実行gitdiffすると、変更されたすべてのファイルに対してビジュアル diff プログラムが呼び出されるようになりました。

于 2008-12-25T15:44:25.967 に答える
6

これは、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
于 2009-04-09T02:21:04.757 に答える
6

Mac を使用していてXcodeを使用している場合は、FileMergeがインストールされています。端末コマンドは opendiff であるため、次のように実行できます。

git difftool -t opendiff
于 2011-09-04T09:03:16.483 に答える
5

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"
于 2009-10-22T13:28:44.330 に答える
1

UbuntuでKompareを使用しています:

sudo apt-get install kompare

2 つのブランチを比較するには:

git difftool -t kompare <my_branch> master
于 2010-02-15T17:33:30.977 に答える
1

私は~/.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ます。

于 2013-07-11T07:36:25.677 に答える
0

Git/SVN diff の GUI ラッパーであるxdを試してみることをお勧めします。それ自体は差分ツールではありません。

実行xdしたいときに実行するgit diffsvn diff、ファイルのリスト、プレビュー ウィンドウが表示され、tkdiff、xxdiff、gvimdiff、Emacs (ediff)、XEmacs (ediff)、Meldなど、好きな差分ツールを起動できます。ディフューズコンパレKDiff3。カスタム ツールを実行することもできます。

残念ながら、このツールは Windows をサポートしていません。

開示: 私はこのツールの作成者です。

于 2010-10-01T07:29:17.830 に答える
0

コマンド ラインに慣れていない場合は、TortoiseGitをインストールすると、ファイルを右クリックして、「後で差分」オプションを含む TortoiseGit サブメニューを取得できます。

最初のファイルでこれを選択すると、2 番目のファイルを右クリックして、TortoiseGit サブメニューに移動し、「Diff with ==yourfilehere==. これにより、結果の TortoiseGit マージ GUI が提供されます。

于 2016-01-11T14:58:17.600 に答える