「git diff」と入力すると、「diff -y」のように並べてdiffを表示したり、「kdiff3」のようなインタラクティブなdiffツールでdiffを表示したりします。これはどのように行うことができますか?
「git diff」と入力すると、「diff -y」のように並べてdiffを表示したり、「kdiff3」のようなインタラクティブなdiffツールでdiffを表示したりします。これはどのように行うことができますか?
回答:
Gitにはdiffの内部実装がありますが、代わりに外部ツールを設定できます。
外部差分ツールを指定するには、2つの方法があります。
GIT_EXTERNAL_DIFFおよびGIT_DIFF_OPTS環境変数を設定します。git config以下も参照してください。
git diff --helpを実行するとgit diff、Gitは上記の環境変数とその.gitconfigファイルの両方の設定をチェックします。
デフォルトでは、Gitは次の7つの引数をdiffプログラムに渡します。
path old-file old-hex old-mode new-file new-hex new-mode
通常、必要なのはold-fileおよびnew-fileパラメーターのみです。もちろん、ほとんどの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/Customizing-Git-Git-Configuration
meldか?
meldバージョンは私がのための差分を表示したいファイル(複数可)を選択することができ、ディレクトリの差分を、行うように構成することが?現在meld、ファイルごとに個別のコマンドを実行しておりmeld、次のファイルを表示するために終了する必要があります。Mercurialから使用したmeld場合に動作するように、変更されたファイルのディレクトリリストを表示したいのmeldですが。
のgit difftool代わりに使用しますgit diff。二度と戻ることはありません。
ここでは別のstackoverflowへのリンクはおよそ協議ということであるgit difftool: どのように私は私の好みのdiffツール/ビューアで「gitの差分」出力を表示していますか?
の新しいバージョンのgit場合、このdifftoolコマンドは、多くの外部差分ツールをそのまま使用できます。たとえば、vimdiff自動サポートされており、コマンドラインから次のようにして開くことができます。
cd /path/to/git/repo
git difftool --tool=vimdiff
サポートされてgit difftool --tool-helpいる他の外部diffツールは、ここに出力例です。
'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
This message is displayed because 'diff.tool' is not configured.。おそらく、このことを最小限の設定方法で回答を更新して、ターミナルでサイドバイサイドの差分を表示するようにします。これは、OPが要求するものです。GUIツールは、sshを使用して接続するリモートサーバーではまったく役に立ちません。
git difftoolwith vimdiffは常に2つのファイル/バッファを正しく整列させるとは限りません。
git difftool -yしてtkdiffプロンプトを防止します
git difftoolWindowsとLinuxで融合させる:stackoverflow.com/a/48979939/4561887
あなたも試すことができgit diff --word-diffます。これは厳密には並べて表示されるわけではありませんが、なんとなく優れているため、実際の並列表示のニーズよりも優先される場合があります。
git diff --word-diff=color
--word-diff=colorが無効なオプションエラーを表示します。どのバージョンで導入されましたか?
git diff --color-words動作します。
git diff --color-words最新のgitバージョンに進む方法です。
ydiff
以前はと呼ばれていたcdiffこのツールは、並べて表示したり、インクリメンタルでカラフルな差分を表示したりできます。
を実行する代わりにgit diff、以下を実行します。
ydiff -s -w0
これydiffにより、違いのあるファイルごとに並べて表示モードで起動します。
インストール:
python3 -m pip install --user ydiff
-または-
brew install ydiff
についてはgit log、以下を使用できます。
ydiff -ls -w0
-w0端末の幅を自動検出します。詳細とデモについては、ydiff GitHubリポジトリページをご覧ください。
Git 2.18.0、ydiff 1.1でテスト済み。
git diff | cdiff -sか?
ydiff -sgit / svn / hgワークスペースから実行するだけで、パイプする必要はありません
cd <git repo>実行する場合ydiff -ls <path/to/file>
次のように並べてdiff使用できsdiffます。
$ git difftool -y -x sdiff HEAD^ | less
ここHEAD^で、比較したいものに置き換える必要がある例を示します。
私はこの解決策を見つけました ここでが、他にもいくつか提案があります。しかし、この1つの答えはOPの質問を簡潔かつ明確にしたものです。
引数の説明については、git-difftoolを参照してください。
ボード上でコメントを取り、git sdiff次の実行可能スクリプトを記述することにより、便利なコマンドを作成できます。
#!/bin/sh
git difftool -y -x "sdiff -w $(tput cols)" "${@}" | less
それを保存/usr/bin/git-sdiffし、chmod -xそれ。次に、これを行うことができます:
$ git sdiff HEAD^
tput cols、代わりに次のように使用しますgit difftool -x "sdiff -s -w $(tput cols)"。
GitHubを使用せずにブラウザーでサイドバイサイドの差分を表示したい場合は、の代わりにgit webdiffを使用できますgit diff。
$ pip install webdiff
$ git webdiff
これは、tkdiff構文の強調表示や画像の差分の表示など、従来のGUI difftoolsに比べて多くの利点を提供します。
詳しくはこちらをご覧ください。
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
私はそれを「diffy」と呼びました。これdiff -yは、UNIXでのside-by-side diff だからです。Colordiffは、より良い色を追加します。オプション-ydwでyは、は並べて表示され、wは空白を無視し、dは最小の差分を生成します(通常、差分としてより良い結果が得られます)
-yはLaunch 'colordiff' [Y/n]:プロンプトをスキップします。
git alias diffy "difftool --extcmd=\"colordiff -ydw\""?そうじゃないのgit config --global alias.diffy "difftool --extcmd=\"colordiff -ydw\""?
UNIXの場合、just gitと組み込みを組み合わせdiffます:
git show HEAD:path/to/file | diff -y - path/to/file
もちろん、HEADを他のgit参照で置き換えることができ、おそらく-W 170diffコマンドに何かを追加したいでしょう。
これは、ディレクトリの内容を過去のコミットと比較していることを前提としています。2つのコミットの比較はより複雑です。シェルがbash「プロセス置換」を使用できる場合:
diff -y -W 170 <(git show REF1:path/to/file) <(git show REF2:path/to/file)
どこREF1とREF2gitの参照で-タグ、枝やハッシュ。
を続けている場合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
この質問は、違いを見つけるためにgit組み込みの方法を使用する高速な方法を探していたときに現れました。私の解決基準:
私はgitで色を取得するためにこの答えを見つけました。
行のdiffの代わりに並べてdiffを取得するには、この質問に対するmb14の優れた答えを次のパラメーターで微調整しました。
$ 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オプションは、小さな行の変更で大きなファイルを参照するときに、標準の行差分と比較して色分けされたサイドバイサイドのソースコードエクスペリエンスを取得するための色設定とともに役立つ可視性を備えています。
他のいくつかは、すでに述べたCDIFF gitのサイド・バイ・サイド差分のための誰もそれの完全な実施を与えませんでした。
セットアップ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エイリアスが必要です。
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ソースコードがあります。
ここにアプローチがあります。より少ない数のパイプを使用する場合、xtermの幅は80に設定され、それほど熱くありません。しかし、たとえばCOLS = 210でコマンドを続行すると、拡張されたxtermを利用できます。
gitdiff()
{
local width=${COLS:-$(tput cols)}
GIT_EXTERNAL_DIFF="diff -yW$width \$2 \$5; echo >/dev/null" git diff "$@"
}
Intellij IDEAを開き、[バージョン管理]ツールウィンドウで1つまたは複数のコミットを選択し、変更されたファイルを参照してダブルクリックし、各ファイルの変更を並べて検査します。
バンドルされたコマンドラインランチャーを使用すると、シンプルでどこにでもIDEAを起動できます idea some/path
このスレッドにはたくさんの良い答えがあります。この問題に対する私の解決策は、スクリプトを作成することでした。
これに「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
これは多少制限のあるソリューションかもしれませんが、diff外部ツールなしでシステムのコマンドを使用して仕事をします:
diff -y <(git show from-rev:the/file/path) <(git show to-rev:the/file/path)
--suppress-common-lines(diffオプションがサポートされている場合)。diffマーカーのみ--width=term-widthます。Bashでは、$COLUMNSまたはとして幅を取得できますtput cols。これはヘルパーgit-scriptにラップすることもできます。たとえば、次のように使用すると便利です。
git diffy the/file/path --from rev1 --to rev2