我的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
任何人都知道如何实现这一目标?我还没推过任何东西。
答案 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分支的历史记录。
公平的警告。如果您已将这些分支包括C
,F
,D
或E
与其他任何开发人员一起发布,那么他们将在您重新定位时遇到严重问题。
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)