撤消推送提交

我有一个远程存储库中的项目,与本地存储库(开发)和服务器一(prod)同步。 我一直在做一些已经被推送到远程并从服务器拉出来的改变。 现在,我想撤销这些更改。 所以我可以在更改之前将git checkout提交并提交新的更改,但是我猜测将会有问题将它们再次推送到远程。 任何关于我应该如何进行的建议?


您可以通过以下方式恢复单个提交:

git revert <commit_hash>

这将创建一个新的提交,恢复您指定提交的更改。 请注意,它只会恢复该特定的提交,而不会在此之后提交。 如果你想恢复一系列的提交,你可以这样做:

git revert <oldest_commit_hash>..<latest_commit_hash>

它将还原指定的提交之间的提交。

查看git-revert手册页以获取有关git revert命令的更多信息。 关于恢复提交的更多信息,也请看这个答案。


不保留“撤消”痕迹的解决方案。

注意:不要这样做,如果有人已经拉你的变化(我会用这个只在我个人的回购)

做:

git reset <previous label or sha1>

这将重新签出本地的所有更新(所以git状态将列出所有更新的文件)

那么你“做你的工作”并重新提交你的修改(注意:这一步是可选的)

git commit -am "blabla"

此时你的本地树与远程的不同

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

将推动并强制远程考虑推送并删除前一个(指定远程名称和分支名称不是必需的,但建议避免更新所有具有更新标志的分支)。

! 注意一些标签可能仍然指向删除提交! 如何到删除-A-远程标签


我在这些情况下做的是:

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

    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 git@github.com: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
    
    链接地址: http://www.djcxy.com/p/49277.html

    上一篇: Undo pushed commits

    下一篇: How to delete Github Tag forever?