强制推送到远程git存储库时,现有标记会发生什么?

时间:2018-06-18 20:48:57

标签: git

我有一个遥控器,其中有很多标签指向较旧的提交。我想强迫改变。我明白,当我强行推动时,历史将会消失。但是,我不确定现有标签会发生什么,因为当我强制推送时,提交ID将针对所有提交进行更改。

1 个答案:

答案 0 :(得分:2)

答案是,除非您强制推送标记,否则标记不会发生任何事情。

分支名称和标记名称只是一种指针:它们包含提交的原始哈希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,则将保留提交。提交可到达从图中的某一点开始,如果从图中的那一点开始,有一些方法可以向后通过箭头 - 所有这些都指向这些图中的向左,即使我们只是将它们绘制为{{1} - 来自任何引用的任何提交 - 这包括分支名称和标记名称,以及此答案不需要的其他形式的引用 - 保留。因此,{{ 1}}将通过标签保留,所有父母及其父母的父母也将保留,等等。任何可达的提交都是垃圾收集的候选者。)

1 标记可以指向任何对象,而分支名称约束为指向提交。但是,出于我们的目的,我们假设您的标记指向提交。