8

序文

この質問は、基本的な統一された差分出力形式を理解することに関するものです。3 方向の差分とマージは、適切な GUI マージ ツール、または少なくともfugitive.vimのようなプラグインを使用した vim diff モードの快適さから行うのがおそらく最善の方法です。

質問

git diff競合をマージしながら実行すると、プラスとマイナスの 2 つの列を持つ差分ビューが生成されることがわかりました。

同じデータの 3 つの異なるバージョンを比較する場合、2 つだけを比較する場合よりも多くの情報が必要になることは明らかです。しかし、これらの列は実際には何を意味するのでしょうか? 特定の行が現在属している可能性のある「バケット」には、明らかにより多くの組み合わせがあります。以前は空白 (同じ)、+(追加)、または-(削除) のいずれかでしたが、現在は空白、++--+  +- および -です。そして、おそらく私が見たことのないもの以上のもの。

4

2 に答える 2

3

「複合差分形式」について言及しています。元の uni-diff 形式のこの拡張機能は、入力として 2 つ以上のファイルを処理し、マージ結果として 1 つのファイルを処理します。この形式は、git-diff コマンド マニュアルの「結合された diff 形式」セクションの一部として詳細に説明されています。

于 2013-08-29T08:09:53.397 に答える
1

X の行が出力行とどのように異なるかを示すために、それぞれに 1 つの列が出力行の前に追加されるgit diff「結合 diff 形式」は、生成にコストがかかる可能性があることに注意してください。fileN

Kirill Smelkovによる最近のコミット 72441af (2014 年 4 月)は、そのような差分がどのように最適化されるかについて非常に有益です (Git 2.x、2014 年第 3 四半期)。

D(A,P2)が巨大です。merge-baseAが下P2の数十のマージ ( からA、最初の親を介して) である場合D(A,P2)、複数のサブシステムから 1 つのサブシステムへのマージの差分合計になるからです。

解決策は、n 個の 1-parent diff の計算を回避しA、各ステップでエントリを比較し、その比較に基づいて、パスの結果を移入し、 とすべての Pi のツリーを同時にスキャンして、すべての親に変更されたパスを見つけることです。少なくとも 1 つの親について、そのディレクトリ ツリーの sha1 が と同じであれば、サブディレクトリへの再帰をスキップ できると推測します。 これにより、大量の不要な作業を行う必要がなくなります。A

于 2014-06-24T16:40:25.083 に答える