167

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

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

両方の世界を最大限に活用する方法はありますか?( GNU差分 のカラーオプションと+/-フォーマットgit diffとオプション)。--exclude

私は実験しましたcolordiffが、それでも次の出力形式を好みますgit diff

4

15 に答える 15

212

これは、とでは+/-なく<を実行し>ます。

diff -u file1 file2

GNU diffutils 3.4以降、フラグ--colorが追加されました。両方を組み合わせると、次のようになります。

diff --color -u file1 file2

フラグ--colorも引数を取ります。有効なオプションは、、、neverまたはalwaysですauto。何をする必要があるかをより明確にしたい場合に便利です。

于 2011-01-31T23:40:10.940 に答える
105

( manpagegit diff --no-index -- A Bを介して)を使用することもできます。

于 2013-07-02T19:16:19.403 に答える
26
  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、パスを再帰的に比較します。

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

于 2013-11-29T14:56:25.437 に答える
20

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

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

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

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

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

function gdiff () { diff -u $@ | colordiff | less -R; }
于 2014-08-21T15:33:17.293 に答える
8

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

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

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

私はこれをWindowsのGitBashで試しただけless -Rで、ハンクの最初の行だけに色を付けます。less -rその場合は修正してくれました。

于 2018-06-12T18:53:28.873 に答える
3

、、、および、のみを使用してbash、の出力を厳密に概算できます。ただし、プログラマーの近視眼性のために、いくつかの顕著な違いがあります。difftputlessgit diffdiff

次の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 setafくださいtput setf
  3. の出力diffはにパイプされlessます。 -RANSIカラーを保持できます。 終了時に画面がクリアされ -Xないようにします。出力が1つの画面に収まる場合、ポケットベルとして動作するのを防ぎます。less-Fless
  4. 最初のパラメーターが@fullである場合、関数は、追加および削除された行に加えて、変更されていないすべての行を表示します。

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

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

これをrcファイルに配置します。最も一般的には、.bashrcまたは.zshrc:のいずれかになります。

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

要件:gitおよびcolordiffインストールされている必要があります。

利用方法 :diff file1 file2

于 2017-11-28T17:31:37.597 に答える
2

あなたが探しているcolordiff

sudo apt-get install colordiff
于 2013-01-17T15:45:44.540 に答える
1

コウモリは色が良いので、それがうまくいくかどうかをテストしましたdiffが、驚くべきことに、箱から出してすぐにうまくいきました。

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

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

function bdiff () { diff -u $@ | bat;}
于 2020-01-25T18:05:30.197 に答える
1

Debian9でテスト済み diff -u --color=always file1 file2

于 2020-06-26T14:57:16.110 に答える
0

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

gdiff() {
    (
        dir=`pwd`
        cd ./$(git rev-parse --show-cdup)/..
        git diff  $dir/$1 $dir/$2
    )
}
于 2011-02-03T00:50:26.173 に答える
0

colordiffを使用します:

インストール:

sudo apt-get install colordiff

使用法:

colordiff -u file_one file_two

で示されているのとまったく同じ違いがありgit diffます。

于 2018-08-23T11:25:42.917 に答える
0

またはがない場合はcolordiffgit diffで色を取得できますvim

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

または単に

cdiff() { diff -u $@ | view -; }
于 2019-09-04T03:05:47.877 に答える
0

追加

エイリアスdiff="git diff--no-index-"

〜/ .zshrcまたは〜/.bashrcへ

これはgitdiffを使用して、2つのファイル間で通常のdiffを実行します

于 2021-08-30T18:31:58.767 に答える
-2

私は設定設定だと思います:

[color]
     ui = true

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

于 2011-02-01T02:27:36.933 に答える