1 文由
時常有這樣一種場景,不小心改動了部分文件,或修改了部分文件卻發現無用,此時可能還沒有git push,也可能push了;又可能commit了,或者還沒有commit。
此時,我們想撤銷(git reset)到遠程倉庫或本地倉庫的最新最近一次的正式版本中來。那么,怎么做?
2 解決方案/辨析

[情況1(個人常用)] git reset --hard <HEAD/CommitId/Tag>
git reset --hard HEAD
# 回退/撤銷。回退到最近一次的COMMIT版本上(即 【當前版本/撤銷到倒數第1個COMMIT版本】);將工作區、暫存區和HEAD保持一致。
git reset --hard HEAD~1 或 git reset --hard HEAD^
# 回退/撤銷。回退到上一次的COMMIT版本上(即 【上一版本/撤銷到倒數第2個COMMIT版本】);將工作區、暫存區和HEAD保持一致。
git reset --hard HEAD~2 或 git reset --hard HEAD^^
# 回退/撤銷。回退到上上次的COMMIT版本上(即 【上上版本/撤銷到倒數第3個COMMIT版本】);將工作區、暫存區和HEAD保持一致。
...
git reset --hard HEAD~99 或 git reset --hard HEAD^...^(99個'^')
# 回退/撤銷。回退到上上次的COMMIT版本上(即 【撤銷到倒數第100個COMMIT版本】);將工作區、暫存區和HEAD保持一致。
[情況2]
git reset HEAD
# 回退/撤銷。將暫存區和HEAD的提交保持一致
[情況3]
git checkout <filename/branch/tag>
# 替換/覆蓋本地改動。
# 將使用HEAD指針所指的最新內容替換工作目錄中的文件;已添加到暫存區(含:新建文件)的改動不會受影響[git add -A xx 以后]。
[情況4]
git fetch origin
git reset --hard origin/<remoteBranchName>
# 丟棄在本地的所有改動與提交(commit),可到服務器上獲取最新的版本。
3 補充1:回退遠程倉庫的遠程分支
git log (查看提交日志記錄)
- step1 回退本地倉庫的本地分支到指定版本
git reset --hard <HEAD/commitId/branch/tag>
- step2 強制推送到遠程倉庫的分支
git push -f
(或 git push origin <HEAD/commitId/branch/tag> --force)
4 補充2:git stash
在git reset
回退操作前,如果你修改的有效內容較多時(避免白干活...),可嘗試使用此命令解決。在git reset
后,再git stash pop
即可還原先前的修改內容。


X 參考文獻
- (推薦) git reset HEAD 與 git reset --hard HEAD的區別 - 簡書
- (推薦) [Git]解決GIT沖突問題:git pull failed - 千千寰宇/博客園
- [GIT]指定分支下創建分支 - 千千寰宇/博客園
- 遠程倉庫版本回退 - 簡書
- SVN:取消對代碼的修改 - 推薦/CSDN
# svn revert
# svn revert [-R] filePath/DirPath