場景一:撤銷工做區的修改(未執行git add)git
指令:git checkout 【目錄或文件名】spa
實例:ip
一、修改了test.txt文檔,git status 會出現以下提示:
文檔
二、git checkout test.txt,無提示
it
三、git status,顯示乾淨的工做區
class
場景二:撤銷暫存區的修改(已執行git add,但未執行git commit)test
指令:git reset 【HEAD或某一版本號】【可選:文件名】(HEAD指向最近的一個版本,一個commit就是一個版本,版本號能夠經過git log指令查詢)cli
注意:git reset有三個參數,--soft、--mixed、--hard,若是不指定,會默認指行--mixed參數,它的意思是將指定版本以後的修改(在本場景中,就是最近一次提交後的修改),都撤回到工做區中,也就是未執行git add的狀態。若是加上--hard參數,就會放棄指定版本以後的全部修改,會出現乾淨的工做區與暫存區(此參數會在下個場景展現實例)。若是加上--soft參數,則會把指定版本以後的修改撤回到暫存區,工做區內容不變。im
實例:查詢
一、修改test.txt文檔,並提交修改到暫存區
二、git reset HEAD
三、git status,顯示修改撤回到了工做區
場景三:撤銷已經執行git commit的修改(真正意義上的版本回退)
指令:git reset或git revert
git reset與git revert的區別:
git reset會修改git log的版本歷史,若是你回退到了幾個版本前,那git log時就會發現你丟失了被回退的版本。而git revert不會修改版本歷史,你回退哪一個版本,git revert就會新建一個提交,把你要回退版本的修改抵消掉。若是沒看懂,請看實例:
實例一:git reset
一、git log --pretty=online 顯示有三個版本
二、git reset --hard 版本號(輸前幾位便可),回退版本到Second commit
三、git log --pretty=online,丟失版本Third commit
實例二:git revert
一、git log --pretty=online 顯示有三個版本
二、git revert 版本號,抵消某個版本與其以後版本的修改,注意,這裏的邏輯與git reset不同,若是想回到Second commit的版本,就須要抵消掉Third commit的修改。因此這裏應該git revert Third commit的版本號
三、revert的過程當中可能會有衝突,git status查看衝突位置,解決衝突,git commit 文件名(無需git add)
四、git log --pretty=online,Third commit並無丟失,而是多了一個revert版本,你能夠 git log -p查看每一個版本的修改,發現revert的版本所作的修改與Third commit偏偏相反,正好抵消掉了它的修改。
忠告:若是你的回退涉及到了遠程分支,在版本回退時最好使用revert,因它沒有修改版本歷史;若是使用reset,由於你的reset操做,會使你比遠程少了幾個提交,遠程會提示你落後於遠程版本,應該先git pull代碼,那麼你的reset操做又有何意義呢?(git push -f 強推能夠作到,但不推薦這樣作)