11
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

親を3つ以上持つコミット

Last updated at Posted at 2016-11-26

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の仕組みが面白いをご覧下さい。

11
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?