Git Squash并删除以前的提交

时间:2015-07-26 10:50:28

标签: git git-commit git-commands git-squash

也许我误解了GIT是如何运作的。

我已经运行git rebase -i HEAD~10,我可以将10个提交压缩成一个。问题是所有被压缩的提交仍然存在,我认为它们将在将它们合并为一个之后被删除。

这是预期的结果吗?如果是这样,我可以重写历史记录以删除无用的提交(因为这些更改已经在提交中,所有以前的提交都被压缩了)?

3 个答案:

答案 0 :(得分:4)

当您开始交互式rebase会话时,应该会提示您当前分支的最近10次提交的列表:

git rebase -i HEAD~10

pick as2i8dw most recent commit
pick ee361eb second most recent commit
...
pick b2762sx tenth most recent commit

您需要将此文件更改为以下内容:

pick as2i8dw most recent commit
squash ee361eb second most recent commit
...
squash b2762sx tenth most recent commit

然后您需要执行git commit来保存更改。现在,在执行git日志时,您应该只看到as2i8dw提交,而不是其他十个提交。

话虽如此,这就是你做的吗?

答案 1 :(得分:0)

  

问题是所有压扁的提交仍然存在

如果这些提交仍然可以被任何其他引用(其他分支或标记)访问,那么即使在当前分支被重新命名之后,仍然可以看到它们。

请改为squashing the commits with a git reset --soft 如果HEAD仍然引用您的10次提交:

git reset --soft HEAD~10
git commit -m "squashed 10 commits"

答案 2 :(得分:0)

我遇到了类似的问题,并找出了它的实际原因: 流程:

git rebase -i HEAD~10
# Retain the first commit from below( as pick) and change the rest of the `pick` to `squash`
# After your rebase is successful
git log
# You can see all your commits squashes to one commit

然后,当你从远程分支中git pull时,它将拉出本地不存在的其余提交(基本上所有你之前已经压缩过的提交,因为它现在存在于一个提交中)因此你也看到了之前的提交。

如果您确信自己没有添加新的更改,那么更好的方法是git push -f到您的远程分支。

P.S:如果远程分支中有任何新的更改,最好:

git rebase origin remote_branch 

然后压缩你的提交。