我已经执行了git提交,然后是git推送。如何在本地和远程存储库上恢复该更改?

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

你可以做一个交互式的rebase:

git rebase -i <commit>

这将打开默认编辑器。只需删除包含要删除的提交的行以删除该提交。

当然,您也需要访问远程存储库来应用此更改。

请看这个问题:Git:从存储库中删除选定的提交


一般来说,执行“反向”提交,使用:

git revert 364705c

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

git push

这不会删除提交:它会做出一个额外的提交,撤销第一次提交所做的一切。其他任何东西,都不是真正安全的,特别是当更改已经传播时。


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

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

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

编辑:

请注意——hard将使你的提交不可达(即它将显示被删除,但你仍然可以git show <hash>或git log <hash> it,如果你记得它的哈希)。如果您想保留更改,请运行:

git reset [--mixed] HEAD~1

此时,您有了未分阶段的更改,因为您使用了—mixed,这是默认值。

你可能首先想要更新远程树(即删除提交):git push -f <remote> <branch>

由于您在本地仍然有您的更改,您可以创建另一个分支并将它们提交到那里(并在您认为合适的时候推送)。


git重置HEAD~1如果你不希望你的变化消失(非阶段性的变化)。git push -f [origin] [branch]


另外:

git push origin +364705c23011b0fc6a7ca2d80c86cef4a7c4db7ac8^:master

强制将源远程存储库的主分支转移到上一次提交的父分支


首先,放松。

“没有什么在我们的控制之下。我们的控制只是幻觉。”,“人孰能无过。”

我知道你无意中把你的代码推到了远程控制系统。一切都会好的。

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

git log

你会看到一堆“f650a9e398ad9ca606b25513bd4af9fe……”'类似于每次提交时的字符串。从要返回的提交中复制该数字。

2. 现在,输入下面的命令:

git reset --hard your_that_copied_string_but_without_quote_mark

你应该看到像“HEAD is now at”这样的消息。你是安全的。它所做的只是反映了当地的变化。

3.现在,输入下面的命令:

git push -f

你应该看到

“push.default is unset;它的隐含价值已经改变 在……Total 0 (delta 0), reuse 0 (delta 0)… ...Your_branch_name -> master(强制更新)."

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

不客气(提前)

更新:

现在,你在这一切开始之前所做的改变,现在已经消失了。 如果你想重新找回那些努力的工作,这是可能的。多亏了git reflog和git的精选命令。

为此,我建议你关注这个博客或这篇文章。


试着用

git reset --hard <commit id> 

请注意:这里的commit id是你想要去的提交的id,而不是你想要重置的id。这是我唯一被困住的地方。

然后推

git push -f <remote> <branch>

使用git reset——hard HEAD~1,就像大多数人建议的那样,会在本地撤销上次提交,但你也会失去那些本地更改。

如果你不想丢失本地更改,而只是撤销上次提交:

git reset HEAD~1

然后强制将其推到原点以撤销远程中的提交(假设<remote> == origin)

git push -f origin <branch>