也许我误解了 GIT 的工作原理。
我已经跑了git rebase -i HEAD~10
,我可以将 10 个提交压缩为一个。问题是所有压缩的提交仍然存在,我认为在将它们全部合并为一个之后它们会被删除。
这是预期的结果吗?如果是这样,我可以重写历史记录以删除无用的提交(因为这些更改已经在所有以前的提交都被压缩的提交中)?
也许我误解了 GIT 的工作原理。
我已经跑了git rebase -i HEAD~10
,我可以将 10 个提交压缩为一个。问题是所有压缩的提交仍然存在,我认为在将它们全部合并为一个之后它们会被删除。
这是预期的结果吗?如果是这样,我可以重写历史记录以删除无用的提交(因为这些更改已经在所有以前的提交都被压缩的提交中)?
当您开始交互式 rebase 会话时,您应该会收到来自当前分支的最后 10 次提交的列表的提示:
git rebase -i HEAD~10
pick as2i8dw first commit
pick ee361eb second commit
...
pick b2762sx most recent commit
您需要将此文件更改为以下内容:
pick as2i8dw first commit
squash ee361eb second commit
...
squash b2762sx most recent commit
然后您需要执行 agit commit
来保存更改。现在,在执行 git log 时,您应该只看到as2i8dw
提交,而其他十个都看不到。
话虽这么说,这是你做的吗?
问题是所有压缩的提交仍然存在
如果这些提交仍然可以通过任何其他引用(其他分支或标签)访问,那么即使在当前分支被重新定位之后,这些提交仍然是可见的。
尝试使用git reset --soft
.
如果 HEAD 仍然引用您的 10 次提交:
git reset --soft HEAD~10
git commit -m "squashed 10 commits"
我遇到了类似的问题并找出了它的实际原因:流程:
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
您的远程分支,如果您确信在那里没有添加新的更改。
PS:如果您在远程分支中有任何新更改,最好:
git rebase origin remote_branch
然后压缩你的提交。