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

Git: What happens to a branch after a master reset

假设我有一个 master 分支,其中有一些我想保留以供以后记录和参考的提交,但将它们从 master 中删除(因为我希望 master 与上游 repo 处于相同状态)。

我现在的做法是,

  1. 从当前主状态创建一个新分支
  2. 将 master 重置(--hard)到上游 repo 中也存在的状态

现在,我的问题是:

通常分支显示如下,其中(据我了解)D 是新分支的基础。

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

分支 "rebased" 是自动的还是怎么称呼它? 会不会是这个样子?

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

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

没有任何东西会 "happen" 到分支,因为 git 中的分支只是一个轻量级的、可移动的、一次性的指针。 提交 是真实的。

是的,总体规划不错,创建一个新分支来保留最近的提交,将master重置到它应该的位置(我猜origin/master),并且你的 C、D 上的这个 ref 提交 将允许它们永久保留

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

而且 不,如果您遵循宣布的过程,您的 C 和 D 提交 不会 合并到您的上游 master行动。加油吧。

提交链在某些东西指向它们时保持活动状态,否则直到它们被 git gc 擦除,并且您的 pre/post 重置拓扑图是正确的。

What happens to the new branch when removing the reference commit from the master?

没有。

你的问题似乎是基于对分支是什么的误解。分支是一种 ref - 与其他 ref 的不同之处仅在于 git 有一些关于分支指向何处以及它们如何移动的约定。 ref 是指向 commit[1].

的指针

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

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

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

所以 new branch 没有变基或任何东西。 Rebase 是重写和替换提交,因为你想相对于不同的起点进行相同的更改。这不会发生在这里。它是 rebase 的提交,通常当 rebase 提交时,ref 也会随之而来;但是当我们说 'rebase a branch' 时,这有点像 shorthand 代表 'rebase some commits currently reachable from the branch, and then move the branch to point at the new commits'。但在这里我们不需要这些;我们仍然有我们最初的承诺。

'a branch is just a pointer' 的另一面 - 提交不是 "part of" 任何分支。它们独立于任何可能引用它们的分支而存在(尽管 git gc 如果认为没有人知道如何找到它们,最终将尝试处理它们)。分支指向的提交,以及可以通过父指针从那里到达的提交,据说构成了分支的历史……但这就是关系的发展。

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


[1] 一些 refs 偶尔会指向提交以外的其他内容,但这对本次讨论来说并不重要; tl;dr - 分支是指向提交的指针,仅此而已