git diff
と入力したときに、選択した視覚的差分ツール(WindowsではSourceGear "diffmerge")を使用して出力を表示します。これを行うようにgitを設定するにはどうすればよいですか?
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
を実行することができます。)
それ(上記で引用した記事)は外部ツール設定ファイルを通して定義される)のための理論です(環境変数を通してではありません)。
実際には(まだ外部ツールの設定ファイル定義のために)、以下を参照することができます。
私の前の "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を操作するように修正されています。このスクリプトの通常の使用例は、段階的または段階的な変更を行っていて、その変更を横に並べた差分ビューアで確認したい場合です(例:
xxdiff
、tkdiff
など)。
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.sh
script です。特別な場合を考慮してカスタマイズできます。
例えば、 David Marble の 以下を扱う例については の回答)を参照してください。
Kem Mason が 彼の答え で言及しているので、--extcmd
オプションを使用することでラッパーを避けることもできます :
--extcmd=<command>
差分を表示するためのカスタムコマンドを指定します。このオプションが指定されると、
git-difftool
は構成されたデフォルトを無視し、$command $LOCAL $REMOTE
を実行します。
たとえば、これは gitk
が任意のdiff
tool を実行または使用する方法です。
尋ねられるものとは多少異なる質問に答えるという精神で。この解決策を試してください。
$ meld my_project_using_git
Meldはgitを理解しており、最近の変更をナビゲートすることができます。
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"と同じオプションを受け付けます。
新しいgit difftoolでは、これを.gitconfigファイルに追加するのと同じくらい簡単です。
[diff]
tool = any-name
[difftool "any-name"]
cmd = "\"C:/path/to/my/ext/diff.exe\" \"$LOCAL\" \"$REMOTE\""
また、diffall をチェックしてください。これは、それぞれが順番に開く迷惑な(IMO)デフォルトのdiff動作を拡張するために書いた簡単なスクリプトです。
これに1つ追加しました。デフォルトツールの1つとしてはサポートされていない差分アプリ(万華鏡など)を定期的に使用します。
git difftool -t
また、デフォルトのdiff
を通常のコマンドラインにしたいだけなので、GIT_EXTERNAL_DIFF
変数を設定することは選択肢になりません。
このコマンドでは、任意のdiff
アプリを一時的なものとして使用できます。
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
答えを読んだ後、私は1つのファイルだけを変更することを含むより簡単な方法を発見しました。
引数2と5を使用して、diffプログラムを起動するためのバッチファイルを作成します。このファイルは、パスのどこかにある必要があります。 (あなたがそれがどこにあるかわからないならば、それを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"とタイプすると、外部の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`
他の外部差分ツールを見たところ、IntelliJ IDEA(およびAndroid Studio)のdiff
ビューが私にとって最適なものであることがわかりました。
あなたの差分ツールとしてIntelliJ IDEAを使いたい場合は、最初にIntelliJ IDEAをコマンドラインから実行するように設定する必要があります ここ :
macOSまたはUNIXの場合:
Tools | Create Command-line Launcher
を選択します。ダイアログボックスの[ランチャースクリプトの作成]が開き、推奨されるパスとランチャースクリプトの名前が表示されます。デフォルトを受け入れることも、独自のパスを指定することもできます。後で必要になるので、気を付けてください。 IntelliJ IDEAの外側で、ランチャースクリプトのパスと名前をパスに追加します。Windowsの場合:
バッシュ
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
で試すことができます。
上記のすばらしい答えの簡単な要約:
git difftool --tool-help
git config --global diff.tool <chosen tool>
git config --global --add difftool.Prompt false
それから次のように入力して使用します(オプションでファイル名も指定します)。
git difftool
これはWindows 7で私のために動作します。中間のshスクリプトは必要ありません。
.gitconfigの内容
[diff]
tool = kdiff3
[difftool]
Prompt = false
[difftool "kdiff3"]
path = C:/Program Files (x86)/KDiff3/kdiff3.exe
cmd = "$LOCAL" "$REMOTE"
これは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
Macを使用していてXCodeを持っている場合は、FileMergeがインストールされています。端末コマンドはopendiffなので、git difftool -t opendiff
だけを実行できます。
参考のために、私は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がインストールされているディレクトリのプレースホルダーとして使われていることに注意してください。
新しいファイル$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プログラムを起動するはずです。
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"
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(デフォルト)を使うと、これはグラフィックモードを開いて、魔法を保存し、それを押すとマージが解決されます。それで全部です
Mac OS Xでは、
git difftool -t diffuse
gitフォルダで仕事をしてくれます。 diffuseをインストールするために、portを使うことができます -
Sudo port install diffuse
git difftool
を使うことができます。
たとえば、 meld がある場合、ブランチmaster
とdevel
を次のように編集できます。
git config --global diff.external meld
git difftool master..devel
以下は他の答えからここで収集することができますが、私にとっては難しい(情報が多すぎる)ので、ここにtkdiffに対する 'ちょうどそれをタイプイン'の答えがあります:
git difftool --tool=tkdiff <path to the file to be diffed>
あなたはtkdiffの代わりにあなたの好きなdiffingツールの実行可能ファイル名を使うことができます。 (例えばtkdiff)(またはあなたのお気に入りのdiffingツール)があなたのPATHにある限り、それは起動されます。
私は(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
私は~/.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
を手に入れることができます。
ファイルタイプに関連付けられた差分ツールがすでにある場合(たとえば、差分ビューアが付属しているTortoiseSVNをインストールしたため)、通常のgit diff
出力を "temp"ファイルにパイプするだけで、そのファイルを直接開くことができます。視聴者について何か知っている:
git diff > "~/temp.diff" && start "~/temp.diff"
グローバルエイリアスとして設定するとさらにうまくいきます:git what
[alias]
what = "!f() { git diff > "~/temp.diff" && start "~/temp.diff"; }; f"
あなたは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をサポートしていません。
開示 :私はこのツールの作者です。
私はUbuntuでkompareを使用します。
Sudo apt-get install kompare
2つの分岐を比較するには
git difftool -t kompare <my_branch> master
もしあなたがコマンドライン用のものでなければ、もしあなたがtortoise gitをインストールするなら、あなたは "Diff later"オプションでtortoisegitサブメニューを得るためにファイルを右クリックすることができます。
最初のファイルでこれを選択すると、次に2番目のファイルを右クリックして、tortoisegitサブメニューに行き、 "Diff with == yourfilehere =="を選択します。これにより、結果に対してtortoisegitmerge guiが得られます。