統一されたdiffファイルで文字ごとの違いを視覚化するにはどうすればよいですか?


122

で作成されたパッチがあるとしgit format-patchます。ファイルは基本的に、いくつかのメタデータを含む統一されたdiffです。Vimでファイルを開くと、変更された行は表示されますが、変更された行のどの文字が異なっているかはわかりません。文字ごとの違いを視覚化する方法(Vim、またはUbuntuで実行されるその他のフリーソフトウェア)を知っている人はいますか?

文字ごとの差分が視覚化される反例は、を実行するときvimdiff a bです。

2010年11月12日金曜日22:36:23 UTC更新

diffpatchは、単一のファイルで作業しているシナリオに役立ちます。

2016年6月16日17:56:10 UTC更新

git 2.9のdiff-highlightをチェックしてください。このスクリプトは、私が最初に求めていたものとまったく同じです。


これは、superuser.comの方が良いかもしれません
Daenyth、2007

13
たぶん。FAQに「プログラマーが一般的に使用するソフトウェアツール」に関する質問の場所が記載されているため、私はstackoverflow.comを選択しました
Adam Monsen

7
これがあなたの質問に直接答えるかどうかはわかりませんgit diff --color-wordsが、通常の統一されたdiff出力ではなく、行内でどの単語が変更されたかを確認するのに非常に役立ちます。ただし、これは文字ベースではなく単語ベースであるため、コンテンツに空白があまりない場合は、比較する出力が適切ではない可能性があります。(編集:おっと、私はあなたが何を求めているのかを誤解しているようです。それでも、このコメントは誰かにとって役立つでしょう)
Mark Longair

回答:


13

質問でのVimへの言及を考えると、これがあなたが望む答えであるかどうかはわかりませんが:) Emacsはこれを行うことができます。差分を含むファイルを開き、あなたがしていることを確認してくださいdiff-mode(ファイルの名前がfoo.diffまたはfoo.patchこれが自動的に行われ、そうでない場合は入力M-x diff-mode RET)、あなたがして、ヒット関心のある塊に行くC-c C-bためにrefine-hunk。または、を使用して、一度に1つのファイルを1つずつ移動しM-nます。自動的に絞り込みを行います。


1
私のために働く!Vimを10年間使用していますが、emacsをインストールしただけです。:)
Adam Monsen

しかし、emacsはstdinからの読み取りをサポートしていません。たとえば、私はできませんgit log master.. -p | emacs -
Hi-Angel

1
@ Hi-Angel Emacsを開いて入力M-!し、コマンドを実行して出力をバッファーにキャプチャできます。
レゴシア'19年

172

gitでは、コミットせずにマージできます。最初にパッチをマージしてから、次のようにします。

git diff --word-diff-regex=.

等号の後のドットに注意してください。


139
良い:git diff --color-words=.
ntc2 2013年

4
@ ntc2コメントを回答にしてください。
タイラーコリアー

1
賛成者に注意してください。私の元の使用例では、パッチファイルのみがあり、 git repoもベース/変更バージョンもないことを前提としています。@legosciaの回答を受け入れたのはそのためです。要求された内容を正確に説明しています。
Adam Monsen、2014年

2
@ ntc2 git diff --color-words=.とはgit diff --color-words .動作が異なります。良いですgit diff --color-words .
abhisekp 2015

2
@abhisekp:写真をありがとう。私はそれを理解したと思います:これgit diff --color-words .は本当にと同じgit diff --color-words -- .です!つまり、.はパスとして解釈されます。で確認できmkdir x y; echo foo > x/test; git add x/test; git commit -m test; echo boo > x/test; cd y; git diff --color-words=.; git diff --color-words .; git diff --color-words -- .ます。
ntc2

145

以下は、ノイズの少ない出力がgit diff --word-diff-regex=<re>あり、タイピングの必要が少ないバージョンと同じですが、と同等git diff --color-words --word-diff-regex=<re>です。

シンプル(スペースの変更を強調表示します):

git diff --color-words

シンプル(個々の文字の変更を強調表示します。スペースの変更は強調表示しません):

git diff --color-words=.

より複雑(スペースの変更を強調表示します):

git diff --color-words='[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'

一般に:

git diff --color-words=<re>

ここで<re>の変更を識別するために「単語」を定義する正規表現です。

これらは、変更された「単語」に色を付けるという点でノイズが少なくなりますが、--word-diff-regex=<re>サラウンドに一致する「単語」を色付きの-/+マーカーで使用するだけです。


9
私自身は--color-words=.部分なしで好きです。
タイラーコリアー2014

1
git diff --color-words='\w'発音区別符号(git v1.7.10.4)でより適切に動作する
nr

1
より複雑なバージョンがうまく機能します。私が追加--word-diff=plainに加えて持っている[--]サラウンド削除をし、{+そして+}追加をサラウンド。しかし、マニュアルが警告しているように、ソース内のこれらの区切り文字の実際の出現は、決してエスケープされません
Tobias Kienzler

2
残念ながら、より複雑なバージョンではインデントの変更などが強調されていないようです。これについて質問をしました
Tobias Kienzler

この答えは素晴らしいです!しかし、それらの変更の背景を緑/赤に実際に変更する方法はありますか?
WoLfPwNeR 2016

45
git diff --color-words="[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+"

上記の正規表現(Thomas Rastからの)は、句読点/文字レベルで差分フラグメントを分離する適切な作業を行います(ただし、ほどノイズが多くありません--word-diff-regex=.)。

結果の出力のスクリーンショットをここに投稿しました。


更新:

この記事にはいくつかの素晴らしい提案があります。具体的にcontrib/は、gitリポジトリのツリーには、diff-highlight細かいハイライトを表示するperlスクリプトがあります。

それを使用するためのクイックスタート:

$ curl https://git.kernel.org/cgit/git/git.git/plain/contrib/diff-highlight/diff-highlight > diff-highlight
$ chmod u+x diff-highlight
$ git diff --color=always HEAD~10 | diff-highlight | less -R

5
短縮することができます--color-words=[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'
Eddified

'そこに値の最初に追加する必要がありました。そうでなければ、エラーが発生しました。また、単純に--color-wordsiを使用すると、その正規表現を使用した場合とまったく同じ動作が得られます。
gcb 2013年

3
@gcbテキストの内容が重要です。変更が空白で区切られている場合、違いはありません。しかし、あなたが変更した場合は、変更した場合のようなものfoo.barfoo.qux、あなたは違いが表示されます。
ジャスティンM.キーズ2013年

5
シンプル:git diff --color-words='[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'
ntc2 2013年

1
私はgitをHomebrewとともにインストールしており、そのスクリプトは既ににありました/usr/local/share/git-core/contrib/diff-highlight/diff-highlightこれは、Homebrewのgitがcontrib全体をにインストールすることを示唆しているよう/usr/local/share/git-core/contrib/です。それで、最後に、次のことがうまくgit diff --color=always | /usr/local/share/git-core/contrib/diff-highlight/diff-highlight
いき

6

NodeJSのインストールに何も問題がない場合は、「diff-so-fancy」というパッケージ(https://github.com/so-fancy/diff-so-fancy)があります。これは、インストールが非常に簡単で、完全に機能します。

npm install -g diff-so-fancy
git diff --color | diff-so-fancy | less -R

編集:それは実際には公式のdiff-highlightのラッパーであることがわかりました...少なくとも私のようなperlophobeをインストールする方が簡単で、GitHubページがうまく文書化されています:)


2

文字ごとの差分ツールを認識していませんが、単語ごとの差分ツール:wdiffがあります。

例を参照してくださいUNIX / Linuxの上位4つのファイル差分ツール– Diff、Colordiff、Wdiff、Vimdiff


wdiffは面白いです、ありがとう!私の元の質問を明確にするために、私はたまたま統一されたdiff形式になっている単一のファイルの強化された構文強調表示を提供するものを探しています。
Adam Monsen、2010

少しトピック外(既存のdiff出力を強化しない、単語ごとの差分について)ですが、次の組み合わせは単語ごとの視覚化に最適です:* wdiff old_file new_file | cdiff * vimdiff 、その後vim :windo wincmd K内で垂直ウィンドウレイアウトに切り替え(1つ下)1つ並んでから。そのレイアウトは、長い行を含むファイルにはるかに適しています。
Aleksander Adamowski、

2
:ところで、いくつかの他のツールの価値をチェックアウトし、リンク先の記事に記載されていないwdiff2mdiffGoogleのオンラインツール
Aleksander Adamowski、

1

少し調べたところ、この質問がメインのVimメーリングリストで最近2度出てきたことに気づきました。NrrwRgnプラグインが言及された両方の (2つの狭い領域を作成し、それらをdiffを)。Christian Brabandtの説明に従ってNrrwRgnを使用することは、解決策というよりは回避策のように感じられますが、おそらくそれで十分です。

私はNrrwRgnを試してみましたが、:diffthisと一緒に使用すると、単一のファイルの一部内の文字ごとの違いを示すのに本当に役立ちました。しかし、それは多くのキーストロークを必要としました。私のVimscriptはかなり錆びていますが、スクリプト化されている可能性があります。おそらく、NrrwRgnを拡張して、必要な機能を提供できるでしょう。

考え?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.