マージしようとするとファイルが競合していると Git が言う問題に遭遇していますが、競合を解決しようとすると競合はありません。ローカルとリモートの両方が同じ場合に、Git がそれを競合と見なすのはなぜですか? Git にこれを自動的に解決させる方法はありますか?
OS: Windows8
Git バージョン: 1.9.5
マージしようとするとファイルが競合していると Git が言う問題に遭遇していますが、競合を解決しようとすると競合はありません。ローカルとリモートの両方が同じ場合に、Git がそれを競合と見なすのはなぜですか? Git にこれを自動的に解決させる方法はありますか?
OS: Windows8
Git バージョン: 1.9.5
ファイルは確かに同じではありません。
マージされた 2 つのブランチで同じ行/ブロックが別の方法で変更されたことを GIT が検出すると、競合メッセージが発生します。Git は、そのようなケースを自動的に解決しようとはしません。それらの解決は、ファイルの内容のセマンティクスに大きく依存するためです。Git は XML も Java も C# も ASN1 構文も知らず、それらを学ぼうともしません :) それは非常に基本的なことです。
ただし、一部の競合は、プログラマにとって「取るに足らない」ものです。
そのため、通常、TortoiseMerge、WinMerge、KDiff3 などの外部マージ ユーティリティを使用します。これらにはいくつかの異なるアルゴリズム/ヒューリスティックが含まれており、同じ方法で解決されることが非常に多い一般的な「些細な」競合を自動的に検出/解決することができます。たとえば、次のように、単に「重要ではない」として無視されます。
'class Foobar'
vs 'class Foobar'
vs ' class Foobar'
)これらのユーティリティ (特にグラフィカルなもの)の中には、ファイルの生の内容が異なっていても、見た目のテキスト コンテンツが同一に見えるため、ファイルが「同一」であると表示される場合があります。これは好みの問題です。純粋なコード ファイルを操作する場合、通常、Java または C# ファイルが UTF16 または UTF8 として保存されているかどうかは問題ではありません。コードの違いに関心があります。同僚が行末を LF ではなく CRLF で保存したという理由だけで、すべての行が変更されたことを知りたくない場合がよくあります。
ただし、3 つの重要な注意事項: