我有一个遥控器,上面有很多指向旧提交的标签。我想强行推动改变。我明白,当我强行推动时,历史就会消失。但是,我不确定现有标签会发生什么,因为当我现在强制推送时,所有提交的 ID 都会发生变化。
答案是,除非您强制推送标签,否则标签不会发生任何事情。
分支名称和标签名称都只是一种指针:它们包含提交的原始哈希ID,1以便 Git 可以找到该提交。 Git 在较低级别通过哈希 ID 工作:给定提交的哈希 ID,例如3e5524907b43337e82a24afbc822078daf7a868f
,Git 可以提取该提交。
每个提交本身都有一组用于其父级或父级的哈希ID,这意味着我们可以说此提交指向其父级。如果我们用箭头绘制这些不同的项目中的每一个,指向它们指向的任何东西,我们会得到一个在简单情况下看起来像这样的图表:
... <--F <--G <--H <--branch
^
|
tag:v1.0
假设你使用 force-push 使名称branch
直接指向提交F
而不是提交H
;那么我们可能不得不重新绘制这个:
...--F <-- branch
G--H [lost / abandoned]
^
|
tag:v1.0
标记名称v1.0
继续指向提交G
。 提交H
不再可以通过任何名称找到 - 过去唯一让我们找到提交H
的名称,即branch
,现在已经消失了。 这使得提交H
有资格进行垃圾回收,并且在将来的某个时候,它将真正从存储库中删除。
(请注意,如果我们的图不完整,并且其他名称允许Git 找到提交H
,则提交将被保留。 如果从图中的该点开始,有某种方法可以通过箭头向后工作(所有这些箭头在这些绘图中都指向左,即使我们只是将它们绘制为--
(,则可以从图中的某个点到达提交。 从任何引用访问的任何提交(包括分支名称和标记名称,以及此答案不需要的其他引用形式(都将保留。 因此,G
将通过标签保留,其所有父项及其父项的父项也是如此,依此类推。 任何无法访问的提交都是垃圾回收的候选项。
1标签可以指向任何对象,而分支名称被限制为仅指向提交。 不过,出于我们在这里的目的,我们假设您的标签指向提交。