前面說了,若是你手滑刪掉了一個文件,能夠用 Git 幫你找回來。一樣,若是一個文件被你改來改去面目全非,直到程序沒法運行,你累感不愛想要回到開始的狀態,Git 也能夠幫你輕鬆搞定。git
咱們如今直接把 readme.txt 從文件夾中刪除。看一下狀態:程序員
# On branch masterweb
# Changes not staged for commit:spring
# (use "git add/rm <file>..." to update what will be committed)編輯器
# (use "git checkout -- <file>..." to discard changes in working directory)spa
#調試
# deleted: readme.txtorm
#it
no changes added to commit (use "git add" and/or "git commit -a")ast
注意其中有一句提示:
use "git checkout -- <file>..." to discard changes in working directory
用 git checkout -- <file> 命令捨棄工做目錄中的修改。注意 checkout 後面的 --,沒有這兩個減號就是另外一條命令了,後面關於分支的時候會去說它。
那咱們就來試一下:
git checkout -- readme.txt
看看文件夾中,消失的文件是否是又回來了?再看下 git status,也回到了沒有產生修改的狀態。
那麼,若是一個修改後的文件已經被暫存了,要如何恢復到以前的狀態呢?
咱們來改一下 readme.txt,在文件中加點字,而後 git add 添加到暫存區。查看狀態:
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: readme.txt
#
這裏 Git 又給出提示了:
use "git reset HEAD <file>..." to unstage
用 git reset HEAD <file> 命令撤銷暫存。
git reset HEAD readme.txt
這條命令並不會更改 readme.txt 裏的內容,修改仍然存在,可是文件的狀態變回到已修改。
# On branch master
# 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: readme.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
你能夠修改了從新暫存,也能夠用前面的方法把文件恢復。
再進一步,若是文件修改已經被 commit 了,要如何撤銷?
一種狀況是,你提交了以後發現還漏了幾個地方沒有改,或者提交的文件中有些小錯誤,想要撤銷回來從新提交。那麼你能夠用 git commit --amend 來從新提交。
作完修改、暫存以後,運行
git commit --amend
會開啓文本編輯器讓你修改上次的提交註釋,或者經過 -m 參數直接指定。保存退出後,這一次的改動就會被直接加上上一次的提交裏,不會產生新的 commit。
你也許以爲,直接再提交一次不就行了。但不免有時候不想由於筆誤產生過多提交。再說,程序員調試代碼的時候總會有些惡趣味,諸如 print 'believe spring brother' 之類的調試語句,若是最後忘了刪乾淨就提交了,確定不想再作一次提交去刪除。仍是直接神不知鬼不覺地清理掉比較好。
還有另外一種狀況,就是整個上一次的提交你都不想要了,但願回退到上一個提交狀態。這時候就須要用到版本回退了。