Git は 3方向マージを行なう手助けをします。これは 任意の回数繰り返すことにより n方向マージに拡張することができます。 通常は3方向マージ(2つの親によるマージ)のみを行ないますが、 複数の親を1回でマージすることもできます。
3方向マージをするには、マージする2組の "commit" オブジェクトが 必要です。これを使用し共通の親(3番目の"commit"オブジェクト)を見つけ、 それら commit オブジェクトを使用してディレクトリ("tree" オブジェクト) の状態を探します。
マージの "ベース" を得るには、まず次のようにして 2つのコミットの共通の親を見つけます。
$ git merge-base <commit1> <commit2>
これは、共通のベースコミットを返却します。 これらコミットの "tree" オブジェクトは次のようにして 容易に見つけることができます。(例えば)
$ git cat-file commit <commitname> | head -1
tree オブジェクトの情報は、コミットオブジェクトの1行目に 常に記述されています。
マージしようとする3つのツリー(1つは "original"の tree いわゆる 共通の tree、 2つの "結果" tree、いわゆるマージしたいブランチ)を知った後は、 索引に読み込んでそれらを "マージ" します。 古い索引の中身を破棄しなくてはならない場合、エラーを表示します。 従ってそれらをコミットしたか確認してください。— 実際、通常は常に 最後にコミットした内容をもとにマージします(そのコミットは従って 現在の索引の内容と一致します)
マージをするには次のひょうにします。
$ git read-tree -m -u <origtree> <yourtree> <targettree>
これにより、自明のマージ操作は直接索引ファイルに行なわれ、
git write-tree
を用いてその結果を書き込むことができます。