「git diff」と入力すると、「diff -y」を使用したり、「kdiff3」などのインタラクティブな差分ツールで差分を表示したりするなど、横並びの差分が表示されます。これをどのように行うことができますか?
Gitにはdiffの内部実装がありますが、代わりに外部ツールをセットアップできます。
外部差分ツールを指定するには、2つの異なる方法があります。
GIT_EXTERNAL_DIFF
およびGIT_DIFF_OPTS
環境変数を設定します。git config
を介した外部diffツールの構成こちらもご覧ください:
git diff --help
git diff
を実行すると、Gitは上記の環境変数とその.gitconfig
ファイルの両方の設定をチェックします。
デフォルトでは、Gitは次の7つの引数をdiffプログラムに渡します。
path old-file old-hex old-mode new-file new-hex new-mode
通常は、古いファイルと新しいファイルのパラメーターのみが必要です。もちろん、ほとんどのdiffツールは引数として2つのファイル名のみを取ります。これは、Gitがスクリプトに提供する引数を受け取り、選択した外部gitプログラムに引き渡す小さなラッパースクリプトを記述する必要があることを意味します。
ラッパースクリプトを~/scripts/my_diff.sh
の下に置いたとしましょう:
#!/bin/bash
# un-comment one diff tool you'd like to use
# side-by-side diff with custom options:
# /usr/bin/sdiff -w200 -l "$2" "$5"
# using kdiff3 as the side-by-side diff:
# /usr/bin/kdiff3 "$2" "$5"
# using Meld
/usr/bin/meld "$2" "$5"
# using VIM
# /usr/bin/vim -d "$2" "$5"
次に、そのスクリプトを実行可能にする必要があります。
chmod a+x ~/scripts/my_diff.sh
次に、カスタムdiffラッパースクリプトを見つける方法と場所をGitに伝える必要があります。その方法は3つあります(.gitconfigファイルを編集することをお勧めします)。
GIT_EXTERNAL_DIFF
、GIT_DIFF_OPTS
を使用
例えば.bashrcまたは.bash_profileファイルで次を設定できます。
GIT_EXTERNAL_DIFF=$HOME/scripts/my_diff.sh
export GIT_EXTERNAL_DIFF
git config
を使用
「git config」を使用して、ラッパースクリプトの場所を定義します。
git config --global diff.external ~/scripts/my_diff.sh
~/.gitconfig
ファイルの編集
~/.gitconfig
ファイルを編集して、次の行を追加できます。
[diff]
external = ~/scripts/my_diff.sh
注意:
カスタムdiffツールをインストールするのと同様に、カスタムマージツールをインストールすることもできます。これは、マージの視覚化に役立つ視覚的なマージツールです。 (progit.orgページを参照)
参照: http://fredpalma.com/518/visual-diff-and-merge-tool/ および https://git-scm.com/book/en/v2/カスタマイズ-Git-Git-Configuration
git difftool
の代わりにgit diff
を使用します。あなたは二度と戻りません。
git difftool
について説明する別のstackoverflowへのリンクは次のとおりです。 好みのdiffツール/ビューアで 'git diff'出力を表示するにはどうすればよいですか?
git
の新しいバージョンの場合、difftool
コマンドは、すぐに使用できる多くの外部diffツールをサポートします。たとえば、vimdiff
は自動的にサポートされており、コマンドラインから次の方法で開くことができます。
cd /path/to/git/repo
git difftool --tool=vimdiff
サポートされている他の外部diffツールは、git difftool --tool-help
を介してリストされています。出力例を次に示します。
'git difftool --tool=<tool>' may be set to one of the following:
araxis
kompare
vimdiff
vimdiff2
The following tools are valid, but not currently available:
bc3
codecompare
deltawalker
diffuse
ecmerge
emerge
gvimdiff
gvimdiff2
kdiff3
meld
opendiff
tkdiff
xxdiff
git diff --Word-diff
を試すこともできます。それは正確に並んでいるわけではありませんが、どういうわけかより良いので、実際の並列のニーズよりも好むかもしれません。
ydiff
以前はcdiff
と呼ばれていましたが、このツールではside-by-、incremental、およびcolorfuldiff。
git diff
を行う代わりに、次のようにします。
ydiff -s
これにより、ydiff
が、異なるファイルのそれぞれについて横並び表示モードで起動されます。
でインストール:
python3 -m pip install --user ydiff
git log
には、次を使用できます。
ydiff -ls
詳細とデモについては、ydiff
GitHubリポジトリページ を参照してください。
Git 2.18.0、ydiff 1.1でテスト済み。
次のようにdiff
を使用して、並べてsdiff
を実行できます。
$ git difftool -y -x sdiff HEAD^ | less
HEAD^
は、比較したいものに置き換える必要がある例です。
私はこの解決策を見つけました here 他にもいくつかの提案があります。ただし、この1つの答えは、OPの質問を簡潔かつ明確に示しています。
引数の説明については man git-difftool をご覧ください。
ボード上のコメントを取得して、次の実行可能スクリプトを記述することにより、便利なgit sdiff
コマンドを作成できます。
#!/bin/sh
git difftool -y -x "sdiff -w $(tput cols)" "${@}" | less
/usr/bin/git-sdiff
およびchmod -x
という名前で保存します。次に、これを行うことができます:
$ git sdiff HEAD^
export GIT_EXTERNAL_DIFF='meld $2 $5; echo >/dev/null'
その後、単に:
git diff
GitHubを使用せずにブラウザでdiffを並べて表示したい場合は、git diff
のドロップイン置換である git webdiff をお楽しみください。
$ pip install webdiff
$ git webdiff
これにより、tkdiff
のような従来のGUI difftoolsに比べて、構文の強調表示とイメージの差分の表示が可能になるという点で多くの利点があります。
詳細については、こちらをご覧ください こちら 。
colordiff を使用します。
Mac OS Xでは、次のコマンドでインストールします
$ Sudo port install colordiff
Linuxでは、ディストリビューションに応じてapt get install colordiff
またはそのようなものになる可能性があります。
次に:
$ git difftool --extcmd="colordiff -ydw" HEAD^ HEAD
または、エイリアスを作成します
$ git alias diffy "difftool --extcmd=\"colordiff -ydw\""
その後、あなたはそれを使用することができます
$ git diffy HEAD^ HEAD
diff -y
はUnixの並列diffであるため、これを「diffy」と呼びました。 Colordiffはまた、色を追加します。オプション-ydw
では、y
はサイドバイサイド用で、w
は空白を無視し、d
は最小の差分を生成します(通常はdiffとしてより良い結果が得られます)
UNIXの場合、git
と組み込みのdiff
のみを組み合わせます。
git show HEAD:path/to/file | diff -y - path/to/file
もちろん、HEADを他のgit参照に置き換えることができ、おそらく-W 170
のようなものをdiffコマンドに追加したいでしょう。
これは、ディレクトリの内容を過去のコミットと単に比較していることを前提としています。 2つのコミットの比較はより複雑です。シェルがbash
の場合、「プロセス置換」を使用できます。
diff -y -W 170 <(git show REF1:path/to/file) <(git show REF2:path/to/file)
REF1
およびREF2
はgit参照(タグ、ブランチ、ハッシュ)です。
個人的には icdiff !
Mac OS X
でHomeBrew
を使用している場合は、brew install icdiff
を実行してください。
ファイルラベルを正しく取得するために、その他のクールな機能を追加するには、~/.gitconfig
に次のようにします。
[pager]
difftool = true
[diff]
tool = icdiff
[difftool "icdiff"]
cmd = icdiff --head=5000 --highlight --line-numbers -L \"$BASE\" -L \"$REMOTE\" \"$LOCAL\" \"$REMOTE\"
そして、私はそれを次のように使用します:git difftool
これがアプローチです。パイプスルーを少なくすると、xtermの幅は80に設定されますが、それほど熱くありません。しかし、コマンドを続行すると、例えばCOLS = 210、拡張xtermを利用できます。
gitdiff()
{
local width=${COLS:-$(tput cols)}
GIT_EXTERNAL_DIFF="diff -yW$width \$2 \$5; echo >/dev/null" git diff "$@"
}
他のいくつかの人が既に言及しました cdiff git side-by-side diffingのために、誰もそれの完全な実装を与えませんでした。
Cdiffのセットアップ:
git clone https://github.com/ymattw/cdiff.git
cd cdiff
ln -s `pwd`/cdiff ~/bin/cdiff
hash -r # refresh your PATH executable in bash (or 'rehash' if you use tcsh)
# or just create a new terminal
次の行を挿入して〜/ .gitconfigを編集します。
[pager]
diff = false
show = false
[diff]
tool = cdiff
external = "cdiff -s $2 $5 #"
[difftool "cdiff"]
cmd = cdiff -s \"$LOCAL\" \"$REMOTE\"
[alias]
showw = show --ext-dif
CdiffをDiffと連携させるにはページャーoffが必要です。基本的にはページャーなので、これで問題ありません。 Difftoolは、これらの設定に関係なく機能します。
Git showは引数を介した外部diffツールのみをサポートするため、show aliasが必要です。
Diff外部コマンドの最後にある「#」は重要です。 Gitのdiffコマンドはdiffコマンドに$ @(使用可能なすべてのdiff変数)を追加しますが、2つのファイル名のみが必要です。したがって、これらの2つを$ 2と$ 5で明示的に呼び出してから、コメントの後ろに$ @を非表示にします。そうしないとsdiffが混乱します。次のようなエラーが発生します。
fatal: <FILENAME>: no such path in the working tree
Use 'git <command> -- <path>...' to specify paths that do not exist locally.
サイドバイサイドの差分を生成するGitコマンド:
git diff <SHA1> <SHA2>
git difftool <SHA1> <SHA2>
git showw <SHA>
Cdiffの使用法:
'SPACEBAR' - Advances the page of the current file.
'Q' - Quits current file, thus advancing you to the next file.
これで、git diffとdifftoolを介した並列diffができました。また、必要に応じてパワーユーザーカスタマイズ用のcdiff pythonソースコードがあります。
この質問は、git builtinを使用して違いを見つけるための高速な方法を探していたときに現れました。私の解決基準:
Gitで色を取得するために この回答 を見つけました。
行差分の代わりに並列差分を取得するには、次のパラメータを使用してこの質問で mb14 の優れた answer を調整しました。
$ git diff --Word-diff-regex="[A-Za-z0-9. ]|[^[:space:]]"
余分な[-または{+が気に入らない場合は、オプション--Word-diff=color
を使用できます。
$ git diff --Word-diff-regex="[A-Za-z0-9. ]|[^[:space:]]" --Word-diff=color
これにより、jsonとxmlの両方のテキストとJavaコードを適切に比較することができました。
要約すると、--Word-diff-regex
オプションは、色の設定とともに有用な可視性を備えており、小さな行を変更して大きなファイルを閲覧するときに、標準の行のdiffと比較して色分けされたソースコードエクスペリエンスを取得します。
Macを使用している場合、GitUp http://gitup.co/ は非常に良い選択です。
このスレッドには多くの良い答えがあります。この問題に対する私の解決策は、スクリプトを書くことでした。
この「git-scriptname」という名前を付けて(実行可能にし、他のスクリプトと同様にPATHに入れます)、実行することで通常のgitコマンドのように呼び出すことができます
$ git scriptname
実際の機能は最後の行です。ソースは次のとおりです。
#!/usr/bin/env zsh
#
# Show a side-by-side diff of a particular file how it currently exists between:
# * the file system
# * in HEAD (latest committed changes)
function usage() {
cat <<-HERE
USAGE
$(basename $1) <file>
Show a side-by-side diff of a particular file between the current versions:
* on the file system (latest edited changes)
* in HEAD (latest committed changes)
HERE
}
if [[ $# = 0 ]]; then
usage $0
exit
fi
file=$1
diff -y =(git show HEAD:$file) $file | pygmentize -g | less -R
Intellij IDEA を開き、「バージョン管理」ツールウィンドウで単一または複数のコミットを選択し、変更されたファイルを参照し、ダブルクリックして各ファイルの変更を並べて検査します。
バンドルされたコマンドラインランチャーを使用すると、簡単なidea some/path
でどこでもIDEAを起動できます。