3

マージしようとするとファイルが競合していると Git が言う問題に遭遇していますが、競合を解決しようとすると競合はありません。ローカルとリモートの両方が同じ場合に、Git がそれを競合と見なすのはなぜですか? Git にこれを自動的に解決させる方法はありますか?

OS: Windows8

Git バージョン: 1.9.5

4

1 に答える 1

4

ファイルは確かに同じではありません。

マージされた 2 つのブランチで同じ行/ブロックが別の方法で変更されたことを GIT が検出すると、競合メッセージが発生します。Git は、そのようなケースを自動的に解決しようとはしません。それらの解決は、ファイルの内容のセマンティクスに大きく依存するためです。Git は XML も Java も C# も ASN1 構文も知らず、それらを学ぼうともしません :) それは非常に基本的なことです。

ただし、一部の競合は、プログラマにとって「取るに足らない」ものです。

そのため、通常、TortoiseMerge、WinMerge、KDiff3 などの外部マージ ユーティリティを使用します。これらにはいくつかの異なるアルゴリズム/ヒューリスティックが含まれており、同じ方法で解決されることが非常に多い一般的な「些細な」競合を自動的に検出/解決することができます。たとえば、次のように、単に「重要ではない」として無視されます。

  • 行末スタイルの競合 (CR vs CRLF vs LF ..)
  • 空白のみの競合 ( 'class Foobar'vs 'class Foobar'vs ' class Foobar')
  • エンコーディングの競合 (ASCII vs UTF8 vs UTF16)
  • ファイルの終わりの競合 (EOF に追加の endline があるべきか、ないか)

これらのユーティリティ (特にグラフィカルなもの)の中には、ファイルの生の内容が異なっていても、見た目のテキスト コンテンツが同一に見えるため、ファイルが「同一」であると表示される場合があります。これは好みの問題です。純粋なコード ファイルを操作する場合、通常、Java または C# ファイルが UTF16 または UTF8 として保存されているかどうかは問題ではありません。コードの違いに関心があります。同僚が行末を LF ではなく CRLF で保存したという理由だけで、すべての行が変更されたことを知りたくない場合がよくあります。

ただし、3 つの重要な注意事項:

  1. このような場合、優れたファイル マージャーは、「ファイルが同一である」ことを通知するのではなく、「ファイルの内容は同一であるが、ファイルのバイナリは等しくない」ことを通知します。たとえば、KDiff3はそれを行います。
  2. whitespaces/lineendings/encodings/etc は重要ではないように見えるかもしれませんが、そうではありません。Makefile や Python を例にとってみましょう。スペースが1つ、3つ、またはタブがある場合、大きな違いがあります。
  3. したがって、whites/encoding/etc を無視するかどうかは、ファイルの使用法に厳密に依存しています。C# エンコーディングでは問題にならないかもしれませんが、FooBar では重要かもしれません。そのため、GIT はそのような衝突の自動処理を強制しようとしません。Git は安全にプレイします。あなたが選択した file-differ または file-merger は、あなたのためにそれを行い、ファイルが同じであるとあなたを「だまして」しまいました。
于 2015-06-25T12:59:53.137 に答える