web-dev-qa-db-ja.com

「git diff」を実行すると、どのようにしてside-by-side diffを取得できますか?

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

134
user783774

Gitにはdiffの内部実装がありますが、代わりに外部ツールをセットアップできます。

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

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

こちらもご覧ください:

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

  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/カスタマイズ-Git-Git-Configuration

81
Tilo

Git difftoolを試してください

git difftoolの代わりにgit diffを使用します。あなたは二度と戻りません。

使用例を追加するUPDATE:

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
123
Matt Ball

git diff --Word-diffを試すこともできます。それは正確に並んでいるわけではありませんが、どういうわけかより良いので、実際の並列のニーズよりも好むかもしれません。

39
mb14

ydiff

以前はcdiffと呼ばれていましたが、このツールではside-by-incremental、およびcolorfuldiff。

git diffを行う代わりに、次のようにします。

ydiff -s

これにより、ydiffが、異なるファイルのそれぞれについて横並び表示モードで起動されます。

でインストール:

python3 -m pip install --user ydiff

git logには、次を使用できます。

ydiff -ls

詳細とデモについては、ydiffGitHubリポジトリページ を参照してください。

Git 2.18.0、ydiff 1.1でテスト済み。

35
ymattw

次のように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^
14
starfry
export GIT_EXTERNAL_DIFF='meld $2 $5; echo >/dev/null'

その後、単に:

git diff
7
krzych

GitHubを使用せずにブラウザでdiffを並べて表示したい場合は、git diffのドロップイン置換である git webdiff をお楽しみください。

$ pip install webdiff
$ git webdiff

これにより、tkdiffのような従来のGUI difftoolsに比べて、構文の強調表示とイメージの差分の表示が可能になるという点で多くの利点があります。

詳細については、こちらをご覧ください こちら

7
danvk

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としてより良い結果が得られます)

6

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参照(タグ、ブランチ、ハッシュ)です。

4
Walker Hale IV

個人的には 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
Jose Alban

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

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

他のいくつかの人が既に言及しました 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ソースコードがあります。

2
Eric

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

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

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と比較して色分けされたソースコードエクスペリエンスを取得します。

1
Mike

Macを使用している場合、GitUp http://gitup.co/ は非常に良い選択です。

0
Xuan

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

この「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
0
Jon Carter

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

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

version control viewdiff view

0
Holger Brandl