git-diffのようにdiffを機能させるには?


147

の出力フォーマットが好きですgit diff。行間の変更の色と+/ -表現は、GNU diffよりも読みやすくなっています。

git repoの外でflag git diffを使用して実行でき--no-index、それは正常に動作します。ただし、--exclude再帰からファイルまたはサブディレクトリを除外するオプションがないようdiffです。

両方の世界を最大限に活用する方法はありますか?(GNU diffの色オプションと+/ -形式git diff--excludeオプション)。

私はで実験しましたcolordiffが、私はまだ出力形式を好みますgit diff


1
アディションの青を緑にするにnewtextは、で変更し/etc/colordiffます。gitは緑を使用していると思いますか?
Rudie

1
これまで--no-indexフラグについて聞いたことがありませんでした。私はちょうどそれをgit showからの出力を2つのファイルのdiffと比較するために使用しました-そのおかげで!
AJM-Reinstate-Monica

回答:


175

私は色の仕方がわかりませんが、これはとでは+/-なくを<行い>ます。

diff -u file1 file2

6
クールで、これとcolordiffを組み合わせることで、私が望むものに十分近づきます。次回はさらにmanページを下にスクロールする必要があると思います...ありがとう!
Mzzzzzz

13
diff -uで色付けを取得する簡単な方法は、出力をコマンドラインgit repoビューアであるtigにパイプすることでもありますdiff -u file1 file2 | tig
Samuel Lampa

3
colordiffapt / yum / pacmanリポジトリからインストールして使用します。
iBug 2018

インストールするには、AmazonでLinux上のEnterprise Linuxの(EPEL)のための追加パッケージを有効にするために必要なcolordiffdocs.aws.amazon.com/AWSEC2/latest/UserGuide/...
パットマイロン

1
さらにcolordiff、をvim定義することで色を取得することもできますcdiff() { diff -u $@ | vim -R -; }
Syrtis Major

94

git diff --no-index -- A Bマンページを介して)使用することもできます。


1
+1ですが、悲しいことに、ファイルの1つがシンボリックリンクの場合、これは機能しません。
Emil Lundberg、2013

2
1、2つのファイルを追跡gitのレポート作成する方法を示していますので、これは非常に便利です Aし、Bと比較して異なるお互いの代わりに、各ファイルには彼らの最後のそれぞれのリビジョンに対する変更された場所のを。
J.カッツウィンケル2015年

@EmilLundberg:Linux上のgit 1.9.1のシンボリックリンクで私のために動作します。以前のバージョンが壊れているかどうかはわかりません。
kkm 2015

3
git diff --no-index素晴らしいですが、OPが指摘した--excludeように、フラグが欠けているため、有用性が非常に限られていることがよくあります。
ケンウィリアムズ

25
  1. colordiffをインストールします。

  2. 〜/ .colordiffrcを更新します(必要に応じて/ etc / colordiffrcを最初にコピーします):

    # be more git-like:
    plain=off
    newtext=darkgreen
    oldtext=darkred
    diffstuff=darkcyan
    
  3. colordiff -u file1 file22つのファイル、またはcolordiff -ruN path1 path2パスを再帰的に比較するために使用します。

まったく同じではありませんが、非常に近いです。


18

これは私が提案するものであり、かなり近いです

diff -u FILE1 FILE2 | colordiff | less -R
  • colordiff:これをインストールする必要があります
  • -R:これはLessに生のコードの代わりに色を表示するように指示します。

-w空白の差分を見たくなかったので、私は最終的に使用しました。

diff -w -u FILE1 FILE2 | colordiff | less -R

編集:コメントで@Ciprian Tomoiagaが提案したように、これを関数にして~/.bashrcファイルに追加することもできます。

function gdiff () { diff -u $@ | colordiff | less -R; }

4
bashrcにこのアドオンのための単一のbashの機能を持っている:function gdiff () { diff -u $@ | colordiff | less -R; }
シプリアンTomoiagă

4

GNU SEには、Unix SEでのこの回答によると、2016年後半のバージョン3.4以降diff--colorオプションがあります。これは、次の出力を模倣するのに十分なはずです。-ugit diff

diff -u --color=always file1 file2 | less -r

--coloralwaysパイプで使用する場合は、パイプのauto色をオフにする必要があります。

私はこれをWindowsのGit Bashで試しただけless -Rです。less -rその場合、私のためにそれを修正しました。


3

のみ使用しbashdifftput、そしてless、我々は密接の出力を近似することができますgit diff。ただし、diffプログラマーの近視眼のため、いくつかの顕著な違いがあります。

次のBash関数定義を、ユーザーアカウントによって自動的に取得されるファイルに配置すると、コマンドラインから関数にアクセスできるようになります。

function gdiff()
{
    local REG=`tput op`
    local GRP=`tput setaf 6`
    local ADD=`tput setaf 2`
    local REM=`tput setaf 1`

    local NL=$'\n'
    local GRP_LABEL="${GRP}@@ %df,%dn +%dF,%dN @@${REG}"

    local UNCH_GRP_FMT=''

    [[ "${1}" == '@full' ]] && {

        UNCH_GRP_FMT="${GRP_LABEL}${NL}%="
        shift
    }

    diff \
        --new-line-format="${ADD}+%L${REG}" \
        --old-line-format="${REM}-%L${REG}" \
        --unchanged-line-format=" %L${REG}" \
        --new-group-format="${GRP_LABEL}${NL}%>" \
        --old-group-format="${GRP_LABEL}${NL}%<" \
        --changed-group-format="${GRP_LABEL}${NL}%<%>" \
        --unchanged-group-format="${UNCH_GRP_FMT}" \
            "${@}" | less -FXR
}

この機能は次のように機能します。

  1. 最終的にdiffは、ファイル内の変更がどのように表示されるかを指定するさまざまなフォーマットオプションで呼び出されます。
  2. tputこれらのフォーマットオプションにANSIカラーコードを挿入するために使用されます。非ANSI端末を使用しているとき、あなたは交換する必要ことに注意してくださいtput setaftput setf
  3. の出力diffはにパイプされlessます。 -RANSIカラーを保持できます。 終了時に画面がクリアされ-Xないようにlessします。 出力が1画面に収まる場合、ページャーとしての動作を-F防ぎlessます。
  4. 最初のパラメータがの@full場合、関数は、追加および削除された行に加えて、変更されていないすべての行を表示します。

このアプローチとの次の違いに注意してくださいgit diff

  1. git diff各変更を囲む3行のコンテキストを報告します。残念ながら、diffコンテキスト行の数を指定すると同時にフォーマットオプションを指定したい場合、文句を言って終了するようです。(少なくともMac OS X Yosemiteではそうです)。diffプログラマに感謝します。したがって、@full最初のパラメーターとして指定することにより、デフォルトの動作である、各変更を囲むコンテキストの行を要求しないか、ファイル内のすべての変更されていない行も報告するように要求できます。
  2. コンテキストの行はとは異なるため、git diffこの関数によって報告される行番号もによって報告されるものとは異なりますgit diff
  3. 正しい動作である単一行の変更の存在が報告される場合がありますが、変更されたファイルに単一の空行の挿入が含まれている場合は不快です。私はgit diffその文脈の線を介して、これをよりよく扱うと思います。diff必要に応じて、空白をより適切に処理するためにさまざまなオプションを渡すことができます。


2

これを.bashrcまたはに配置します.zshrc

diff() { git diff --no-index "$1" "$2" | colordiff; }

requirments:gitcolordiff前に手にインストールする必要があります。

使用法 : diff file1 file2

例:$diff .tmux.conf .zshrc.pre-oh-my-zsh

差分関数の例


0

もう1つのオプションは、リポジトリの外部から実行することです。これにより、gitはファイルを比較できるようになります。例えば。次のようなシェル関数:

gdiff() {
    (
        dir=`pwd`
        cd ./$(git rev-parse --show-cdup)/..
        git diff  $dir/$1 $dir/$2
    )
}

0

colordiffを使用します

インストール:

sudo apt-get install colordiff

使用法:

colordiff -u file_one file_two

で示されているものとまったく同じ違いを示しgit diffます。


0

あなたが持っていない場合colordiffgit diff、あなたがして色を得ることができますvim

cdiff() { diff -u $@ | vim -R -; }

または単に

cdiff() { diff -u $@ | view -; }

0

コウモリは素晴らしいカラーリングを持っているので、それがうまくいくかどうかをテストしましたdiffが、驚くべきことに、箱から出して本当にうまくいきました。

$ diff file1 file2 | bat または $ diff -u file1 file2 | bat

したがって、以下のような関数をより効率的にすることができると思います。

function bdiff () { diff -u $@ | bat;}


-2

私は設定を考える:

[color]
     ui = true

「diff」コマンドの--relative=<path>オプションと組み合わせると、望みどおりの結果が得られます。試しましたか ?


3
これはの差分ですgit。彼はdiffプログラムのオプションを求めていました
tr33hous 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.