假设我有一个master分支,其中包含一些提交,我希望保留这些提交以供以后的文档和参考,但是将它们从master删除(因为我希望master处于与上游回购相同的状态)。
我现在的方法是
现在,我的问题是:
通常以以下方式显示分支,其中(据我所知)D
是新分支的基础。
A - B - C - D (master)
\
(new branch)
分支是自动“重新设置”的,或者您将如何称呼它? 然后看起来像这样吗?
A - B (master)
\
C - D (new branch)
最后一个,也许是最普遍的问题:
reset --hard
保留在主分支中是实现我的使叉返回上游状态(提交B
)的目标的正确方法,提交(C
和D
)合并了?答案 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
引用的指针。
提交C
和D
仍然存在,并且不受重置master
的影响。只是master
不再指向可以“到达”它们的位置(而在到达D
之前是因为master
所指,而{{1} }可以通过C
的父指针到达。
但是D
仍然指向new branch
,因此它仍然可以到达D
和C
。
因此D
没有重新设置基准或其他任何内容。变基就是重写和替换提交,因为您要相对于不同的起点进行相同的更改。这不是在这里发生。那些提交是基于基础的,通常在重新提交基础时提交一个引用。但是,当我们说“对分支进行基础设置”时,这是“对当前可从分支进行的某些提交进行基础设置,然后将分支移至新的提交位置”的简写形式。但是在这里我们不需要任何东西。我们仍然有原始提交。
“分支只是指针”的另一面-提交不是任何分支的“一部分”。它们的存在独立于可能引用它们的任何分支(尽管new branch
如果认为没有人知道如何找到它们,最终将尝试处置它们)。分支指向的提交,并且可以通过父指针从那里到达的提交构成了分支的历史记录……但是就关系而言。
因此要重申和总结-重置git gc
仅移动指针。它不会更改提交,也不会影响其他分支。
[1]有些引用有时可能指向提交以外的内容,但这对本次讨论并不重要。 tl; dr-分支是指向提交的指针,仅此而已
答案 2 :(得分:1)
在某些事物指向它们的情况下,提交链保持活动,否则直到被git gc
擦除,并且您的复位前/复位后拓扑图是正确的。