2

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

c1a - c1b - c2a - c2b - c4 - c5 - c6 - c8 (master)
                   |               \     
                   |                c9 (branch2)
                    \
                      c3 - c10 (branch3)
                       \
                        c7 - c11 (branch4)

我想压缩提交 c2a 和 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 压缩到一个提交中?
4

1 回答 1

2

git rebase1)分支 2、3 和 4 至少需要再运行3 次

2)你不能。如果您更改提交,则必须重写每个后代提交以及与这些提交关联的所有参考(通过变基)。没有办法解决这个问题。

您的中间图表明您最初尝试变基时出现了问题,因此这一次您最终将获得两倍于通常情况下的变基操作。

一般来说,如果你有一个基于它的许多提交和引用的已发布历史,我不建议你乱用它。

从您的原始图表开始 - 您有 3 个 SHA 作为分支的锚。C2B 通向 Master 和 Branch3,C3 通向 Branch 4,C6 通向 Branch2。一旦你为 C2B 重写了 SHA,所有其他的 SHA 也会发生变化,这使得整个过程非常复杂,如果不直接跟踪中间 SHA,就很难实现自动化。以下应该适用于这种特定情况。

请注意,这需要您对各个分支上的提交有特定的了解。您可以尝试在没有提交限制器的情况下进行变基,但我偶尔会遇到不好的经历(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'  

通常,当您执行此类操作时,您会将其他分支重新定位到您的新分支尖端,而不是尝试保留原始父系。它使事情变得容易得多。

您的恢复过程几乎相同,但 --onto 和限制说明符略有不同。

于 2014-10-01T21:08:08.407 回答