web-dev-qa-db-ja.com

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

git format-patchで作成されたパッチを取得したとします。ファイルは基本的に、いくつかのメタデータを含む統合された差分です。 Vimでファイルを開くと、変更された行を確認できますが、変更された行のどのcharactersが異なるかを確認できません。誰もが文字ごとの違いを視覚化する方法を知っていますか(Vim、またはUbuntu上で実行される他のフリーソフトウェア)?

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

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

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

Thu Jun 16 17:56:10 UTC 2016を更新

git 2.9のdiff-highlight を確認してください。このスクリプトは、私が最初に求めていたものを正確に実行します。

110
Adam Monsen

質問でのVimへの言及を考えると、これがあなたの望む答えかどうかはわかりません:)が、Emacsはこれを行うことができます。差分を含むファイルを開き、diff-modeにいることを確認します(ファイルの名前がfoo.diffまたはfoo.patchの場合、これは自動的に行われます。 M-x diff-mode RET)、興味のあるハンクに移動してヒット C-c C-b refine-hunkの場合。または、ファイルを1つずつハンクします M-n;それは自動的に精製を行います。

12
legoscia

Gitでは、コミットせずにマージできます。最初にパッチをマージしてから、次を実行します。

git diff --Word-diff-regex=.

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

159
yingted

以下は、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>を使用すると、一致する「単語」を色付きの-/+マーカーで囲みます。

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

上記の正規表現( from Thomas Rast )は、句読点/文字レベルでdiffフラグメントを分離する適切な仕事をします(--Word-diff-regex=.)。

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


更新:

この記事 にはいくつかの素晴らしい提案があります。具体的には、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
44
Justin M. Keyes

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の実際のラッパーであることがわかりました...少なくとも、私のようなperlophobesの方が簡単にインストールでき、GitHubページはうまく文書化されています:)

6
walnutz

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

例を参照してください NIX/Linuxのトップ4ファイル差分ツール– Diff、Colordiff、Wdiff、Vimdiff

2
thegeek

少し調べてみると、最近Vimのメインメーリングリストでこの質問が2回出てきました。 NrrwRgnプラグイン が言及されました 両方times (2つの狭い領域を作成し、それらをdiffします)。 Christian Brabandtが説明したようにNrrwRgnを使用することは、ソリューションというよりは回避策のように感じますが、それで十分かもしれません。

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

考え?

1
Adam Monsen