web-dev-qa-db-ja.com

git diffは、削除と追加の両方と同じ行を表示します

私は誤って新しい支店を開設しなければならなかったマスターに取り組みました。

ほぼ完全に元の形に戻しました。あるクラスでは、私には理解できない次の差分があります。

index 4a9abb8..7c55879 100755
--- a/includes/site.inc.php
+++ b/includes/site.inc.php
@@ -142,11 +142,11 @@ class site{

        public $tplEngine = 'smarty';

-
+       
     private $_productsByType = array();
     private $logger;
-    protected $locale = 'tr_TR';
-
+    protected $locale = 'tr_TR';  
+    

同じものを削除して追加したとのことですが、原則として元のインデックスとの違いはなく、このファイルが変更されたように見せたくありません。

私は何をすべきか ?どうも。

29
Pumpkin

スペースを確認してください。置き換えられた「空の」外観の線には、スペースがあります。また、誤ってタブをスペースに置き換えたり、その逆を行ったりした可能性もあります。

8
jpe

おそらく空白の変更です。 git diff -wを実行できます。これにより、空白の変更はすべて無視されます。

36
mamapitufo

スペース/タブに加えて、異なるエディター(Windowsでも)および/または異なるOSから入力された場合の行末は、重複を示す差分行の原因となる可能性があります。 LF(linux/Unix)vs CRLF(Windows)。

2
MKM

スペースまたは行末の違いを確認してください。

1
carlspring

非空白行の2番目のバージョンには、セミコロンの後にスペースがあり、空白行にも異なる数のスペースがあります。

Gitにそのような隠されたスペースを強調表示させるオプションがあるはずです。そうすれば、diffがより有益になりますが、私にはマニュアルがありません。

1
Kevin Reid

新しい_-B_を使用している場合、 git 1.8.4(2013年7月) では、空の行のみで変更が表示されなくなることに注意してください。オプション。

「_git diff_」は、GNUの「_diff -B_」(空白行を無視)と同じ、空白行の追加と削除のみで変更されたハンクを無視するモードを学習しました。差分。

commit 36​​617af7ed594d1928554356d809bd611c642dd2 を参照してください:

パッチの目的は、GNU diff _-B/--ignore-blank-lines_を可能な限り厳密に導入することです。短いオプションは「_break-rewrites_」ですでに使用されているため、使用できません。

このオプションを使用すると、_git diff_は単に空の行を追加または削除するハンクを作成しませんが、「貴重な」変更に十分近い場合は空の行の追加/抑制を表示します。

オプションのより詳細な説明は次のとおりです。

  • 本当の変化は面白い
  • 興味深い変更に十分に近い(コンテキストサイズ未満)空白行は、興味深いと見なされます(再帰的定義)
  • 「コンテキスト」行は、興味深い変更の各ハンクの周りに使用されます
  • 2つのハンクが「inter-hunk-context」未満で区切られている場合、それらは1つにマージされます。
0
VonC

これは、gitが使用するデフォルトのdiffアルゴリズムがヒューリスティックを使用して高価なエッジケースを切り取るために発生することがあり、その結果、結果が最適ではなくなる可能性があります。

これと同じ問題が発生しましたが、空白や行末などが原因で説明できませんでした。git diffは、3行削除および2行追加として表示されたハンクの一部として、削除されてから再追加された特定の行を表示していましたが、実際には2行削除および1行追加されました。他の差分プログラムでは、予想される2行が削除され、1行が追加されたことが示されました。

これが発生したファイルは4736行(114 KB)で、差分は合計640の挿入と1340の削除であり、問​​題のハンクはファイルの中央にあります。私はそれを同じ問題を示したより小さなテストケースに減らすことができませんでした:どこでもわずかな摂動を加えることで問題はなくなりました。私の唯一の結論は、diffアルゴリズムのヒューリスティックのこれらのEdgeケースの1つに陥っていたということです。

Gitはデフォルト以外に 他の複数のdiffアルゴリズム をサポートしています。アルゴリズムをminimalpatience、またはhistogramのいずれかに切り替えることで、この場合の問題は解決しました。

埋め込まれたLibXDiffライブラリのgitソースコードの このコメント も参照してください。

0
Adam Rosenfield