我的历史看起来像这样(按号码/字母排序):
c1a - c1b - c2a - c2b - c4 - c5 - c6 - c8 (master)
| \
| c9 (branch2)
\
c3 - c10 (branch3)
\
c7 - c11 (branch4)
我想压缩提交c2a en c2b,但我找不到分支独立方式这样做,所以我不得不重新调整4次,而不是我期望的结果(星级代表由于重新定位的副本) :
c1a - c1b - c2ab - c4 - c5 - c6 - c8 (master)
||\
|| c2ab* - c4* - c5* - c6* - c9 (branch2)
|\
| c2ab** - c3 - c10 (branch3)
\
c2ab*** - c3* - c7 - c11(branch4)
代替
c1a - c1b - c2ab - c4 - c5 - c6 - c8 (master)
| \
| c9 (branch2)
\
c3 - c10 (branch3)
\
c7 - c11 (branch4)
历史记录的所有修改都是本地的和远程的
我的问题是:
答案 0 :(得分:2)
1)您需要为分支2,3和4至少再运行git rebase
次
2)你不能。如果你改变一个提交,你必须重写每个后代提交,以及与这些提交相关的所有引用(通过rebase)。没有办法解决这个问题。
您的中间图表显示您最初尝试重新定位时出现问题,因此有一次您最终将获得两倍于您通常拥有的rebase操作。
一般来说,如果你有一个已发布的历史记录,其中包含许多提交和参考,我不建议使用它。
从原始图表开始 - 您有3个SHA作为分支的锚点。 C2B通向Master和Branch3,C3通向Branch 4,C6通向Branch2。一旦你为C2B重写了SHA,所有其他的SHA也会发生变化,这使得整个过程真的很复杂,很难自动完成而不直接跟踪中间SHA。以下内容适用于这种特定情况。
请注意,这要求您具有各个分支上的提交的特定知识。你可以尝试在没有提交限制器的情况下进行rebase,但是我偶尔会遇到这样的错误经验(Git的修改比它应该更多,我最终不得不ctrl-c,然后中止并再试一次)
git checkout master
git rebase -i HEAD~5
# edit rebase todo list to combine c2a/c2b
# once rebase has finished, master is OK. Use git log to get the SHA that represents C2AB
git checkout branch2
git rebase --onto master~1 HEAD~1 # this will relocate the one unique commit on branch2 and hang it off of C6'
git checkout branch3
git rebase --onto C2AB_SHA HEAD~2 # this will take the two commits on branch3 and put them onto C2AB
git checkout branch4
git rebase --onto branch3~1 HEAD~2 # this will take the two commits on branch4 and put them on C3'
通常,当您执行此类操作时,您可以将其他分支重新绑定到新分支提示,而不是尝试保留原始父系。它使事情变得更容易。
您的恢复过程实际上是相同的,但略有不同 - 大小和限制说明符。