繁体   English   中英

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

[英]Git: What happens to a branch after a master reset

假设我有一个主分支,我希望保留一些提交以供以后的文档和引用,但是从master中删除它们(因为我希望master与上游repo处于相同的状态)。

我现在的方法是,到

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

现在,我的问题是:

  • 从主服务器中删除引用提交时,新分支会发生什么?
  • 或者在理解如何引用分支时我完全错了。

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

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

分支机构是否自动“重新定位”或您将如何调用它? 它会是这样的吗?

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

最后也许是最一般的问题:

  • 我的方法是将状态保持在一个新的分支并reset --hard主分支是否正确实现了我的目标,即在不将我的提交( CD )合并的情况下将我的分支恢复到上游状态(提交B )?

没有什么会“发生”到分支,因为git中的分支只是一个轻量级,可移动的一次性指针。 提交是真实的。

是的,整体计划是好的 ,建立一个新的分支来保持最近的提交,将master重置到它应该的位置(我猜origin/master ),并且在你的C,D提交上的这个ref 将允许它们永久保留

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

并且不,如果您遵循宣布的行动方案,您的C和D提交将不会合并到您的上游主人。 去吧。

从主服务器中删除引用提交时,新分支会发生什么?

没有。

你的问题似乎是基于对分支的误解。 分支是一种ref - 与其他ref不同,只是因为git有一些关于分支指向和移动方式的约定。 ref是指向commit [1]的指针。

当您重置master ,您只需更改作为master ref的指针,使其停止指向D并开始指向B 这不会以任何方式影响作为new branch ref的指针。

提交CD仍然存在,也不受重置master影响。 只是master不再指向一个可以“到达”的地方(而在达到D之前,因为它是master指向的,而C可以通过D的父指针到达)。

但是new branch仍然指向D ,所以它仍然可以达到CD

所以new branch没有重新定位或任何东西。 重新引用是重写和替换提交,因为您希望相对于不同的起点进行相同的更改。 这不会发生在这里。 它的承诺是重新定位的,并且通常在变形提交时,ref会继续骑行; 但是,当我们说'rebase a branch'这是一种“rebase”的简写时,可以从分支中获得一些提交,然后将分支移动到指向新提交的位置。 但在这里我们不需要任何这些; 我们仍然有我们的原始提交。

'分支的另一面只是一个指针' - 提交不是任何分支的“一部分”。 它们的存在独立于任何可能引用它们的分支(尽管git gc最终会尝试处理它们,如果它认为没有人知道如何找到它们的话)。 分支指向的提交,以及可以通过父指针从那里到达的提交,据说构成了分支的历史......但这就是关系的结果。

所以重申并总结一下 - 重置master 只会移动一个指针 它不会更改提交,也不会影响其他分支。


[1]有些裁判偶尔会指出除了提交之外的东西,但这对于这个讨论来说并不重要; tl; dr - 分支是指向提交的指针,仅此而已

提交链保持活着,而某些东西指向它们,或者直到它们被git gc擦除,并且您的前/后重置拓扑图是正确的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM