開發過程當中,你確定會遇到這樣的場景:git
場景一:緩存
糟了,我剛把不想要的代碼,commit到本地倉庫中了,可是尚未作push操做!spa
場景二:.net
完全完了,剛線上更新的代碼出現問題了,須要還原此次提交的代碼!指針
場景三:code
剛纔我發現以前的某次提交太愚蠢了,如今想要幹掉它!blog
上述場景一,在未進行git push
前的全部操做,都是在「本地倉庫」中執行的。咱們暫且將「本地倉庫」的代碼還原操做叫作「撤銷」!ci
狀況一:文件被修改了,但未執行git add
操做(working tree內撤銷)開發
git checkout fileName git checkout .
狀況二:同時對多個文件執行了git add
操做,但本次只想提交其中一部分文件get
$ git add * $ git status # 取消暫存 $ git reset HEAD <filename>
狀況三:文件執行了git add
操做,但想撤銷對其的修改(index內回滾)
# 取消暫存 git reset HEAD fileName # 撤銷修改 git checkout fileName
狀況四:修改的文件已被git commit
,但想再次修改再也不產生新的Commit
# 從新提交 $ git add sample.txt $ git commit --amend -m"說明"
狀況五:已在本地進行了屢次git commit
操做,如今想撤銷到其中某次Commit
git reset [--hard|soft|mixed|merge|keep] [commit|HEAD]
具體參數和使用說明,請查看:Git Pro深刻淺出(二)中的重置揭祕部分
上述場景二,已進行git push
,即已推送到「遠程倉庫」中。咱們將已被提交到「遠程倉庫」的代碼還原操做叫作「回滾」!注意:對遠程倉庫作回滾操做是有風險的,需提早作好備份和通知其餘團隊成員!
若是你每次更新線上,都會打tag,那恭喜你,你能夠很快的處理上述場景二的狀況
git checkout <tag>
若是你回到當前HEAD指向
git checkout <branch_name>
狀況一:撤銷指定文件到指定版本
# 查看指定文件的歷史版本 git log <filename> # 回滾到指定commitID git checkout <commitID> <filename>
狀況二:刪除最後一次遠程提交
方式一:使用revert
git revert HEAD git push origin master
方式二:使用reset
git reset --hard HEAD^ git push origin master -f
兩者區別:
狀況三:回滾某次提交
# 找到要回滾的commitID git log git revert commitID
git clean命令用來從你的工做目錄中刪除全部沒有tracked過的文件.
git clean常常和git reset --hard一塊兒結合使用. 記住reset隻影響被track過的文件, 因此須要clean來刪除沒有track過的文件. 結合使用這兩個命令能讓你的工做目錄徹底回到一個指定的<commit>的狀態.
1 |
|
是一次clean的演習, 告訴你哪些文件會被刪除. 記住他不會真正的刪除文件, 只是一個提醒.
1 |
|
刪除當前目錄下全部沒有track過的文件. 他不會刪除.gitignore文件裏面指定的文件夾和文件, 無論這些文件有沒有被track過.
1 |
|
刪除指定路徑下的沒有被track過的文件.
1 |
|
刪除當前目錄下沒有被track過的文件和文件夾.
git clean -xf
刪除當前目錄下全部沒有track過的文件. 無論他是不是.gitignore文件裏面指定的文件夾和文件.
git reset --hard和git clean -f是一對好基友. 結合使用他們能讓你的工做目錄徹底回退到最近一次commit的時候.
git clean對於剛編譯過的項目也很是有用. 如, 他能輕易刪除掉編譯後生成的.o和.exe等文件. 這個在打包要發佈一個release的時候很是有用.
下面的例子要刪除全部工做目錄下面的修改, 包括新添加的文件. 假設你已經提交了一些快照了, 並且作了一些新的開發.
1 2 |
|
運行後, 工做目錄和緩存區回到最近一次commit時候一摸同樣的狀態, git status會告訴你這是一個乾淨的工做目錄, 又是一個新的開始了.
git rm filename