我有一系列的提交,我想从我的分支历史中删除。我用git rebase -i
然后我用fixup
标记了一些提交,认为它们会被应用但没有提交消息。我还将一些标记为squash
,认为它们将被应用但是它们的提交消息将与先前的提交消息合并。有些人离开了pick
,认为他们会保持原样,或将他们的squash
或fixup
合并到其中。
我按照自己的意愿对其进行了标记,然后输入Esc
:wq
,点击return
并登陆第二个编辑器界面。在这里,我只需点击Esc
:wq
再次点击return
。
报告没有问题,因此我输入了git push
。 Git抱怨我没有先拔,所以我输入了git pull
,然后是git push
。这看起来已经满足了git众神,但后来看git log
我看到我想要压缩的提交消息被压缩成一条消息,遗憾的是所有原始提交消息仍然在日志中。
我以为他们会被删除。
我做错了什么,我误解了这个过程?
当我将我的分支合并到master中时,那些fixup
- ed提交消息也会合并或者它们会消失吗?
答案 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
)不再是您的分支的一部分,将在以后清理。 (他们可能作为其他分支的一部分保留在回购中,或由标记引用,但它们将不再出现在您正在处理的分支的历史记录中。)