gitコミットに2つ以上の親を含めることはできますか?


48

、このドキュメントは言及されています

コミットオブジェクトには、任意の数の親を含めることができます。

しかし、私の理解では、コミットに複数の親が含まれる唯一のケースは、マージが発生したときであり、その場合、2つの親しかありません。だから私の質問は、コミットには2人以上の親を持つことができますか?もしそうなら、いつ?


11
github.com/torvalds/linux/commit/…-Githubが27-way diffを表示する方法を知っているとは思いませんが、リポジトリを複製して自分で表示してください。
user253751

回答:


43

git mergeを使用して、複数のコミットを現在のブランチにマージできます。からman git-merge(またはgit help merge):

git-merge-2つ以上の開発履歴を結合します

その結果、3つ以上の親とのコミットが行われます。


33
複数のブランチのマージ(つまり、2つ以上の親とのコミット)は、「タコマージ」として口語的に知られています。また、GitHubのロゴとマスコットである8本足の猫のインスピレーションの源でもあります。もともとはOctopussと呼ばれていましたが、より企業に優しいOctocatに改名されました。
ヨルグWミットタグ

4
一連のコミットではなく、単一のコミットで3つ以上のブランチをマージする利点は何ですか?
TorのKlingberg

2
@TorKlingberg Cleanerの履歴。ただし、リモート製品にプッシュする前に最終製品をテストしてください。
フェリービッグ

5
@KasunSiyambalapitiya- 1つの特定のgithubリポジトリに複数の例があります。多くのタコの1つは、27の親含むレポにマージされます。
デビッドハンメン

1
@JörgWMittag文字通り、それは真実ではありません。出典:GitHubで5年間勤務。
-gjtorikian

5

はい、10万人の親はどうですか?

以下は、10万件のコミットがマージされたライブGitHubの例です。https : //github.com/cirosantilli/test-octopus-100k このスクリプトで生成されました

トリビア

Linusは、60人を超える親とのコミットを好みません:https : //www.destroyallsoftware.com/blog/2017/the-biggest-and-weirdest-commits-in-linux-kernel-git-history

それは引っ張られて、それで問題ありませんが、「タコのマージは問題ありません」と「キリスト、それはタコではなく、クトゥルフのマージです」との間には明らかにバランスがあります。

Gitコミットオブジェクトの形式をご覧ください

https://stackoverflow.com/questions/22968856/what-is-the-file-format-of-a-git-commit-object/37438460#37438460

その分析から、親リストのリストは、任意の改行で区切られたタイプのリストであることがわかります。

parent {parent_1_sha}
parent {parent_2_sha}
...
parent {parent_N_sha}

したがって、任意の数の親が許可されます。

最小限の例

脚本:

#!/usr/bin/env bash
set -eu

mkdir tmp
cd tmp
git init

touch root
git add .
git commit -m root
sha_root="$(git log -1 --format="%H")"

touch 1
git add .
git commit -m 1
sha1="$(git log -1 --format="%H")"

git reset --hard "$sha_root"
touch 2
git add .
git commit -m 2
sha2="$(git log -1 --format="%H")"

git reset --hard "$sha_root"
touch 3
git add .
git commit -m 3
sha3="$(git log -1 --format="%H")"

git merge -m merge "$sha1" "$sha2"

出力:

*-.   2d2a6c2 (HEAD -> master) merge
|\ \  
| | * 2300c18 2
| * | 7e096cb 1
| |/  
* | 50aa125 3
|/  
* a1e94fd root

GitHubがその規模のマージを処理できないのか、それともプライベートリポジトリとして残したのかはわかりません。または、GitHubに関連のない問題がある場合。しかし、私にとっては、100kのマージリンクは500エラーです。
8ビットツリー

処理できない@ 8bittree、プライベートリポジトリは400です:-) github.com/isaacs/github/issues/1344
Ciro Santilli新疆改造中心法轮功六四事件

FOSSの支持者であるひげを生やしたサンダルと、私が繰り返ししているLovecraftとの関係は何ですか?
ニュートリノ

3

マージ時に複数のブランチを指定できます。

例えば:

git merge branch_A branch_B branch_C [...]

その後、コミットにはより多くの親がいます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.