git commit可以有两个以上的父母吗?


48

本文档中提到

提交对象可以具有任意数量的父对象。

但是据我了解,一次提交将有多个父级的唯一情况是发生合并时的情况,在这种情况下,将只有两个父级。所以我的问题是,一次提交可以有两个以上的父母吗?如果是这样,什么时候?


11
github.com/torvalds/linux/commit/…-我不认为Github知道如何显示27向差异,但可以随时克隆存储库并自己查看。
user253751 '16

Answers:


43

您可以使用git merge将多个提交合并到当前分支中。来自man git-merge(或git help merge):

git-merge-将两个或多个开发历史结合在一起

当您这样做时,将导致与两个以上父母的承诺。


33
一个以上分支的合并(即具有两个以上父代的提交)俗称“章鱼合并”。这也是GitHub徽标和吉祥物(八足猫)的灵感来源:它最初被称为Octopuss,但改名为对企业更友好的Octocat。
约尔格W¯¯米塔格

4
在单个提交而不是一系列提交中合并三个或更多分支的优点是什么?
Tor Klingberg

2
@TorKlingberg清洁历史,但请确保在进行远程检修之前先测试最终产品。
Ferrybig

5
@KasunSiyambalapitiya-在一个特定的github存储库中有多个示例。该回购中的许多章鱼合并之一,涉及27个父母
David Hammen

1
@JörgWMittag从字面上看,这都不是真的。资料来源:在GitHub工作了五年。
gjtorikian

5

是的,十万个父母呢?

这是一个实时GitHub示例,其中包含10万次提交的合并: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错误。
8bittree


穿着FOSS的有胡子凉鞋的拥护者与我反复提到的Lovecraft之间有什么联系?
Neutrino

3

合并时,您可以指定多个分支。

例如:

git merge branch_A branch_B branch_C [...]

然后提交有更多的父母。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.