我在远程存储库中有一个项目,与本地存储库(开发)和服务器(产品)同步。我一直在进行一些已提交的更改,这些更改已推送到远程服务器并已从服务器中拉出。现在,我要撤消那些更改。因此,我可以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