ファイルを比較するときは、を使用することを好みますgit diff --color-words。またはを使用するときにこれをdiffのデフォルト形式にする方法はありますgit add --patchかgit add --interactive?
9 に答える
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'
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。
最近この問題を解決しましたが、gitでPerlスクリプトを変更する必要があります。ただし、これは簡単で、特別なスキルは必要ありません。
このソリューションでは、git構成で画面出力に色付けを使用する必要があります。これは、gitが単語ベースの差分を表示する唯一の状況であるためです。
git-add--interactiveインストールからPATH環境変数のどこかにコピーし、名前を変更しgit-add--interactive-wordsます。- 変更するには、約半分の行を編集します*
@colored = run_cmd_pipe("git", @diff_cmd, qw(--color --), $path);
に
@colored = run_cmd_pipe("git", @diff_cmd, qw(--color --color-words --), $path);
- これで、色付きの単語ベースの差分と
git add-interactive--words同等の処理を実行できます。git add --interactive 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);
git 2.9(2016年6月)では、新しいオプションがあります:interactive.diffFilter。
Jeff King()によるcommit 0114384(2016年2月27日)を参照してください。(濱野純雄による合併---コミット2052c52、2016年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 fbcf99e、commit 7ce2f4c、commit e28ae50、commit 53ab9f0、commit 5013acc(2018年3月21日)を参照してください。(濱野純雄による合併---コミットd19e556、2018年4月10日)peff
gitster
詳細については、「diff-highlight:--graphインデントで検出」を参照してください。
注:Git 2.17(2018年第2四半期)より前では、「interactive.diffFilter」によって使用される「git add -i」は、入力と出力の間で1対1の対応を保持する必要がありますが、強制されず、エンドユーザーの混乱を引き起こしました。
ここで、少なくとも、フィルターされた結果が、壊れたフィルターを検出するための入力と同じ行数であることを確認します。
Jeff King()によるcommit 42f7d45、commit af3570e(2018年3月3日)を参照してください。(濱野純雄による合併---コミットc5e2df0、2018年3月14日)peff
gitster
Git 2.30(Q1 2021)では、 " git add -i" (man)がパッチを表示するように構成されたカスタムカラーを尊重できませんでしたが、修正されました。
commit 96386fa、commit 890b68b、commit 0cb8939、commit afae3cb、commit 6681e36(16 Nov 2020)、commit 25d9e5c、commit c62cd17、commit 6f1a5ca、commit decc9ee(11 Nov 2020)、commit cb581b1、commitd34e450を参照してください。 Johannes Schindelin(dscho)。( Junio C Hamano
によってマージされました---コミットe0d2568、2020年12月8日)gitster
add -pcolor.diff.context:より優先するcolor.diff.plainサインオフ-作成者:Johannes Schindelin
Gitのdiff機構を使用すると、ユーザーは、無地のコンテキストラインであっても、diffで使用する色をオーバーライドできます。8dbf3eb6850(
diff.h:DIFF_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.plaingit add -pgit config --get-colorgit add -prepo_config_get_value()ここでできる最善のことは、検索することです。
.context何も見つからない場合は、検索にフォールバックし.plain、それでも見つからない場合は、ハードコードされたデフォルト(この場合はコンテキスト行としての空の文字列)にフォールバックします。通常、色なしでレンダリングされます)。これは、両方の構成名が使用されている場合でも不整合につながります。最初の差分は、差分機構によって色付けされます。
ただし、ユーザーが編集したハンクは、(man)によって色を変更する必要があります。その後、他の設定を使用してコンテキストラインに色を付けます。git add -p実際には、これはそれほど悪いことではありません。(男)マニュアルはこれを:で述べています
git configcolor.diff.<slot>`context` (context text - `plain` is a historical synonym)したがって、ユーザーはどちらか一方の名前を使用しますが、両方の名前は使用しないと想定する必要があります。
さらに、ハンクはデフォルトですぐにステージングされるため、編集後にハンクを見るのは比較的まれです。
解決
あなたのとして使用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以降) 。これを参照してください。
前述のように、構成キーに追加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
このツールはうまくいきますhttps://github.com/mookid/diffr
[core]
pager = diffr | less -R
[interactive]
diffFilter = diffr
これはデルタ経由でも可能です:
[interactive]
diffFilter = delta --color-only --features=interactive
[interactive]
diffFilter = diff-so-fancy --patch
$(HOME)/。gitconfigファイルにこれを追加します
[color]
diff = auto
interactive = auto
これで十分です。

