如何使用Git移除已推送到远程代码库的提交

20

我已经向远程代码仓库推送了几个提交并发现它们造成了问题。

我该如何回到之前的版本呢?也就是说,删除最近的两个提交?

4个回答

46

因为您已经将提交推送到了远程存储库,所以最好的方法可能是回滚这两个提交,这样您就不会为任何已经从远程存储库拉取代码的人造成任何问题。

以下示例使用以下提交历史:

e512d38 Adding taunts to management.
bd89039 Adding kill switch in case I'm fired.
da8af4d Adding performance optimizations to master loop.
db0c012 Fixing bug in the doohickey

如果你只想还原提交而不修改历史记录,可以执行以下操作:

git revert e512d38
git revert bd89039

如果你不想让别人看到你添加了紧急停止开关,然后又将其删除,你可以使用以下方法回滚存储库(但是,这会给那些已经从远程拉取了你的更改的其他人带来问题):

git reset --hard da8af4d
git push origin -f localBranch:remoteBranch

其中localBranch是本地分支的名称,remoteBranch是远程分支的名称。


4
"给管理层加入嘲讽" 这个说法引发了一个老话(新话?):“别喝酒再推人了”。 :-) - torek
9
@torek 说什么好呢,我既是一个热爱喝酒的人,也是一个坚定的饮酒者。 - David M. Syzdek
以下命令对我有效: git reset --hard da8af4d git push origin -f localBranch:remoteBranch - Shyam Sunder
1
值得注意的是,git reset --hard 将撤销工作树中的任何本地修改,包括那些不属于有问题的提交。如果有疑问,建议先备份该工作树(快速使用 tar 命令即可)。 - sxc731
我在使用 git push origin -f localBranch:remoteBranch 命令时遇到了困难,因为我一直在输入 main:remote,但它并没有起作用。实际上,你需要输入 git push origin -f main:main 来覆盖 Github 上的主分支。现在看来很明显,但我花了一段时间才弄清楚这个问题。 - Ezequiel Barbosa

7

我认为你可以在本地进行回滚并推送结果:

$ git reset HEAD^ --hard
$ git push REMOTE -f

其中'REMOTE'为远程名称。


3
可以这样做,但不建议这样,因为任何在此期间抓取提交的其他人将得到......嗯,为避免不当言辞,我们称之为“他们必须努力恢复你的行动所造成的影响。”:-) 最好使用“git revert”添加一个新的提交来撤销以前的提交。 (想象一下,“revert”就像是“添加一个补丁的提交,该补丁恰好撤消以前的提交的操作”,因为这就是它的作用。) - torek
@torek,一开始我也是这么想的,但我认为Shadowfax可能有其他用途,比如保持每个远程提交都能正确运行,否则他会考虑“还原并推送”。 - peter
1
我认为你会惊讶于有多少人不理解git revert。另一方面,也可能存在完全不同的动机(如David M. Syzdek的回答)。在某些情况下,没有好的解决方案,只有最不坏的一个(这取决于具体情况)。 - torek

1

首先输入此命令。

git log -n 4

这个命令将显示您最近的4个提交及其SHA。在此之后输入以下命令。

git rebase -i SHA_ID

不要输入SHA_ID类型,而是输入您想要删除的提交之前的提交的SHA。

然后会打开一个文件,在该文件的顶部,您将看到您想要删除的提交的SHA和消息。删除此行并保存并退出文件。

完成此操作后,您必须进行推送。因此,请键入以下命令。

git push -f origin master

完成后,您可以看到您的提交已被删除。


1
git push origin -f last_good_commit:yourEditingBranch

最后一个好的提交将成为分支的新Head。然后在本地执行硬重置:

git reset origin/yourEditingBranch

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