1

我在 git 中有以下历史记录:

* 02e085a (master) readme update
| * 1d940da (HEAD -> b1) search.py
| | * 7aaa12d (b2) file2
| |/
| * 7be9db9 file1
|/
* 22601c0 initial commit

现在我在 b2 上,我想明白 b2 分支的地方(7be9db9)。算法如下:

  1. 获得下一次提交
  2. 检查提交所属的分支
  3. 如果只有当前分支,则继续 1. step else 4.step
  4. 提交属于多个分支,这一定是我们分支的点

但是,如果我想对 b1 做同样的事情,我最终会在同一个位置 - 7be9db9。但我预计最终会在 22601c0,因为这是 b1 分支的点。历史就是这样创造的。

来自 master (b1) 的初始提交分支和提交来自 b1 (b2) 的 file1 分支和提交 file2 checkout b1 并提交 search.py

恐怕git的设计方式,无法区分,commit 7be9db9(file1)是b1还是b2创建的,对吗?所以不能说b1的父母是master还是b2?

感谢您的确认。

4

1 回答 1

4

恐怕git的设计方式,无法区分,commit 7be9db9(file1)是b1还是b2创建的,对吗?所以不能说b1的父母是master还是b2?

正确,不可能知道 b1 是从 b2 分支出来的,还是 b2 从 b1 分支出来的。当 b2 从 b1 分支时,它们指向同一个提交并且在拓扑上是相同的。不存储参考历史。

如果您的流程需要知道这一点,而我正在努力思考为什么,请选择另一个流程。

您可以知道的是两个分支之间的通用合并基础git-merge-base。通常这是您想要的信息。例如,Github Pull Request 知道您要合并到哪个分支,并且可以获取所有要合并的提交base..branch

于 2021-03-12T08:33:12.140 回答