1. ホーム
  2. git

[解決済み] git mergeの詳細について教えてください。

2022-05-15 23:59:38

質問

git merge」の背後にある正確なアルゴリズム(またはそれに近いもの)を知りたいのです。少なくともこれらのサブクエスチョンへの回答は役に立つでしょう。

  • git はどのように特定の非競合的な変更のコンテキストを検出するのですか?
  • git はどのようにして、これらの正確な行に競合があることを発見するのでしょうか?
  • gitはどのようなものを自動マージするのですか?
  • ブランチをマージするための共通のベースがない場合、git はどのように動作しますか?
  • ブランチをマージするための共通のベースが複数ある場合、git はどのように動作しますか?
  • 複数のブランチを一度にマージするとどうなりますか?
  • マージ戦略の違いは何ですか?

しかし、アルゴリズム全体の記述はもっと良いものになります。

どのように解決するのですか?

3ウェイマージアルゴリズムの記述を探すのが一番いいかもしれません。高レベルの説明は次のようなものです。

  1. 適切なマージベースを見つける B - 新しいバージョンの両方の祖先であるファイルのバージョン ( XY の特徴の一つである、さらに遡る必要がある場合もありますが)、通常は最新のそのようなベースです。 git のデフォルトの recursive をマージする)
  2. の diff を実行します。 XBYB .
  3. 2 つの差分で識別された変更ブロックの中を歩いてください。一方が変更を導入し、もう一方がその領域をそのままにする場合、最終的にその変更を導入します。両方が同じ場所に変更を導入し、それらが一致しない場合、手動で解決するために競合をマークします。

完全なアルゴリズムでは、これをより詳細に扱っており、いくつかの文書もあります ( https://github.com/git/git/blob/master/Documentation/technical/trivial-merge.txt と共にあります。 git help XXX のページで、XXX は以下のうちの一つです。 merge-base , merge-file , merge , merge-one-file といった具合です)。もしそれが十分に深くないのであれば、いつでもソースコードがあります...。