2013-11-21 12 views
6

私はgitを数年間使用していましたが、マージを行うたびにいくつかの奇妙な矛盾が報告されます。ここに矛盾があるどのようにGit:偽のマージ競合ですか?

# Protect files and directories from prying eyes. 
<FilesMatch "\.(engine|inc|info|install|make|module|profile|test|po|sh|.*sql|theme|tpl(\.php)?|xtmpl)(~|\.sw[op]|\.bak|\.orig|\.save)?$|^(\..*|Entries.*|Repository|Root|Tag|Template)$|^#.*#$|\.php(~|\.sw[op]|\.bak|\.orig\.save)$"> 
<<<<<<< HEAD 
    Order allow,deny 
</FilesMatch> 

# Hide important scripts from malicious users. 
<FilesMatch "^(autoinstall\.php|install\.php|update\.php)$"> 
======= 
>>>>>>> 7.24 
    Order allow,deny 
</FilesMatch> 

:ここで私はDrupalのコアの新しい7.24リリースに合併したときから、.htaccessファイルの例ですか?ホワイトスペース/エンドラインの相違の潜在的なケースでもありません。ただちにはありません。は競合の7.24セクションにあります。

gitがこれについて不平を言っているのはなぜですか? Gitはab両方が0から変更されていることを検出した場合、これはそれを防ぐマージ問題を引き起こし

0 
|_________ 
    |  | 
    a  b 
    |_____|_ 
      | 
      M 

:私はおそらく根本的な何かを誤解...

答えて

1

競合を2つの側面のみで判断することはできません。両側が共通の祖先から異なる変更を加えると、競合が発生します。

片面に「何もない」という事実は問題ではありません - そこにはがありました。祖先で何かがでした。

競合ファイルに祖先を表示することで、競合に関するさらに多くのデータを取得できます。

git config merge.conflictstyle diff3 

これは、競合の3つの側面をすべて表示します。

0

Gitがそのマージの共有の祖先を選択していますマージされたファイルMを自動的に作成しないようにします。

p4mergeのような適切な3方向マージツールで見ましたか? gitが共有している祖先であると思っていることと、矛盾する変更として認識していることを示すのに役立ちます。

+1

また、 "git config --global merge.conflictstyle diff3"を有効にすると、マージ競合の共通祖先を確認することができます。 –

0

そうここにあなたの偽の競合に何が起こっているかのまともな説明があります:The criss-cross merge case (2005-04-28)

A 
|\ 
| \ 
| \ 
| \ 
| \ 
|  \ 
|  \ 
B8  C3 
|\  /| 
| \ /| 
| \/| 
| X | 
|/\ | 
|/ \ | 
|/  \| 
D8  E3 
\  | 
    \  | 
    \ | 
    \ | 
    \ | 
     \ | 
     \| 
     ? 

[...]

問題は、3ウェイマージのための単一の祖先がないということです これは正しいことです。

ちなみに、この記事は、BitTorrentの作者の一人であるBram Cohenによって書かれました。彼は後にhis own alternative to Gitを開発しようとしましたが、このような問題を回避することを望んでいました。彼の問題の分析は間違いないが、私は彼が本当にそれを解決することができたとは思わない。なぜこれがおそらく解決できないのかという興味深い理由がありますが、StackOverflowの投稿はそのウサギの穴のための適切な場所ではありません。

関連する問題