「git diff」を実行すると、どうすれば並べてdiffを取得できますか?


163

「git diff」と入力すると、「diff -y」のように並べてdiffを表示したり、「kdiff3」のようなインタラクティブなdiffツールでdiffを表示したりします。これはどのように行うことができますか?




回答:


89

Gitにはdiffの内部実装がありますが、代わりに外部ツールを設定できます。

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

  1. GIT_EXTERNAL_DIFFおよびGIT_DIFF_OPTS環境変数を設定します。
  2. を介して外部差分ツールを構成する git config

以下も参照してください。

を実行すると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ファイルを編集することをお勧めします)

  1. 使用してGIT_EXTERNAL_DIFFGIT_DIFF_OPTS

    たとえば、.bashrcまたは.bash_profileファイルで次のように設定できます。

    GIT_EXTERNAL_DIFF=$HOME/scripts/my_diff.sh
    export GIT_EXTERNAL_DIFF
    
  2. 使用する git config

    「git config」を使用して、ラッパースクリプトが見つかる場所を定義します。

    git config --global diff.external ~/scripts/my_diff.sh
    
  3. ~/.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


1
これはgitターミナルのカラーリングを保持しますか?
Sridhar Sarnobat 2013

3
これはすばらしいことですが、すべてのファイルに対して新しいビューアを起動します。たとえば、統合された差分を作成する方法はありますmeldか?
HRJ 2013年

2
@Tilo私はvimのエラーをimとして取得しています:警告:出力は端末ではありません
デッドプログラマ

することができますmeldバージョンは私がのための差分を表示したいファイル(複数可)を選択することができ、ディレクトリの差分を、行うように構成することが?現在meld、ファイルごとに個別のコマンドを実行しておりmeld、次のファイルを表示するために終了する必要があります。Mercurialから使用したmeld場合に動作するように、変更されたファイルのディレクトリリストを表示したいのmeldですが。
kasperd

163

git difftoolを試す

git difftool代わりに使用しますgit diff。二度と戻ることはありません。

使用例を追加するためのUPDATE:

ここでは別の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

34
または多分あなたはもしあなたが戻ったら戻るでしょうThis message is displayed because 'diff.tool' is not configured.。おそらく、このことを最小限の設定方法で回答を更新して、ターミナルでサイドバイサイドの差分を表示するようにします。これは、OPが要求するものです。GUIツールは、sshを使用して接続するリモートサーバーではまったく役に立ちません。
Petr

1
興味深い点ですが、SSHの実行中に個人的にgitを使用する必要があったことはないと思います。DVCSの良い点の1つは分散部分です:少なくとも私の環境では、私が持ち歩きたいレポをローカルで複製するのは面倒ではありません。
マットボール

1
少なくとも私の設定では、git difftoolwith vimdiffは常に2つのファイル/バッファを正しく整列させるとは限りません。
Rohmer 2017

1
それはいいので、以下の回答リストの下で:OIを使用git difftool -yしてtkdiffプロンプトを防止します
harshvchawla

関連:git difftoolWindowsとLinuxで融合させる:stackoverflow.com/a/48979939/4561887
Gabriel Staples

55

あなたも試すことができgit diff --word-diffます。これは厳密には並べて表示されるわけではありませんが、なんとなく優れているため、実際の並列表示のニーズよりも優先される場合があります。


12
これが最も簡単な方法です。さらに良いのはgit diff --word-diff=color
Rolf

@Rolf --word-diff=colorが無効なオプションエラーを表示します。どのバージョンで導入されましたか?
Holloway

@Trengot私は2012
Rolf

4
@Rolfのデフォルトでインストールされるバージョンは1.7.1です。違いを説明できます。git diff --color-words動作します。
Holloway

4
はい、git diff --color-words最新のgitバージョンに進む方法です。
VasiliNovikov 2017年

41

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でテスト済み。


@RyneEverett:icdiffと同等の方法を説明できますgit diff | cdiff -sか?
einpoklum

ydiff -sgit / svn / hgワークスペースから実行するだけで、パイプする必要はありません
。– ymattw

Gitの履歴を通じて差分を特定のファイルに制限してcd <git repo>実行する場合ydiff -ls <path/to/file>
slm

22

次のように並べて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^

私は通常、「$ git difftool -x 'sdiff -s -w 240'」(または画面の幅は何でも)を実行します。同じ行を抑制したい場合、ファイルが1つしかない場合(vimdiffを実行しない場合)
HidekiAI

1
@HidekiAI毎回端末の幅を入力するのは面倒なのでtput cols、代わりに次のように使用しますgit difftool -x "sdiff -s -w $(tput cols)"
jaume

色の変化を強調できますか?今のところ、実際に何が変化しているかを見つけるために目を使わなければならないようです
非極性

sdiffをicdiffに置き換えて、素敵なカラーディスプレイを作成してください。
グレッグ

10
export GIT_EXTERNAL_DIFF='meld $2 $5; echo >/dev/null'

次に単に:

git diff

1
「溶ける。」も動作します!また、すべての変更が統合ウィンドウに表示されます。
HRJ 2013年

完全に機能する@HRJ!とてもシンプルで実用的です:)
2016

9

GitHubを使用せずにブラウザーでサイドバイサイドの差分を表示したい場合は、の代わりにgit webdiffを使用できますgit diff

$ pip install webdiff
$ git webdiff

これは、tkdiff構文の強調表示や画像の差分の表示など、従来のGUI difftoolsに比べて多くの利点を提供します。

詳しくはこちらをご覧ください


7

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

私はそれを「diffy」と呼びました。これdiff -yは、UNIXでのside-by-side diff だからです。Colordiffは、より良い色を追加します。オプション-ydwyは、は並べて表示され、wは空白を無視し、dは最小の差分を生成します(通常、差分としてより良い結果が得られます)


add -yLaunch 'colordiff' [Y/n]:プロンプトをスキップします。
Beni Cherniavsky-Paskin 2014

あなたはそれがあることを確認していますかgit alias diffy "difftool --extcmd=\"colordiff -ydw\""?そうじゃないのgit config --global alias.diffy "difftool --extcmd=\"colordiff -ydw\""
非極性

6

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)

どこREF1REF2gitの参照で-タグ、枝やハッシュ。


ありがとう-コマンド 'git show HEAD:path / to / file'は、私が自分のソリューション 'vimdfiff <(git show HEAD:path / to / file)path / to / file'を思いつくために必要なものでした。ビットはまだ正しく並んでいませんが、それは私が今得た最良の解決策です。
talexb

5

個人的にはicdiffが本当に好きです

を続けている場合Mac OS XHomeBrew、実行してください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


3

この質問は、違いを見つけるためにgit組み込みの方法を使用する高速な方法を探していたときに現れました。私の解決基準:

  • 高速起動、組み込みオプションが必要
  • 多くのフォーマット、xml、さまざまなプログラミング言語を簡単に処理できます
  • 大きなテキストファイル内の小さなコード変更をすばやく特定

私は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オプションは、小さな行の変更で大きなファイルを参照するときに、標準の行差分と比較して色分けされたサイドバイサイドのソースコードエクスペリエンスを取得するための色設定とともに役立つ可視性を備えています。


3

他のいくつかは、すでに述べた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ソースコードがあります。


2

ここにアプローチがあります。より少ない数のパイプを使用する場合、xtermの幅は80に設定され、それほど熱くありません。しかし、たとえばCOLS = 210でコマンドを続行すると、拡張されたxtermを利用できます。

gitdiff()
{
    local width=${COLS:-$(tput cols)}
    GIT_EXTERNAL_DIFF="diff -yW$width \$2 \$5; echo >/dev/null" git diff "$@"
}

1
おかしい。私は仮名で名前で署名しましたが、無視されました... Stack Overflowにお越しいただきありがとうございます。:(
トーマス・メルマン

2

Intellij IDEAを開き、[バージョン管理]ツールウィンドウで1つまたは複数のコミットを選択し、変更されたファイルを参照してダブルクリックし、各ファイルの変更を並べて検査します。

バンドルされたコマンドラインランチャーを使用すると、シンプルでどこにでもIDEAを起動できます idea some/path

バージョン管理ビュー 差分ビュー


1

このスレッドにはたくさんの良い答えがあります。この問題に対する私の解決策は、スクリプトを作成することでした。

これに「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

1

これは多少制限のあるソリューションかもしれませんが、diff外部ツールなしでシステムのコマンドを使用して仕事をします:

diff -y  <(git show from-rev:the/file/path) <(git show to-rev:the/file/path)
  • 使用する変更行のみをフィルタリングします--suppress-common-linesdiffオプションがサポートされている場合)。
  • この場合は色なし、通常のdiffマーカーのみ
  • 列幅を微調整でき--width=term-widthます。Bashでは、$COLUMNSまたはとして幅を取得できますtput cols

これはヘルパーgit-scriptにラップすることもできます。たとえば、次のように使用すると便利です。

git diffy the/file/path --from rev1 --to rev2
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.