如果提交的一部分是其父提交,那么最初的提交是如何工作的?

5

基本上是标题。 这篇文章 似乎是讲解提交所构建的内容的主要资源。如果我错过了官方书中描述此主题的文章,请指出给我。

我的问题是关于没有父提交的提交,也就是初始提交。具体来说,在不存在父提交的情况下将进行哈希处理的内容是什么?何时需要父提交?是否可能有多个没有父提交的提交?

在我的实验中,我发现在第一次提交之前,不存在任何分支;这很合理,考虑到分支是对提交的引用,并且尚未存在任何提交。


1
可以没有父节点而有多个提交吗?是的。提交形成一个有向无环图,这样的图不需要单个根节点。然而,在正常使用 Git 的情况下,拥有多个根提交是相当罕见的。参考链接 - jub0bs
1
查找存储库中所有没有父级的提交:git rev-list --max-parents=0。要在现有存储库中创建新的孤立分支,请使用 --orphan,请参见此处 - Romain Valeri
请注意,哈希是通过在提交数据上运行函数(SHA1或现在有时是SHA256)来计算的,这些数据完全是元数据,并且可以使用git cat-file -p <hash-of-commit>打印。保存的源代码位于(单数)tree中,而父级则在每个parent行中逐行列出。父级列表可以为空,可以是一行,也可以是N>1行。 - torek
请注意,由于两个哈希函数都是顺序敏感的,改变父级的顺序会导致两个不同的哈希ID(这是可取的,因为以“其他顺序”合并产生相同的树,但不同的第一父链接,而--first-parent选项仅遍历第一父链接)。 - torek
1个回答

5

系好安全带,因为今天我们要谈论提交!

一个提交可以有多少个父节点?

你想要多少或少就有多少!

提交不一定只有一个父节点。它可以有任意数量的父节点!

  • 初始提交没有父节点
  • 普通提交有1个父节点
  • 合并(merge)提交通常有两个父节点...
  • 但章鱼合并(Octopus Merge)可能导致具有任意数量父节点的提交(Linux内核有一个具有66个父节点的提交,这是一次66路合并的结果!技术术语称为cthulhu合并)。

执行章鱼合并看起来与常规合并相同,只需使用更多参数即可。

常规合并:

# merge branch1 into current branch
git merge branch1 

章鱼合并:

# Merge branches 1, 2, and 3 into the current branch
git merge branch1 branch2 branch3

为什么要经历章鱼合并的恐惧?

如果你想一次性合并多个独立的特性分支,那么章鱼合并可能非常有用。

git switch main
git merge feature-1 feature-2 feature-3 feature-4

如果你只有一个合并提交,那么在历史记录中看起来会更加清晰,而不是一堆连续的合并提交。

最好在很少出现合并冲突的情况下使用。

在 Linux 内核的 66 种合并情况下,他们正在将更新内容合并到一堆单独的驱动程序中,因此分支之间没有冲突。

在初始提交中发生了什么

基本上,全部内容都包括在内。

  • 作者和作者的电子邮件
  • 添加到初始提交的任何文件或目录
  • 提交信息

这意味着如果您更改提交消息(例如使用git commit --amend ),则会更改提交哈希,因此该提交看起来像是一个不同的提交。

是否可能有多个没有父级的提交?

可以! Git 可以做任何事情! 有两种方法可以有多个没有父级的提交:

  • 合并不相关存储库和它自己的历史记录(Linux 内核的历史记录中发生了三次)
  • 创建孤立分支(这是一种不与任何其他分支共享历史记录的分支)

您可以通过git switch --orphan <new branch name>创建孤立分支,它将创建一个空的孤立分支。

注意:要合并具有不相关历史记录的存储库,请执行:

# Add a separate repo as a remote
git remote add other-repo <other-repo-url>
# Fetch the contents of that repo
git fetch other-repo
# Merge the main branch of the other repo into your repo
git merge --allow-unrelated-histories other-repo/main

1
一个可爱而雄辩的回答! - Eden Landau
1
谢谢!如果有任何遗漏,请告诉我! - Alecto Irene Perez
1
注意:这里的“克苏鲁”有点玩笑。它是一只患癌症并长出58只额外触手的章鱼。 :-) - torek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接