协慌网

登录 贡献 社区

Git - 撤消推送的提交

我在远程存储库中有一个项目,与本地存储库(开发)和服务器(产品)同步。我一直在进行一些已提交的更改,这些更改已推送到远程服务器并已从服务器中拉出。现在,我要撤消那些更改。因此,我可以git checkout到提交并提交新更改,但是我猜测将它们再次推送到远程将存在问题。关于我应该如何进行的任何建议?

答案

您可以使用以下方法还原单个提交:

git revert <commit_hash>

这将创建一个新的提交,该提交将还原您指定的提交的更改。请注意,它仅还原特定的提交,之后不进行任何提交。如果要还原一定范围的提交,可以这样进行:

git revert <oldest_commit_hash>..<latest_commit_hash>

它还原指定提交之间(包括指定提交)的提交。

要知道提交的哈希值,可以使用git log

查看git-revert 手册页,以获取有关git revert命令的更多信息。另外,请查看此答案以获取有关还原提交的更多信息。

一种解决方案,不会留下任何 “撤消” 的痕迹。

注意:如果有人已经撤回了您的更改,请不要这样做(我只会在我的个人仓库中使用它)

做:

git reset <previous label or sha1>

这将在本地重新签出所有更新(因此 git status 将列出所有更新的文件)

然后您 “完成工作” 并重新提交更改(注意:此步骤是可选的)

git commit -am "blabla"

这时您的本地树与远程树不同

git push -f <remote-name> <branch-name>

将推送并强制远程考虑此推送,并删除上一个推送(指定 remote-name 和 branch-name 不是强制性的,但建议避免使用 update 标志更新所有分支)。

!! 当心一些标签可能仍指向删除提交! 如何删除远程标签

在这些情况下,我要做的是:

  • 在服务器中,将光标移回上一个已知的良好提交:

    git push -f origin <last_known_good_commit>:<branch_name>
  • 在本地,执行相同的操作:

    git reset --hard <last_known_good_commit>
    #         ^^^^^^
    #         optional



请参阅我为此创建my_new_branch上的完整示例:

$ git branch
my_new_branch

myfile.py添加一些内容之后的最新历史记录:

$ git log
commit 80143bcaaca77963a47c211a9cbe664d5448d546
Author: me
Date:   Wed Mar 23 12:48:03 2016 +0100

    Adding new stuff in myfile.py

commit b4zad078237fa48746a4feb6517fa409f6bf238e
Author: me
Date:   Tue Mar 18 12:46:59 2016 +0100

    Initial commit

我想要摆脱已经被推送的最后一次提交,因此我运行:

$ git push -f origin b4zad078237fa48746a4feb6517fa409f6bf238e:my_new_branch
Total 0 (delta 0), reused 0 (delta 0)
To [email protected]:me/myrepo.git
 + 80143bc...b4zad07 b4zad078237fa48746a4feb6517fa409f6bf238e -> my_new_branch (forced update)

好的!现在,我看到在该提交( myfile.py )上已更改的文件显示在 “未暂定提交” 中:

$ git status
On branch my_new_branch
Your branch is up-to-date with 'origin/my_new_branch'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   myfile.py

no changes added to commit (use "git add" and/or "git commit -a")

由于我不需要这些更改,因此我也只需将光标移回本地:

$ git reset --hard b4zad078237fa48746a4feb6517fa409f6bf238e
HEAD is now at b4zad07 Initial commit

因此,现在 HEAD 在本地和远程的上一次提交中:

$ git log
commit b4zad078237fa48746a4feb6517fa409f6bf238e
Author: me
Date:   Tue Mar 18 12:46:59 2016 +0100

    Initial commit