Rebase的行为不符合预期

时间:2017-07-10 13:31:53

标签: git merge rebase

我有一系列的提交,我想从我的分支历史中删除。我用git rebase -i

然后我用fixup标记了一些提交,认为它们会被应用但没有提交消息。我还将一些标记为squash,认为它们将被应用但是它们的提交消息将与先前的提交消息合并。有些人离开了pick,认为他们会保持原样,或将他们的squashfixup合并到其中。

我按照自己的意愿对其进行了标记,然后输入Esc :wq,点击return并登陆第二个编辑器界面。在这里,我只需点击Esc :wq再次点击return

报告没有问题,因此我输入了git push。 Git抱怨我没有先拔,所以我输入了git pull,然后是git push。这看起来已经满足了git众神,但后来看git log我看到我想要压缩的提交消息被压缩成一条消息,遗憾的是所有原始提交消息仍然在日志中。

我以为他们会被删除。

我做错了什么,我误解了这个过程? 当我将我的分支合并到master中时,那些fixup - ed提交消息也会合并或者它们会消失吗?

1 个答案:

答案 0 :(得分:2)

因为您已经推送了以前的历史记录,所以您的分支和远程分支将与您的rebase点不同。运行git status将显示您的分支和远程分支已分歧,这就是不允许推送的原因:

A---B---C---D---E---F origin/feature
         \
          D'---E'---F' feature

当您在这种情况下发出拉动时,它将合并历史记录的两个版本,因此您的旧提交(来自远程)仍然存在以及您的新的,重新提交的提交:

A---B---C----D----E----F origin/feature
         \              \
          D'---E'---F'---G feature

可能希望git push --force完全重写该历史记录,但这有很多风险:Safe force push procedure?

如果你这样做,你最终会得到这个:

A---B---C---D'---E'---F' feature
                         origin/feature

此处,旧提交(D-E-F)不再是您的分支的一部分,将在以后清理。 (他们可能作为其他分支的一部分保留在回购中,或由标记引用,但它们将不再出现在您正在处理的分支的历史记录中。)