1

我的 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

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

4

2 回答 2

0

这就是我最终的结果。初始场景:

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

基于 develop 的交互式变基,将git checkout develop; git rebase -i HEAD~2F 压缩为 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)

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

于 2013-04-09T16:36:24.937 回答
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. 因此,之后的所有 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)
于 2013-04-09T16:36:41.237 回答