Gitで普通にコミットすると1つの親コミットを持つコミットが生成され、あるブランチを別のブランチにマージすると親コミットが2つのマージコミットが生成される。よくある状況ではこのように親コミットは2つまでだが、実は3つ以上の親を持つマージコミットを作ることもできる:
% git log -1
commit 58f10941837dda3b1536ecfada244ffbf6f195ea
Merge: d3973e3 2a25fae 695077b
Author: Foo Bar <foo@example.org>
Date: Sat Nov 26 10:00:44 2016 +0900
Merge branches 'aaa' and 'bbb'
% git log --oneline --graph
*-. 58f1094 Merge branches 'aaa' and 'bbb'
|\ \
| | * 695077b bbb
| |/
|/|
| * 2a25fae aaa
|/
* d3973e3 master
git-merge(1) によるとこういうマージを Octopus merge と呼ぶとのこと。
<commit>...
Commits, usually other branch heads, to merge into our branch.
Specifying more than one commit will create a merge with more than
two parents (affectionately called an Octopus merge).
使い道としては、複数の永続ブランチから自動で継続的にマージをしていく事例が git merge-distinct: octopus-merge で複数ブランチを効率的に処理する で紹介されているのを見つけた。私はまだ実際に現場で使ったことはないのだが、一度に3つ以上のブランチを統合するケースで利用できるので、例えば、互いに依存関係のあるモジュールを複数のフィーチャーブランチで並行で開発していて、統合先のブランチに両方一気にマージしたい場合(統合先に依存関係が壊れた状態のコミットを作りたくない時)に使えるかも。他にはどういうシーンで使えるだろうか。
(2021.12.18追記) stashを保持するためのデータ構造として3つ親のマージコミットが使われていました。詳しくはgit stashの仕組みが面白いをご覧下さい。