Git:主复位后分支会发生什么

时间:2019-03-07 18:21:46

标签: git git-reset

假设我有一个master分支,其中包含一些提交,我希望保留这些提交以供以后的文档和参考,但是将它们从master删除(因为我希望master处于与上游回购相同的状态)。

我现在的方法是

  1. 从当前主状态创建新分支
  2. 将主服务器重置(--hard)到上游存储库中也存在的状态

现在,我的问题是:

  • 从母版中删除引用提交后,新分支会发生什么?
  • 或者在理解如何引用分支方面我完全错了。

通常以以下方式显示分支,其中(据我所知)D是新分支的基础。

A - B - C - D    (master)
             \
                 (new branch)

分支是自动“重新设置”的,或者您将如何称呼它? 然后看起来像这样吗?

A - B         (master)
     \
      C - D   (new branch)

最后一个,也许是最普遍的问题:

  • 我的方法是将状态保留在新分支中,而将reset --hard保留在主分支中是实现我的使叉返回上游状态(提交B)的目标的正确方法,提交(CD)合并了?

3 个答案:

答案 0 :(得分:4)

什么都不会“分支”到分支,因为git中的分支只是一个轻量,可移动,可抛弃的指针。 提交是真实的东西。

是的,总体计划是好的,创建一个新分支以保留最新的提交,将master重置为应该的位置(我猜为origin/master),并且此引用对您C,D提交将允许他们永久停留

如果不创建分支,即使它们在reflog中停留了一段时间,也最终将被垃圾回收。

而且不,如果您遵循已宣布的操作方针,您的C和D提交不会会合并到上游主机中。去吧。

答案 1 :(得分:3)

  

从母版删除引用提交后,新分支会发生什么?

没事。

您的问题似乎是基于对分支机构的误解。分支是ref的一种-与其他ref的区别仅在于git对于分支指向何处以及它们如何移动有一些约定。 ref是指向commit [1]的指针。

重置master时,只是在更改master引用的指针,以使其不再指向D并开始指向B。但这丝毫不会影响作为new branch引用的指针。

提交CD仍然存在,并且不受重置master的影响。只是master不再指向可以“到达”它们的位置(而在到达D之前是因为master所指,而{{1} }可以通过C的父指针到达。

但是D仍然指向new branch,因此它仍然可以到达DC

因此D没有重新设置基准或其他任何内容。变基就是重写和替换提交,因为您要相对于不同的起点进行相同的更改。这不是在这里发生。那些提交是基于基础的,通常在重新提交基础时提交一个引用。但是,当我们说“对分支进行基础设置”时,这是“对当前可从分支进行的某些提交进行基础设置,然后将分支移至新的提交位置”的简写形式。但是在这里我们不需要任何东西。我们仍然有原始提交。

“分支只是指针”的另一面-提交不是任何分支的“一部分”。它们的存在独立于可能引用它们的任何分支(尽管new branch如果认为没有人知道如何找到它们,最终将尝试处置它们)。分支指向的提交,并且可以通过父指针从那里到达的提交构成了分支的历史记录……但是就关系而言。

因此要重申和总结-重置git gc 仅移动指针。它不会更改提交,也不会影响其他分支。


[1]有些引用有时可能指向提交以外的内容,但这对本次讨论并不重要。 tl; dr-分支是指向提交的指针,仅此而已

答案 2 :(得分:1)

在某些事物指向它们的情况下,提交链保持活动,否则直到被git gc擦除,并且您的复位前/复位后拓扑图是正确的。