Git - 如何重置一个已推送的提交?

5

由于我不小心添加了超过2GB的文件,导致我的本地存储库非常大。我中止了操作,删除了这些文件并重新提交了代码。但是,当我尝试将更改git push origin master推送到Bitbucket时,会失败并显示以下错误:

fatal: The remote end hung up unexpectedly

尽管我早就删除了不必要的文件,但我的 .git 文件仍然非常大。由于 push 的大小超过了 2 GB,Bitbucket 建议我将 http.postBuffer 设置为更高的数字。我已经尝试了很多次,但大约尝试了 15 次后,我想重新开始。

git status 给出了这个输出:

On branch master
Your branch is ahead of 'origin/master' by 4 commits.
  (use "git push" to publish your local commits)

但既然推送无法正常工作,我该如何修复它?最坏的情况是我可以将仓库清空并重新构建它,但我想知道是否有一种方法可以重置推送,因为它经常失败。


1
你是如何“删除不必要的文件”的?这是一个版本控制系统,它会保留旧版本(包括已删除的文件)。你需要重写历史记录以完全擦除任何记录(然后可能进行垃圾回收)。 - Thilo
这个问题在这里经常出现,但是你可以考虑使用 "git filter-branch" 或 "git rebase -i" 命令来去除那些不好的提交。立即这么做,以免它们被进一步埋藏。 - Tim Biegeleisen
2个回答

4
您可以通过git reset来完成。
git reset --hard <commit-id>

你可以使用 git log 命令获取提交 ID。

选择的提交 ID 之前的所有工作都将被清除


1
我认为交互式变基更有意义。使用变基将允许保留后续工作。由于变基和您的答案都会重写分支的历史记录,因此从这个角度来看,两种方法都没有更好的方法。 - Tim Biegeleisen
这不会影响到可能也包含大文件的其他分支或标签。 - Thilo

4

weigreen的回答适用于问题提交是最近一次提交的情况,否则你需要重写历史记录。我建议使用交互式变基

git rebase -i <some-commit-before-the-problematic-one>

这将显示提交列表以及默认操作,使它们可以被 pick。如果你想保留有问题的提交的一部分,请在该行上将 pick 更改为 edit。如果你希望完全删除它,只需删除该行。如果你选择编辑该提交,Git 将把工作树置于刚完成有问题提交时的状态。更改所需内容并修改提交:

git commit --amend

接下来,使用以下命令让Git完成rebase操作:

git rebase --continue

那本来是最好的方法。我最终进行了硬重置,然后强制推送。如果我没有已经进行硬重置,你的解决方案会更好。:( - Tensigh
@Tensigh 在运行git gc之前,您仍然可以使用git reflog访问已删除的引用。 - Melebius
好的,谢谢。既然我看到了,那么我该如何回滚? - Tensigh
@Tensigh 在所需的引用处创建一个新分支:git branch <name> <ref> 或将现有分支移动到那里:git branch -f <name> <ref> - Melebius

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