我有这样一段历史(按数字/字母排序):
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)对历史的所有修改都是本地的和远程的。
我的问题是:
发布于 2014-10-01 21:08:08
1)对于分支2、3和4,至少需要再运行3次git rebase
2)你不能。如果你改变了一个提交,你必须重写每一个后代提交,以及所有与这些提交相关的参考文献(通过重基)。这是无可奈何的。
您的中间图表明,您原来的重基尝试出了问题,所以这一次您将得到通常重基操作的两倍。
一般来说,如果你有一个已经发表的历史,有那么多的提交和参考,基于它,我建议不要混混它。
从最初的图表开始--您有3个SHAs,它们充当分支的锚。C2B通向硕士和Branch3,C3通向分支4,C6通向Branch2。一旦您为C2B重写了SHA,所有其他SHA也将发生变化,这使得整个过程非常复杂,很难在不直接跟踪中间SHA的情况下自动化。以下内容应适用于这一具体情况。
请注意,这要求您对各个分支的提交具有特定的知识。您可以尝试在没有提交限制器的情况下执行重基操作,但我偶尔也有过这样做的糟糕经验(在这种情况下,Git重新定位的次数比它应该的要多,最后我不得不退出它,然后中止并再次尝试)。
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' 通常,当你这样做的时候,你会把其他的分支重新定位到你的新分支顶端,而不是试图保留原始的亲缘关系。这样事情就容易多了。
您的恢复过程实际上是相同的,但略有不同-对和限制说明。
https://stackoverflow.com/questions/26150118
复制相似问题