web-dev-qa-db-ja.com

好みの差分ツール/ビューアで 'git diff'の出力を見るにはどうすればいいですか?

git diffと入力したときに、選択した視覚的差分ツール(WindowsではSourceGear "diffmerge")を使用して出力を表示します。これを行うようにgitを設定するにはどうすればよいですか?

720
user3891

Git1.6.3以降では、git difftool script以下の私の答え _を使うことができます。


article が役に立ちます。ここに最高の部分があります:

外部差分ツールを指定する方法は2つあります。

最初の方法は、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)--

ご覧のとおり、diffツールには2番目( "old-file")と5番目( "new-file")の引数のみが渡されます。

2)タイプ

$ git config --global diff.external <path_to_wrapper_script>

プロンプトで、 "git-diff-wrapper.sh"へのパスに置き換えてください。

-->8-(snip)--
[diff]
    external = <path_to_wrapper_script>
--8<-(snap)--

ラッパースクリプトと差分ツールへのパスを指定するには、正しい構文を使用してください。つまり、バックスラッシュの代わりにスラッシュを使用してください。私の場合は、

[diff]
    external = \"c:/Documents and Settings/sschuber/git-diff-wrapper.sh\"

.gitconfigと

"d:/Program Files/Beyond Compare 3/BCompare.exe" "$2" "$5" | cat

ラッパースクリプトで。末尾の「猫」に気をつけて!

(私は '| cat'が適切なまたは一貫したリターンステータスを返さないかもしれないいくつかのプログラムにのみ必要であると思います。あなたのdiffツールが明示的なリターンステータスを持っているなら末尾の猫なしで試した方がいいです)

Diomidis Spinellisコメント内 を追加します。

diff(1) は、ファイルが異なる場合はデフォルトでエラーコードで終了するため、catコマンドが必要です。
Gitは、実際のエラーが発生した場合にのみ、外部のdiffプログラムがエラーコードで終了することを期待します。メモリが不足している場合.
gitの出力をcatにパイプ処理することによって、ゼロ以外のエラーコードがマスクされます。
より効率的には、プログラムは引数0でexitを実行することができます。)


それ(上記で引用した記事)は外部ツール設定ファイルを通して定義される)のための理論です(環境変数を通してではありません)。
実際には(まだ外部ツールの設定ファイル定義のために)、以下を参照することができます。

375
VonC

私の前の "diff.external" config answer aboveを完成させるには:

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には、ファイルの内容が格納されています。

それは基本的にgit-mergetoolがgit index/worktreeを操作するように修正されています。

このスクリプトの通常の使用例は、段階的または段階的な変更を行っていて、その変更を横に並べた差分ビューアで確認したい場合です(例:xxdifftkdiffなど)。

git difftool [<filename>*]

別のユースケースは、同じ情報を見たいが任意のコミットを比較している場合です(これは改訂構文解析がより良い可能性がある部分です)

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 以降、外部ツールのインスタンスを一度実行するのではなく、2つの一時ディレクトリを作成した後に一度に2つのディレクトリ階層を比較できる外部差分ツールを起動するためのオプション--dir-diffがありますファイルペアごとに。


Git 2.5の前に

あなたのカスタム差分ツールでdifftoolを設定するための実用的なケース:

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

あなたのPATHのディレクトリ部分にwinmerge.shが保存されている状態で:

#!/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 configディレクティブを作成してください。
そうするとdiff.tool設定で簡単にツールを切り替えることができます。

他にも詳細を追加するには、この Dave によるブログエントリ)もあります。
(または この質問winmergeuオプションの場合)

この設定に興味があるのはwinmerge.shscript です。特別な場合を考慮してカスタマイズできます。

例えば、 David Marble以下を扱う例については の回答)を参照してください。

  • 起点または終点のいずれかにあるnewファイル
  • 起点または終点のいずれかにある削除済みファイル

Kem Mason彼の答え で言及しているので、--extcmdオプションを使用することでラッパーを避けることもできます

--extcmd=<command>

差分を表示するためのカスタムコマンドを指定します。このオプションが指定されると、git-difftoolは構成されたデフォルトを無視し、$command $LOCAL $REMOTEを実行します。

たとえば、これは gitkが任意のdiff tool を実行または使用する方法です。

204
VonC

尋ねられるものとは多少異なる質問に答えるという精神で。この解決策を試してください。

$ meld my_project_using_git

Meldはgitを理解しており、最近の変更をナビゲートすることができます。

107
Charles Merriam

Gitバージョン1.6.3以降、 "git difftool"があり、お気に入りのグラフィカルなdiffツールを使うように設定できます。現在サポートされている標準設定はkdiff3、kompare、tkdiff、meld、xxdiff、emerge、vimdiff、gvimdiff、ecmerge、diffuseおよびopendiffです。使用したいツールがこのリストにない場合は、常に 'difftool.<tool>.cmd'設定オプションを使用できます。

"git difftool"は "git diff"と同じオプションを受け付けます。

39
Jakub Narębski

新しいgit difftoolでは、これを.gitconfigファイルに追加するのと同じくらい簡単です。

[diff]
    tool = any-name
[difftool "any-name"]
    cmd = "\"C:/path/to/my/ext/diff.exe\" \"$LOCAL\" \"$REMOTE\""

また、diffall をチェックしてください。これは、それぞれが順番に開く迷惑な(IMO)デフォルトのdiff動作を拡張するために書いた簡単なスクリプトです。

36

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

git difftool -t

また、デフォルトのdiffを通常のコマンドラインにしたいだけなので、GIT_EXTERNAL_DIFF変数を設定することは選択肢になりません。

このコマンドでは、任意のdiffアプリを一時的なものとして使用できます。

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

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

23
Kem Mason

ファイルの削除や追加に対処するための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
17
David Marble

Windows/msys git用のソリューション

答えを読んだ後、私は1つのファイルだけを変更することを含むより簡単な方法を発見しました。

  1. 引数2と5を使用して、diffプログラムを起動するためのバッチファイルを作成します。このファイルは、パスのどこかにある必要があります。 (あなたがそれがどこにあるかわからないならば、それを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"とタイプすると、外部のdiffビューアが起動します。

11
Steve Hanov

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`
9
idbrii

他の外部差分ツールを見たところ、IntelliJ IDEA(およびAndroid Studio)のdiffビューが私にとって最適なものであることがわかりました。

手順1 - IntelliJ IDEAをコマンドラインから実行するように設定する

あなたの差分ツールとしてIntelliJ IDEAを使いたい場合は、最初にIntelliJ IDEAをコマンドラインから実行するように設定する必要があります ここ

macOSまたはUNIXの場合:

  1. IntelliJ IDEAが実行中であることを確認してください。
  2. メインメニューでTools | Create Command-line Launcherを選択します。ダイアログボックスの[ランチャースクリプトの作成]が開き、推奨されるパスとランチャースクリプトの名前が表示されます。デフォルトを受け入れることも、独自のパスを指定することもできます。後で必要になるので、気を付けてください。 IntelliJ IDEAの外側で、ランチャースクリプトのパスと名前をパスに追加します。

Windowsの場合:

  1. Pathシステム環境変数で、IntelliJ IDEA実行可能ファイルの場所を指定します。この場合、IntelliJ IDEA実行可能ファイルおよびその他のIntelliJ IDEAコマンドを任意のディレクトリから呼び出すことができます。

ステップ2 - difftoolとしてIntelliJ IDEAを使用するようにgitを設定します

このブログ記事の指示に従ってください

バッシュ

export INTELLIJ_HOME /Applications/IntelliJ\ IDEA\ CE.app/Contents/MacOS
PATH=$IDEA_HOME $PATH

set INTELLIJ_HOME /Applications/IntelliJ\ IDEA\ CE.app/Contents/MacOS
set PATH $INTELLIJ_HOME $PATH

それでは、gitの設定に以下を追加してください。

[merge]
   tool = intellij
[mergetool "intellij"]
   cmd = idea merge $(cd $(dirname "$LOCAL") && pwd)/$(basename "$LOCAL") $(cd $(dirname "$REMOTE") && pwd)/$(basename "$REMOTE") $(cd $(dirname "$BASE") && pwd)/$(basename "$BASE") $(cd $(dirname "$MERGED") && pwd)/$(basename "$MERGED")
   trustExitCode = true
[diff]
   tool = intellij
[difftool "intellij"]
   cmd = idea diff $(cd $(dirname "$LOCAL") && pwd)/$(basename "$LOCAL") $(cd $(dirname "$REMOTE") && pwd)/$(basename "$REMOTE")

git difftoolまたはgit difftool HEAD~1で試すことができます。

8
David Rawson

上記のすばらしい答えの簡単な要約:

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

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

git difftool
7
user2443147

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

.gitconfigの内容

    [diff]
      tool = kdiff3

    [difftool]
       Prompt = false

    [difftool "kdiff3"]
      path = C:/Program Files (x86)/KDiff3/kdiff3.exe
      cmd = "$LOCAL" "$REMOTE"
7
Sharas

これは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
6
Brad Robinson

Macを使用していてXCodeを持っている場合は、FileMergeがインストールされています。端末コマンドはopendiffなので、git difftool -t opendiffだけを実行できます。

6
LuxuryMode

前書き

参考のために、私はVonCの回答に自分のバリエーションを含めたいと思います。私は、PATHを変更したMSysバージョンのGit(現時点では1.6.0.2)を使用しており、BashシェルではなくPowershell(またはcmd.exe)からGit自体を実行していることに注意してください。

私は新しいコマンドgitdiffを導入しました。このコマンドを一時的に実行すると、git diffが選択した視覚的なdiffプログラムを使用するようにリダイレクトされます(VonCの解決方法は永久に行われます)。これにより、デフォルトのGit diff機能(git diff)と視覚的なdiff機能(gitdiff)の両方を持つことができます。どちらのコマンドも同じパラメータを取ります。たとえば、特定のファイルの変更を視覚的に比較するには、次のように入力します。

gitdiff path/file.txt

セットアップ

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

  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プログラムを起動するはずです。

6
Milan Gardian

1.6.3より前のgitバージョンで差分ツールを設定する方法のLinuxバージョン(1.6.3はgitにdifftoolを追加しました) これ はとても簡潔なチュートリアルです。

簡単に言うと:

ステップ1:これをあなたの.gitconfigファイルに追加してください。

[diff]
  external = git_diff_wrapper
[pager]
  diff =

ステップ2:git_diff_wrapperという名前のファイルを作成し、それをあなたの$ PATHのどこかに置く

#!/bin/sh

vimdiff "$2" "$5"
5
Fire Crow

Meldをインストール

 # apt-get install meld

それからdifftoolとしてそれを選んでください

 $ git config --global diff.tool meld

コンソールタイプで実行したい場合は、

 $ git difftool

グラフィックモードを使いたい場合は、

 $ git mergetool

そして出力は次のようになります。

 'git mergetool' will now attempt to use one of the following tools:
 meld opendiff kdiff3 tkdiff xxdiff tortoisemerge gvimdiff diffuse
 diffmerge ecmerge p4merge araxis bc3 codecompare emerge vimdiff
 Merging:
 www/css/style.css
 www/js/controllers.js

 Normal merge conflict for 'www/css/style.css':
   {local}: modified file
   {remote}: modified file
 Hit return to start merge resolution tool (meld):

それで、単にエンターを押してmeld(デフォルト)を使うと、これはグラフィックモードを開いて、魔法を保存し、それを押すとマージが解決されます。それで全部です

5
G. I. Joe

Mac OS Xでは、

git difftool -t diffuse 

gitフォルダで仕事をしてくれます。 diffuseをインストールするために、portを使うことができます -

Sudo port install diffuse
4
Shreyas

git difftoolを使うことができます。

たとえば、 meld がある場合、ブランチmasterdevelを次のように編集できます。

git config --global diff.external meld
git difftool master..devel
3
suhailvs

以下は他の答えからここで収集することができますが、私にとっては難しい(情報が多すぎる)ので、ここにtkdiffに対する 'ちょうどそれをタイプイン'の答えがあります:

git difftool --tool=tkdiff <path to the file to be diffed>

あなたはtkdiffの代わりにあなたの好きなdiffingツールの実行可能ファイル名を使うことができます。 (例えばtkdiff)(またはあなたのお気に入りのdiffingツール)があなたのPATHにある限り、それは起動されます。

2
dolphus333

私は(tkdiffで)ここで空想のものを試してみましたが、何も私のために働きませんでした。それで、私は以下のスクリプト、tkgitdiffを書きました。それは私がする必要があることをします。

$ cat tkgitdiff
#!/bin/sh

#
# tkdiff for git.
# Gives you the diff between HEAD and the current state of your file.
#

newfile=$1
git diff HEAD -- $newfile > /tmp/patch.dat
cp $newfile /tmp
savedPWD=$PWD
cd /tmp
patch -R $newfile < patch.dat
cd $savedPWD
tkdiff /tmp/$newfile $newfile
2

私は~/.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を手に入れることができます。

1
abo-abo

ファイルタイプに関連付けられた差分ツールがすでにある場合(たとえば、差分ビューアが付属しているTortoiseSVNをインストールしたため)、通常のgit diff出力を "temp"ファイルにパイプするだけで、そのファイルを直接開くことができます。視聴者について何か知っている:

git diff > "~/temp.diff" && start "~/temp.diff"

グローバルエイリアスとして設定するとさらにうまくいきます:git what

[alias]
    what = "!f() { git diff > "~/temp.diff" && start "~/temp.diff"; }; f"
0
drzaus

あなたはxd http://github.com/jiqingtang/xd を試してみることをお勧めします。これはGIT/SVN diffのGUIラッパーです。それ自体は差分ツールではありません。 git diffまたはsvn diffを実行したいときにxdを実行すると、ファイルのリスト、プレビューウィンドウが表示され、tkdiff、xxdiff、gvimdiff、emacs(ediff)、xemacs(ediff)など、好きな差分ツールを起動できます、meld、diffuse、kompare、およびkdiff3。カスタムツールを実行することもできます。

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

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

0
Jiqing Tang

私はUbuntuでkompareを使用します。

Sudo apt-get install kompare

2つの分岐を比較するには

git difftool -t kompare <my_branch> master
0
Bilal and Olga

もしあなたがコマンドライン用のものでなければ、もしあなたがtortoise gitをインストールするなら、あなたは "Diff later"オプションでtortoisegitサブメニューを得るためにファイルを右クリックすることができます。

最初のファイルでこれを選択すると、次に2番目のファイルを右クリックして、tortoisegitサブメニューに行き、 "Diff with == yourfilehere =="を選択します。これにより、結果に対してtortoisegitmerge guiが得られます。

0
user3270579