Git:主复位后分支会发生什么
Git: What happens to a branch after a master reset
假设我有一个 master 分支,其中有一些我想保留以供以后记录和参考的提交,但将它们从 master 中删除(因为我希望 master 与上游 repo 处于相同状态)。
我现在的做法是,
- 从当前主状态创建一个新分支
- 将 master 重置(--hard)到上游 repo 中也存在的状态
现在,我的问题是:
- 从 master 中删除引用提交时新分支会发生什么?
- 或者我对如何引用分支的理解完全错误。
通常分支显示如下,其中(据我了解)D
是新分支的基础。
A - B - C - D (master)
\
(new branch)
分支 "rebased" 是自动的还是怎么称呼它?
会不会是这个样子?
A - B (master)
\
C - D (new branch)
最后一个也是最普遍的问题:
- 我将状态保持在新分支和
reset --hard
主分支中的方法是否是实现让我的分支返回上游状态(提交 B
)的目标的正确方法?我的提交(C
和 D
)合并了吗?
没有任何东西会 "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 的指针。
提交 C
和 D
仍然存在,并且也不受重置 master
的影响。只是 master
不再指向他们可以 "reached" 的地方(而之前 D
可以到达,因为它是 master
指向的地方,并且 C
可以通过 D
的父指针到达)。
但是new branch
仍然指向D
,所以它仍然可以到达C
和D
。
所以 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 - 分支是指向提交的指针,仅此而已
假设我有一个 master 分支,其中有一些我想保留以供以后记录和参考的提交,但将它们从 master 中删除(因为我希望 master 与上游 repo 处于相同状态)。
我现在的做法是,
- 从当前主状态创建一个新分支
- 将 master 重置(--hard)到上游 repo 中也存在的状态
现在,我的问题是:
- 从 master 中删除引用提交时新分支会发生什么?
- 或者我对如何引用分支的理解完全错误。
通常分支显示如下,其中(据我了解)D
是新分支的基础。
A - B - C - D (master)
\
(new branch)
分支 "rebased" 是自动的还是怎么称呼它? 会不会是这个样子?
A - B (master)
\
C - D (new branch)
最后一个也是最普遍的问题:
- 我将状态保持在新分支和
reset --hard
主分支中的方法是否是实现让我的分支返回上游状态(提交B
)的目标的正确方法?我的提交(C
和D
)合并了吗?
没有任何东西会 "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 的指针。
提交 C
和 D
仍然存在,并且也不受重置 master
的影响。只是 master
不再指向他们可以 "reached" 的地方(而之前 D
可以到达,因为它是 master
指向的地方,并且 C
可以通过 D
的父指针到达)。
但是new branch
仍然指向D
,所以它仍然可以到达C
和D
。
所以 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 - 分支是指向提交的指针,仅此而已