在`git push`之后,如何在本地和远程撤消`git commit`?


242

我已经表演了,git commit之后是git push。如何在本地和远程存储库上还原该更改?

$ git log
commit 364705c23011b0fc6a7ca2d80c86cef4a7c4db7ac8
Author: Michael Silver <Michael Silver@gmail.com>
Date:   Tue Jun 11 12:24:23 2011 -0700

Answers:


400
git reset --hard HEAD~1
git push -f <remote> <branch>

(实施例推: git push -f origin bugfix/bug123

这将撤消上一次提交,并将更新的历史记录推送到远程。您需要传递,-f因为您要替换远程服务器中的上游历史记录。


24
或者,使用git reset --hard <the-sha-you-want-to-return-to>
AlexanderGroß

2
该引用称为HEAD(区分大小写)
dunni

26
另外,要小心-AFAIK,如果其他人从回购中撤出,则不应这样做。
阿玛丹

1
@BipinVayalu它会影响您当前所在的分支。更确切地说,HEAD。HEAD通常是“附加”到分支的(指向分支名称而不是直接指向提交)。因此,一般而言,它将影响分支HEAD指向的位置。使用git log --decorate --oneline找出你的头点。
亚历山大·格罗斯

4
git reset HEAD~1如果您不希望更改消失(未暂存的更改)。更改,提交并再次推送git push -f [origin] [branch]
softvar

161

通常,使用以下命令进行“反向”提交:

git revert 364705c

然后照常将其发送到遥控器:

git push

这不会删除提交:它将进行一次附加提交,以撤消第一个提交所做的任何操作。还有其他不是很安全的事情,尤其是当更改已经传播时。


9
这比亚历山大·格罗斯(AlexanderGroß)(选择的答案)更安全(因此可能更好)。
Graeck 2013年

6
@Graeck每个解决方案都有其含义和优点。
亚历山大·格罗斯

5
这应该是公认的答案,最好的做法是不要覆盖历史,如果与团队合作则最好不要覆盖历史。git reset仅在您尚未将更改推送到服务器时接受。
Josue Alexander Ibarra 2014年

17
@JosueIbarra我不同意所有情况。是的,在大多数情况下,您不应覆盖历史记录。但是,我认为在某些情况下您绝对应该这样做。例如,您不小心提交并上载了机密文件。那不应该在git repo中出现。因此,您可以使用此处接受的答案快速将其删除。
bfcoder 2014年

11
@bfcoder如果将“秘密”推送到远程存储库,则不再是秘密。正确的解决方法是创建一个新的秘密,而不是试图掩盖您的错误。
erbsman 2014年

41

首先,放松一下。

“没有任何东西在我们的控制之下。我们的控制只是幻想。”,“犯错是人类的”

我知道您无意中将代码推送到remote-master。这将很好。

1.首先,获取SHA-1要尝试返回的提交的值,例如,提交到master分支。运行这个:

git log

您会看到像字符串一样的字符串'f650a9e398ad9ca606b25513bd​​4af9fe ...',以及每个提交。从您要返回的提交中复制该编号。

2.现在,输入以下命令:

git reset --hard your_that_copied_string_but_without_quote_mark

您应该会看到类似“ HEAD现在在”的消息。你很清楚。它所做的只是在本地反映这种变化。

3.现在,输入以下命令:

git push -f

你应该看到像

“警告:push.default未设置;其隐式值已更改……..……总计0(增量0),已重用0(增量0)…………您的分支名称->主用户(强制更新) ”。

现在,您很清楚。再次使用“ git log”检查主服务器,您的fixed_destination_commit应该位于列表的顶部。

欢迎您(提前;))

更新:

现在,您在所有这些操作开始之前所做的更改现在就消失了。 如果您想将这些艰辛的工作重新带回来,则有可能。感谢git refloggit cherry-pick命令。

为此,我建议您关注此博客本帖子


最好在执行“ git push -f”时也指定远程节点和分支,但是“ git push -f”在大多数情况下仍然可以工作
Robson 2015年

8

git reset HEAD~1如果您不希望更改消失(未暂存的更改)。更改,提交并再次推送git push -f [origin] [branch]



3

尝试使用

git reset --hard <commit id> 

请注意:此处的提交ID将是您要转到的提交的ID,但不是您要重置的ID。这是我唯一也遇到困难的地方。

然后推

git push -f <remote> <branch>

2

或者:

git push origin +364705c23011b0fc6a7ca2d80c86cef4a7c4db7ac8^:master

强制将原始远程存储库的master分支移至上次提交的父目录

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.