【问题标题】:If part of a commit is its parent, how do initial commits work?如果提交的一部分是其父提交,那么初始提交如何工作?
【发布时间】:2021-11-03 16:32:30
【问题描述】:

基本上是标题。 This 似乎是构建提交的首选资源。我在官方书籍中找不到描述这个主题的文章,所以如果我错过了,请指出来。

我的问题是关于没有父母的提交,即初始提交。具体来说,在不存在父提交的情况下会散列什么?而且,何时需要父提交?是否可以在没有父母的情况下进行多次提交?

在我的实验中,我发现在第一次提交之前,不存在任何分支;考虑到分支是提交的引用,这是有道理的,而且还没有。

【问题讨论】:

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

标签: git


【解决方案1】:

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

一个提交可以有多少个父母?

你想要多少都可以!

提交不必只有一个父级。它可以有任意数量的父母!

  • 初始提交有 0 个父项
  • 普通提交有 1 个父项
  • 合并提交通常有 2 个父级...
  • 但是 Octopus Merges 可以导致与任意数量的父级提交(Linux 内核有一个包含 66 个父级的提交,这是 66 路合并的结果!这方面的技术术语是 cthlulhu 合并。)

进行章鱼合并看起来就像常规合并,只是参数更多。

常规合并:

# 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 内核的历史上已经发生了 3 次)
  • 创建一个孤立分支(这是一个不与任何其他分支共享历史记录的分支)

您可以通过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

【讨论】:

  • 一个可爱而雄辩的答案!
  • 谢谢!如果有任何遗漏,请告诉我!
  • 注意:“Cthulhu”在这里有点开玩笑。这是一只已经癌变并长出 58 条手臂的章鱼。 :-)
猜你喜欢
  • 2016-05-05
  • 1970-01-01
  • 2010-09-30
  • 2010-11-03
  • 2020-12-12
  • 1970-01-01
  • 2014-05-04
  • 2021-12-08
相关资源
最近更新 更多