我的 git 存储库中有以下(简化的)场景:
A-B-C-F
\
D-E
提交 F 是对 C 的修复,这需要成为单个提交。我尝试在“主”分支上使用交互式变基git rebase -i HEAD~2
,但这会导致以下结果:
A-B-CF
\
C-D-E
而我希望它是这样的:
A-B-CF
\
D-E
任何人都知道如何实现这一目标?我还没有推送任何东西。
我的 git 存储库中有以下(简化的)场景:
A-B-C-F
\
D-E
提交 F 是对 C 的修复,这需要成为单个提交。我尝试在“主”分支上使用交互式变基git rebase -i HEAD~2
,但这会导致以下结果:
A-B-CF
\
C-D-E
而我希望它是这样的:
A-B-CF
\
D-E
任何人都知道如何实现这一目标?我还没有推送任何东西。
这就是我最终的结果。初始场景:
A-B-C-F (develop)
\
D-E (feature)
基于 develop 的交互式变基,将git checkout develop; git rebase -i HEAD~2
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)
不确定这是否是最好的方法,但它似乎对我有用。
为了清楚起见,我将在这里添加一些细节。
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
. 因此,之后的所有 SHA1 提交C
也将更改。
现在你需要检查 featureA 和 rebase master。
git checkout featureA
git rebase -i master
在交互式变基期间,您需要确保删除代表C
提交的行。如果你这样做正确,你会得到这个。
A-B-CF (master)
\
D-E (featureA)
边注
如果您C
在变基期间没有正确删除该提交,您将得到以下结果。
A-B-CF (master)
\
C-D-E (featureA)