Git压缩和删除以前的提交记录

10

也许我误解了GIT的工作原理。

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

这是预期结果吗?如果是,我能否重写历史以删除无用的提交(因为这些更改已经包含在压缩的提交中,其中包括所有先前的提交)?


你需要告诉我们在你的变基过程中发生了什么事情,要非常详细。这不是预期的行为。 - Tim Biegeleisen
啊,我把命令行关掉了 :\\ 顺便说一下,没有错误。 - Matías Fidemraizer
@TimBiegeleisen 我最晚今晚会更新我的问题,告诉你我是如何进行变基/压缩的过程。 - Matías Fidemraizer
看一下我的回答。你还记得做过这个吗,还是做了其他的事情? - Tim Biegeleisen
3个回答

7
当您开始交互式变基会话时,应提示列出当前分支的最近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 Fidemraizer
你已经解决了问题了吗?还是还有什么问题? - Tim Biegeleisen
还在思考中。我在想,如果我创建一个新的分支,手动将我的更改放在那里,然后发布该分支,是否会更容易一些。事情变得越来越复杂了。 - Matías Fidemraizer
如果您在远程存储库中有此分支,您可以按照您所说的方式创建一个新的本地分支。如果您的分支确实与坏的变基之前完全相同,那么可能除了一个新提交之外什么都没有发生。删除此提交并重试。 - Tim Biegeleisen
1
我已经执行了这个(删除提交的事情),并在尝试压缩之前回滚到以前的状态。我将再次尝试rebase,让我们看看会发生什么。 - Matías Fidemraizer

4
问题在于所有压缩的提交仍然存在。
如果这些提交仍然可以通过其他引用(其他分支或标签)访问,即使当前分支被变基后,它们仍然是可见的。
尝试使用git reset --soft来压缩提交(链接)
如果HEAD仍然引用您的10个提交:
git reset --soft HEAD~10
git commit -m "squashed 10 commits"

整个提交记录都是我的,但它们仍未合并。 - Matías Fidemraizer
在我们提出修复方案之前,我们需要弄清楚出了什么问题。 - Tim Biegeleisen
那就取决于你如何压缩了。再试一次,这次使用git reset(我已经编辑了我的答案)。 - VonC
我再次尝试了一下,可以查看带有“压缩”消息的提交:https://github.com/mfidemraizer/StackExchange.Redis/commits/master - Matías Fidemraizer
2
@alper 如果你使用了 git push --force,强制推送了本地分支,以覆盖在 GitHub 上远程分支的历史记录,那么它们就不会再存在了。如果它们在强制推送后仍然可见(正如答案中提到的),那么可能是因为其他东西(如另一个分支或标签)引用了旧的提交。 - VonC
显示剩余5条评论

1

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

流程如下:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接