合并意外划分的提交

时间:2014-10-01 20:33:59

标签: git rebase squash

我的历史看起来像这样(按号码/字母排序):

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)

历史记录的所有修改都是本地的和远程的

我的问题是:

  • 如何修复我的历史记录,以便将所有副本合并为一个提交?
  • 如何将c1a和c1b压缩成一次提交,而不重新创建问题?

1 个答案:

答案 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'  

通常,当您执行此类操作时,您可以将其他分支重新绑定到新分支提示,而不是尝试保留原始父系。它使事情变得更容易。

您的恢复过程实际上是相同的,但略有不同 - 大小和限制说明符。