61

ファイルを比較するときは、を使用することを好みますgit diff --color-words。またはを使用するときにこれをdiffのデフォルト形式にする方法はありますgit add --patchgit add --interactive

4

9 に答える 9

20

VonCが言ったことから構築する:

Git 2.9以降では、このコマンドを使用して、次の期間に単語に色を付けることができますadd --patch

git -c interactive.diffFilter="git diff --color-words" add -p

これにより、それ以降の呼び出しに影響を与えるinteractive.diffFilterことなく、呼び出しの変数がに設定されadd -pます。私にとってこれは理想的です。なぜなら、私は通常はadd -p正常に実行したいのですが、時にはそれをで実行したいから--color-wordsです。

このコマンドのエイリアスは、次のように簡単に追加できます。

git config --global alias.addcw '-c interactive.diffFilter="git diff --color-words" add -p'
于 2016-06-14T16:19:40.367 に答える
20

VonCの答えから手がかりをとる。--interactivegit2.9で導入されたオプションを使用するための詳細な手順は次のとおりです。

PATHにdiff-highlightを追加します。

Ubuntuでは、diff-highlightgitが付属しており、にあり/usr/share/git/diff-highlight/diff-highlightます。

それ以外の場合は、手動でダウンロードして設定できます。

cd ~/bin
curl -LO "https://raw.githubusercontent.com/git/git/master/contrib/diff-highlight/diff-highlight"
chmod u+x diff-highlight

必要に応じて、シェルを再起動します。

次に、ポケットベルに差分が表示されるたびに差分をフィルタリングするようにGitを構成します。

git config --global pager.log 'diff-highlight | less'
git config --global pager.show 'diff-highlight | less'
git config --global pager.diff 'diff-highlight | less'
git config --global interactive.diffFilter diff-highlight

これにより、線の変更された部分が特に強調されます。これは、とほぼ同じ--word-diffです。

git log --patch利点は、またはのように、どこでも単語の差分を取得できることですgit add -p

gitlog--patchでのdiff-highlightのデモンストレーション

于 2016-10-01T21:44:35.987 に答える
16

最近この問題を解決しましたが、gitでPerlスクリプトを変更する必要があります。ただし、これは簡単で、特別なスキルは必要ありません。

このソリューションでは、git構成で画面出力に色付けを使用する必要があります。これは、gitが単語ベースの差分を表示する唯一の状況であるためです。

  1. git-add--interactiveインストールからPATH環境変数のどこかにコピーし、名前を変更しgit-add--interactive-wordsます。
  2. 変更するには、約半分の行を編集します*
@colored = run_cmd_pipe("git", @diff_cmd, qw(--color --), $path);

@colored = run_cmd_pipe("git", @diff_cmd, qw(--color --color-words --), $path);
  1. これで、色付きの単語ベースの差分とgit add-interactive--words同等の処理を実行できます。git add --interactive
  2. git add --patchただし、新しいスクリプトに適切なパラメータを渡す必要があるため、これと組み合わせるのは厄介です。幸いなことに、あなたはあなたの魔法の言葉のエイリアスを作成することができます.gitconfig
[alias]
iaddpw = add--interactive-words --patch=stage --

これは、色付きの単語ベースの差分とgit iaddpw同等の実行を意味します。git add --interactive --patch


* -Git 2.18の場合、このコマンドは次のとおりです。

my @display_cmd = ("git", @diff_cmd, qw(--color --), $path);
于 2012-09-06T09:56:06.917 に答える
11

git 2.9(2016年6月)では、新しいオプションがあります:interactive.diffFilter

Jeff King()によるcommit 0114384(2016年2月27日)を参照してください。濱野純雄による合併---コミット2052c522016年4月3日peff
gitster

add --interactive:カスタム差分強調表示プログラムを許可する

add--interactiveのパッチハンクセレクターは、gitに色付きの差分を要求する方法を知っており、それらを適用する色なしの差分と相関させます。しかし、contribのdiff-highlightのようなdiff-filterツールを使用する人が、通常のハイライトを確認する方法はありません。

このパッチを使用すると、ユーザーは任意のシェルコマンドを定義して、色付きの差分をパイプ処理できます。元の差分とライン互換である限り(結果を人間に表示するだけなので)、正確な出力は重要ではありません(したがって、ハンク分割でカラーバージョンを分割することもできます)。

次に、その差分をにパイプすることができますdiff --color-words

Andrew Dufresneがコメントしたように、GitHubのブログ投稿はcontribスクリプトに言及しています。contrib/diff-highlight

「」を使用--color-wordsして、線の変更された部分のみを強調表示できます。ただし、これは行構造を失い、奇妙な形式のビットになってしまうため、コードを読み取るのが難しい場合があります。

代わりに、このスクリプトは行指向の差分を後処理し、行のペアを見つけて、異なるセグメントを強調表示します。

結果は、行の変更された部分に特に重点を置きます。

差分色

それらの差分に関しては、 " diff-highlight" filter(in )は" "出力をよりよくcontrib/理解することを学びました。git log --graph

ジェフキング(によるcommit 4551fbb 、commit 009a81e、 commit fbcf99ecommit 7ce2f4ccommit e28ae50commit 53ab9f0commit 5013acc(2018年3月21日)を参照してください。濱野純雄による合併---コミットd19e5562018年4月10日peff
gitster

詳細については、「diff-highlight--graphインデントで検出」を参照してください。


注:Git 2.17(2018年第2四半期)より前では、「interactive.diffFilter」によって使用される「git add -i」は、入力と出力の間で1対1の対応を保持する必要がありますが、強制されず、エンドユーザーの混乱を引き起こしました。

ここで、少なくとも、フィルターされた結果が、壊れたフィルターを検出するための入力と同じ行数であることを確認します。

Jeff King()によるcommit 42f7d45commit af3570e(2018年3月3日)を参照してください。濱野純雄による合併---コミットc5e2df02018年3月14日peff
gitster


Git 2.30(Q1 2021)では、 " git add -i" manがパッチを表示するように構成されたカスタムカラーを尊重できませんでしたが、修正されました。

commit 96386fa、commit 890b68bcommit 0cb8939commit afae3cbcommit 6681e36(16 Nov 2020)、commit 25d9e5ccommit c62cd17commit 6f1a5cacommit decc9ee(11 Nov 2020)、commit cb581b1commitd34e450を参照してください。 Johannes Schindelin(dscho( Junio C Hamano
によってマージされました---コミットe0d2568、2020年12月8日gitster

add -pcolor.diff.context:より優先するcolor.diff.plain

サインオフ-作成者:Johannes Schindelin

Gitのdiff機構を使用すると、ユーザーは、無地のコンテキストラインであっても、diffで使用する色をオーバーライドできます。8dbf3eb6850diff.hDIFF_PLAINカラースロットの名前をDIFF_CONTEXT,2015-05-27、Git v2.4.5に変更)の時点で、構成設定の優先名はですが、color.diff.contextGitでは引き続き許可されていますcolor.diff.plain

manのコンテキストでは、このロジックを複製するのは少し難しいです。すべての構成値を順番に読み取り、またはが表示された場合は、新しい色を受け入れます。 ただし、 Perlバージョンのman)はmanを通過する必要があります。これにより、指定できるキーは1つだけになります。同じことが(man の組み込みバージョンにも当てはまります。これは。を通過する必要があります。git add -pgit_diff_basic_config() color.diff.contextcolor.diff.plain
git add -pgit config --get-color
git add -prepo_config_get_value()

ここでできる最善のことは、検索することです。.context何も見つからない場合は、検索にフォールバックし.plain、それでも見つからない場合は、ハードコードされたデフォルト(この場合はコンテキスト行としての空の文字列)にフォールバックします。通常、色なしでレンダリングされます)。

これは、両方の構成名が使用されている場合でも不整合につながります。最初の差分は、差分機構によって色付けされます。
ただし、ユーザーが編集したハンクは、manによって色を変更する必要があります。その後、他の設定を使用してコンテキストラインに色を付けます。git add -p

実際には、これはそれほど悪いことではありません。マニュアルはこれをで述べていますgit configcolor.diff.<slot>

`context` (context text - `plain` is a historical synonym)  

したがって、ユーザーはどちらか一方の名前を使用しますが、両方の名前は使用しないと想定する必要があります。
さらに、ハンクはデフォルトですぐにステージングされるため、編集後にハンクを見るのは比較的まれです。

于 2016-04-05T21:21:54.853 に答える
9

解決

あなたのとして使用diff-highlight | less -FRX --tabs=4してくださいdiffFilter

git -c interactive.diffFilter="diff-highlight | less -FRX --tabs=4" add --patch

詳細についてはdiff-highlightソースクイック入門書

自作

.gitconfigHomebrew(OS X)を使用している場合は、(すでにインストールされているものを使用するために)に次のものを入れることができますdiff-highlight

    [interactive]
        diffFilter = "$(git --exec-path | sed 's/libexec/share/')/contrib/diff-highlight/diff-highlight | less -FRX --tabs=4"

1-1入力と出力の対応

git 2.17の時点で、diffソリューションという単語は、次のことを回避するために、入力行と出力行の間で1対1の対応を維持する必要があります。

$ git -c interactive.diffFilter="git diff --word-diff --color" add --patch
fatal: mismatched output from interactive.diffFilter
hint: Your filter must maintain a one-to-one correspondence
hint: between its input and output lines.

diff-so-fancyhttps://github.com/so-fancy/diff-so-fancy/issues/35が閉じられたため、これをサポートするようになりました(v1.4.0以降) 。これを参照してください。

于 2018-09-08T00:49:51.263 に答える
4

前述のように、構成キーに追加diff-highlightするのinteractive.diffFilterが最も簡単なオプションです(Git 2.9以降)。次のコマンドは、スクリプトをコピーしたり、権限を変更したり、$ PATHを操作したりせずに、Debian/Ubuntuでトリックを実行します。

git config interactive.diffFilter "perl /usr/share/doc/git/contrib/diff-highlight/diff-highlight"

正しく機能しない、git -c interactive.diffFilter="git diff --color-words" add -pまたは正しく機能しない:常に最初に変更されたファイルを提案し続けます。git config interactive.diffFilter "git diff --color-words"add -p

于 2017-12-11T12:01:56.493 に答える
3

このツールはうまくいきますhttps://github.com/mookid/diffr

[core]
    pager = diffr | less -R
[interactive]
    diffFilter = diffr
于 2021-01-06T12:31:24.003 に答える
1

これはデルタ経由でも可能です:

[interactive]
    diffFilter = delta --color-only --features=interactive

とdiff-so-fancy経由:

[interactive]
    diffFilter = diff-so-fancy --patch
于 2021-10-01T04:22:51.860 に答える
-5

$(HOME)/。gitconfigファイルにこれを追加します

[color]
        diff = auto
        interactive = auto

これで十分です。

于 2012-06-04T08:37:31.540 に答える