3

如果你有一个这样的 git commit 树会发生什么:

A-B-C-D          D <-- v0.9 (tag)

并且您接受了一个拉取请求,该请求的更改早于先前标记的提交;标签现在是否包含来自合并拉取请求的提交?

A-F-B-G-C-D      D <-- ? v0.9 (tag)
4

1 回答 1

6

在 git 中,标签指向特定的提交对象。如果您实际上已经完成了,git pull --rebase那么您的图表如下所示:

A-B-C-D

A-F-B'-G-C'-D'

实际的提交对象取决于树的状态和父系,因此即使从 C 到 D 的差异与 C' 和 D' 之间的差异完全相同,它们也是不同的提交对象。

因此,您的问题的答案是,该v0.9标签将始终指向第一次创建标签时的 D 版本。因此,如果您重写了历史记录,您将拥有一个标签,该标签指向一个不再位于当前分支树中的提交。

但是,如果您的意思是在您推送 BC 和 D 之前有人已经提交并推送到分支 FBG 和 C,那么会发生什么将取决于您在执行所需的 pull 以更新您的具有现有历史的本地分支机构。

默认是合并。这将使您的图表如下所示:

A-F-B-G-C
 \       \
  B-C-D---M

您的分支头指向 M 的位置,而树的每个分支中的 B 和 C 会有所不同(即使您俩都从其他地方挑选了相同的提交)。

更新

tl;博士:

  • 谁先提交(时间)无关紧要:顺序取决于图表以及您组合和/或更改图表的选项(合并、变基、挑选)。您决定最终结构的外观。
  • 提交对象(标签指向的东西)永远不会改变,所以你的标记提交不会被更新
  • 由于提交不会改变,所以当历史被重写时,即使差异相同,您实际上也有新的提交对象。看起来事情正在发生变化,但实际上它们在图中被替换为看起来非常相似的东西。
于 2013-05-19T23:03:53.623 回答