41

共通の祖先Aから分岐した2 つのブランチ ( BC ) があるとします。BからC へのマージは、 CからBマージと同じ結果になりますか?

  A
  |
 / \
B   C

明確にするために、手動のマージ競合の解決は双方向で行われると想定しています。しかし、自動マージが行われると、同じコードが選択されるのでしょうか? コミット日は両方向で同じであるため、これは私が想定していることです。

さらに明確にするために、実際のマージは、方向に基づいて互いの「鏡像」になることを知っています。自動的に解決された競合について尋ねているだけです。

4

4 に答える 4

28

デフォルトのマージの場合、答えはイエスです。3 方向マージは、共通の祖先を見つけてから、両側からの違いを適用します。これは、順序に依存しない操作です。マージ順序付けと可換性のトピックは、git リストに関する興味深い議論を引き起こしました(その種のことに興味がある場合はそうです)。B into Cとは対称である必要がありますが、 vsC into Bについては必ずしも同じとは言えません。(B into C) into AB into (C into A)

[編集メモ、2020 年 4 月:-X oursまたはのようなオプションを追加する-X theirsと、答えは「いいえ」になります。追加の注意事項については、 twalberg の回答とその他を参照してください。


以下のVinceのコメントと質問に関するsehのコメントに基づいて、もう少し詳しく説明すると、 と の間に2つの顕著な違いがB into CありC into B、どちらも質問で参照されている自動マージ解決には影響しません。

まず歴史が違う。マージ コミットの親は、マージの順序によって変わります。これらの例では、「first_branch」と「second_branch」を使用して、コミットを表す文字を予約できるようにします。

git checkout first_branch && git merge second_branch

E <- merge commit
|\
| D <- second_branch's tip
| |
| C <- another commit on second_branch 
| |
| B <- and another
|/
A <- first_branch's tip before the merge

この場合、E, の「最初の親」はE^1、マージ前の first_branch のヒントです。second_branch は、マージ コミットの「2 番目の親」、つまりE^2です。逆を考えてみましょう:

git checkout second_branch && git merge first_branch

E <- merge commit
|\
| D <- first_branch's tip
| |
| C <- another commit on first_branch 
| |
| B <- and another
|/
A <- second_branch's tip before the merge

両親が逆です。E^1マージ前の second_branch の先端です。E^2first_branch の先端です。

次に、競合の表示順序が逆になります。最初のケースでは、競合は次のようになります。

<<<<<<< HEAD
This line was added from the first_branch branch.
=======
This line was added from the second_branch branch.
>>>>>>> second_branch

2 番目のケースでは、同じ競合は次のようになります。

<<<<<<< HEAD
This line was added from the second_branch branch.
=======
This line was added from the first_branch branch.
>>>>>>> first_branch

これらの違いはどちらも自動マージ解決には影響しませんが、3 者間マージ順序を逆にすると表示されます。

于 2012-08-30T13:39:32.543 に答える
2

それはあなたが「同じ結果」によって何を意味するかによります。コンテンツの観点から、競合がないか、既存のすべての競合がまったく同じ方法で細心の注意を払って解決されると仮定すると、結果として生じる新しいマージコミットの内容は同じである必要があります。

ただし、履歴トポロジの観点からは、この2つは大きく異なります。ブランチBにいて、Cでマージする場合、BのHEADはマージコミットを指すように移動しますが、Cはその場所に留まります。逆に、Cを使用していて、Bにマージすると、CのHEADが移動し、Bはその場所に留まります。したがって、最終的なトポロジは大きく異なります。これは、どちらの場合も新しいコミットの内容が同じであっても、どちらのブランチでも将来の開発に影響を及ぼします。

于 2012-08-30T14:26:09.627 に答える
0

いいえ、対称ではないと思います。最初に、マージ戦略オプションを設定できます。特に、B または C が選択されるかどうかを決定するtheirsorの場合です。ours

自動マージでは、たとえば、自分のブランチにマージする場合、リモート ブランチが変更よりも優先されるためgit merge C、B から呼び出すと C の変更が選択されることになります。ただし、100% 確信があるわけではないので、ご自分で試してみて、お知らせください。

于 2012-08-30T08:40:20.180 に答える