也许我误解了GIT的工作原理。
我运行了git rebase -i HEAD~10
,然后将10个提交压缩成一个。问题是,所有压缩的提交仍然存在,而我认为它们在合并到一个提交中之后会被删除。
这是预期结果吗?如果是,我能否重写历史以删除无用的提交(因为这些更改已经包含在压缩的提交中,其中包括所有先前的提交)?
也许我误解了GIT的工作原理。
我运行了git rebase -i HEAD~10
,然后将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
接下来你需要执行 git commit
命令将更改保存。现在通过执行 git log 命令,你只应该看到 as2i8dw
这个提交记录而不是其他十个。
话虽如此,你是这样做的吗?
git commit
这件事。我在VIM CLI中执行了:qw
,并且没有出现任何问题进行了rebase(除了意外的结果)。 - Matías Fidemraizergit reset --soft
来压缩提交(链接)。git reset --soft HEAD~10
git commit -m "squashed 10 commits"
git push --force
,强制推送了本地分支,以覆盖在 GitHub 上远程分支的历史记录,那么它们就不会再存在了。如果它们在强制推送后仍然可见(正如答案中提到的),那么可能是因为其他东西(如另一个分支或标签)引用了旧的提交。 - VonC我遇到了类似的问题,并找出了实际原因:
流程如下:
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
然后压缩您的提交。
-f
或者 --force
的影响了吗?为什么 -f
被大多数人所不赞同? - d-coder