我有一个 git repo,它有一个线性的本地历史记录,比如说有 10 个提交,其中前 5 个提交在 的branch1
历史记录中,后 5 个提交在 的branch2
历史记录中,我想通过修改它们来修复这 10 个提交的描述/作者/日期/其他属性。情况如下:
---(old history)---A--B--C--D--E--F--G--H--I--J
^ ^
| |
branch1 branch2
我不确定如何继续。我能想到两种策略来实现我想要的效果,但我想先了解它们的潜在影响。
我宁愿
branch1
先切换到 ,然后对其最后 5 次提交进行交互式变基,完成后再切换到 ,然后branch2
对其最后 5 次提交进行交互式变基。但由于变基意味着在“新分支”中创建新的提交,所以我不知道 的 HEAD 的父级会发生什么branch1
。问题是,这种策略是否会产生某种奇怪的状态,如下所示(让我们branch1'
在变基之后调用新分支):---(old history)---?--?--?--?--?--F--G--H--I--J | ^ ^ | | | | branch1(???) branch2(???) | | --A--B--C--D--E ^ | branch1'
F
或者 git 会以正确的方式修复的父级?另一种策略是切换到
branch2
并直接对其最后 10 次提交进行交互式变基;但问题branch1
又来了,变基之后HEAD 会指向哪里?指向branch2
不再存在于历史记录中的提交?
您的图表表明存在一个需要澄清的根本性误解。如果您从以下方面入手:
并执行交互式 rebase (例如
git checkout branch1; git rebase -i A^
), 提交图将如下所示:完成上述操作后,您只需执行以下操作:
您将获得:
分支 1 位于 ,
E'
分支 2 位于J'
。假设您的第一次交互式变基实际上只是更改了提交元数据,则应该不会发生合并冲突。在此之后(或第一次执行此操作),您可以执行git rebase -i branch1
(假设您仍已branch2
签出)以获取:要记住的关键一点是提交是不可变的。执行 rebase 时,会创建新的提交,但不会(立即)删除旧的提交。(它们可能会在以后的垃圾收集运行中被清理,但除非您更改了一些默认设置,否则几周内不会发生这种情况。)但是,分支非常可变。例如,每次您进行提交时,分支提示都会发生变化以引用新的提交。
branch1'
图表中的存在表明这一点尚未得到很好的理解。