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

时间:2011-06-23 18:44:31

标签: git git-push git-commit

我已经执行git commit后跟git push。如何在本地和远程存储库上还原该更改?

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

7 个答案:

答案 0 :(得分:362)

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

(示例推送: git push -f origin bugfix/bug123

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

答案 1 :(得分:150)

通常,使用:

进行“反向”提交
git revert 364705c

然后像往常一样将它发送到遥控器:

git push

这不会删除提交:它会进行额外的提交,撤消第一次提交所做的任何操作。其他任何东西,都不是很安全,特别是在变化已经传播的时候。

答案 2 :(得分:35)

首先,放松。

“我们无法控制任何事情。我们的控制仅仅是幻觉。”,“犯错误是人类”

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

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

git log

你会看到一堆'f650a9e398ad9ca606b25513bd​​4af9fe ......'和每个提交一样的字符串。从 想要返回 的提交中复制该号码。

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

git reset --hard your_that_copied_string_but_without_quote_mark

你应该看到像“HEAD现在在”的消息。你很清楚。它刚才所做的就是在当地反映这种变化。

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

git push -f
你应该看到

  

“警告:未设置push.default;其隐式值已更改   in .......总计0(delta 0),重用0(delta 0)......   ... your_branch_name - &gt;主人(强制更新)。“

现在,你们都清楚了。再次使用“git log”检查master,你的fixed_destination_commit应该在列表的顶部。

欢迎(提前;))

更新:

现在,在所有这些开始之前所做的更改现在已经消失。 如果你想再次带回那些艰苦的工作,那就有可能。感谢 git reflog git cherry-pick 命令。

为此,我建议您关注this blogthis post

答案 3 :(得分:6)

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

答案 4 :(得分:3)

您可以进行交互式变基:

git rebase -i <commit>

这将显示您的默认编辑器。只需删除包含要删除的提交的行,即可删除该提交。

当然,您将需要访问远程存储库以在此处应用此更改。

请参阅此问题:Git: removing selected commits from repository

答案 5 :(得分:2)

可替换地:

git push origin +364705c23011b0fc6a7ca2d80c86cef4a7c4db7ac8^:master

将原始远程存储库的主分支强制为最后一次提交的父分支

答案 6 :(得分:2)

尝试使用

git reset --hard <commit id> 

请注意:这里,commit id将是您要转到的提交的ID,而不是您要重置的ID。这是我被困的唯一一点。

然后按

git push -f <remote> <branch>