强制推送到远程 Git 存储库时,现有标签会发生什么情况?

  • 本文关键字:标签 什么情况 存储 Git git
  • 更新时间 :
  • 英文 :


我有一个遥控器,上面有很多指向旧提交的标签。我想强行推动改变。我明白,当我强行推动时,历史就会消失。但是,我不确定现有标签会发生什么,因为当我现在强制推送时,所有提交的 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标签可以指向任何对象,而分支名称被限制为指向提交。 不过,出于我们在这里的目的,我们假设您的标签指向提交。

相关内容

最新更新