Git – 撤消提交

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

你可以使用git revert <commit_hash>来还原提交。 这将创build一个新的提交,它将恢复您使用<commit_hash>指定的提交更改。

请注意,您只能恢复该特定的提交,并在此之后不提交。 如果你想恢复一系列的提交,你可以这样做:

 git revert <oldest_commit_hash>..<latest_commit_hash> 

只要注意这个命令有点搞笑。 它实际上不会恢复由<oldest_commit_hash>本身指定的提交,而是直到包括<latest_commit_hash>之后的提交。

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

一个解决scheme,不保留“撤消”的痕迹。

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

做:

 git reset <previous label or sha1> 

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

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

 git commit -am "blabla" 

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

 git push -f 

将推动和迫使远程考虑这个推动,并删除以前的一个

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

我在这些情况下做的是:

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

     git push -f origin <last_known_good_commit>:<branch_name> 
  • 在本地,做同样的事情:

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



看到我为此创build的分支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 
 git revert HEAD -m 1 

在上面的代码行。 “最后一个参数代表”

  • 1 – 恢复一个提交。

  • 2 – 恢复最后两个提交。

  • n – 恢复最后n个提交。

在这个命令之后,你需要按下遥控器上的效果。 您还有其他选项,例如指定要提交的提交范围。 这是选项之一。


你可以通过git命令行按照下面给出的步骤进行REVERT(或者你也可以把它称为DELETE )Git Commit BOTH本地和远程

运行以下命令查看要恢复的提交ID

 git log --oneline --decorate --graph 

你会得到如下截图 在这里输入图像说明

如果你也检查远程(通过Web界面),那么你可以看到,这将如下所示

在这里输入图像说明

根据截图目前你在提交id e110322但是你想恢复到030bbf6 本地和 远程

执行以下步骤以在本地+远程执行DELETE / REVERT提交


首先本地恢复提交id 030bbf6

 git reset --hard 030bbf6 

其次是

 git clean -f -d 

这两个命令清除强制重置提交阶段030bbf6 ,如下所示在快照中

在这里输入图像说明

现在如果你运行git status,那么你会看到你是远程分支的BEHIND,如下所示 在这里输入图像说明

运行以下更新您的索引(如果有任何更新)。 build议您要求所有开发人员不要接受主远程分支上的任何请求。

 git fetch --all 

一旦你完成了它,那么你需要通过使用分支前面的+符号强制 推送这个提交,如下所示。 我在这里用作主分支,可以用任何replace它

在这里输入图像说明

 git push -u origin +master 

现在如果你看到远程的web界面,那么应该还原。

在这里输入图像说明