分支后提交时的交互式rebase

时间:2013-04-09 15:38:58

标签: git git-interactive-rebase

我的git存储库中有以下(简化)场景:

A-B-C-F
     \
      D-E

提交F是对C的修复,这需要成为单个提交。我使用git rebase -i HEAD~2在“主”分支上尝试了交互式rebase,但结果如下:

A-B-CF
   \
    C-D-E

虽然我希望它是这样的:

A-B-CF
      \
       D-E

任何人都知道如何实现这一目标?我还没推过任何东西。

2 个答案:

答案 0 :(得分:0)

这是我最终的结果。初始方案:

A-B-C-F (develop)
     \
      D-E (feature)

使用git checkout develop; git rebase -i HEAD~2开发交互式rebase,将F压缩到C:

A-B-CF (develop)
   \
    C-D-E (feature)

使用git checkout feature; git rebase -i HEAD~3对功能进行交互式变基,删除C:

A-B-CF (develop)
   \
    D-E (feature)

最后在功能分支上使用git rebase CF-hash进行正常变基,移动分支的开头:

A-B-CF (develop)
      \
       D-E (feature)

不确定这是否是最好的方法,但它似乎对我有用。

答案 1 :(得分:0)

为了清楚起见,我将在这里添加一些细节。

A-B-C-F    (master)
     \
      D-E  (featureA)

我将分支名称归因于这些,因为在讨论变基时它会让人感到困惑。这些名字并不重要,我假设当你说“主要”时你指的是顶行,我称之为主。

您的问题实际上相当复杂,因为您已经与另一个分支“共享”了C提交。现在您要修改该提交 - 这意味着您需要更改整个featureA分支的历史记录。

公平的警告。如果您已将这些分支包括CFDE与其他任何开发人员一起发布,那么他们将在您重新定位时遇到严重问题。

git checkout master
git rebase -i HEAD~2

如你所知,你只需要修复或压缩最后一次提交。现在你将实际拥有它。(假设符号“CF”代表组合的C和F提交。

A-B-CF   (master)
   \
    C-D-E  (featureA)

之所以发生这种情况是因为C已不在master,而在featureA。这两个分支的最新共同祖先是B。现在,您需要C获取我们featureA的历史记录。因此,C之后的所有SHA1提交也将发生变化。

现在您需要结帐featureA和rebase master。

git checkout featureA
git rebase -i master

在交互式rebase期间,您需要确保删除代表C提交的行。如果你这样做,你就会得到这个。

A-B-CF   (master)
     \
      D-E  (featureA)

旁注

如果你在rebase期间没有正确删除C提交,你将得到以下结果。

A-B-CF   (master)
     \
      C-D-E  (featureA)
相关问题