開發過程當中,你確定會遇到這樣的場景:git
糟了,我剛把不想要的代碼,commit到本地倉庫中了,可是尚未作push操做!github
完全完了,剛線上更新的代碼出現問題了,須要還原此次提交的代碼!shell
剛纔我發現以前的某次提交太愚蠢了,如今想要幹掉它!指針
上述場景一,在未進行git push
前的全部操做,都是在「本地倉庫」中執行的。咱們暫且將「本地倉庫」的代碼還原操做叫作「撤銷」!code
git add
操做(working tree內撤銷)git checkout fileName git checkout .
git add
操做,但本次只想提交其中一部分文件$ git add * $ git status # 取消暫存 $ git reset HEAD <filename>
git add
操做,但想撤銷對其的修改(index內回滾)# 取消暫存 git reset HEAD fileName # 撤銷修改 git checkout fileName
# 修改最後一次提交 $ git add sample.txt $ git commit --amend -m"說明"
git reset [--hard|soft|mixed|merge|keep] [commit|HEAD]
具體參數和使用說明,請查看:Git Pro深刻淺出(二)中的重置揭祕部分開發
上述場景二,已進行git push
,即已推送到「遠程倉庫」中。咱們將已被提交到「遠程倉庫」的代碼還原操做叫作「回滾」!注意:對遠程倉庫作回滾操做是有風險的,需提早作好備份和通知其餘團隊成員!get
若是你每次更新線上,都會打tag
,那恭喜你,你能夠很快的處理上述場景二的狀況it
git checkout <tag>
若是你回到當前HEAD指向io
git checkout <branch_name>
# 查看指定文件的歷史版本 git log <filename> # 回滾到指定commitID git checkout <commitID> <filename>
方式一:使用revertast
git revert HEAD git push origin master
方式二:使用reset
git reset --hard HEAD^ git push origin master -f
兩者區別:
# 找到要回滾的commitID git log git revert commitID
git log --oneline -n5 git rebase -i "commit id"^
注意:須要注意最後的^號,意思是commit id的前一次提交
git rebase -i "5b3ba7a"^
在編輯框中刪除相關commit,如pick 5b3ba7a test2
,而後保存退出(若是遇到衝突須要先解決衝突)!
git push origin master -f
經過上述操做,若是你想對歷史多個commit進行處理或者,能夠選擇git rebase -i,只需刪除對應的記錄就好。rebase還可對 commit 消息進行編輯,以及合併多個commit。