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界面,那么应该还原。