##使用git,總有一天會遇到下面的問題:
(1)改完代碼匆忙提交,上線發現有問題,怎么辦? 趕緊回滾。
(2)改完代碼測試也沒有問題,但是上線發現你的修改影響了之前運行正常的代碼報錯,必須回滾。
所以git的取消提交、回退甚至返回上一版本是比較重要的。
大致分為下面2種情況:
1、沒有push
這種情況發生在你的本地代碼倉庫,可能你add、commit以后發現代碼有點問題,准備取消提交,用reset
git reset \--soft | --mixed | --hard
參數說明:
--soft:保留源碼,只回退commit信息到某個版本,不涉及index的回退。如果還需要提交,直接commit即可。
--mixed:會保留源碼,只是將git commit和index的信息回退到了某個版本。(git reset默認的就是--mixed模式,即git reset等價於git reset --mixed)
--hard:源碼也會回退到某個版本,commit和index都會回退到某個版本。(注意這種方式是會改變本地代碼倉庫源碼)
當然有人在push代碼以后,也使用 reset --hard 回退代碼到某個版本之前。但是這樣會有一個問題,你線上的代碼沒有變,線上commit、index都沒有變,當你把本地代碼修改完提交的時候你會發現全是沖突........所以,這種情況你要使用下面的方式
2、已經push
對於已經把代碼push到線上倉庫,你回退本地代碼其實也想同時回退線上代碼,回滾到某個指定的版本,讓線上、線下代碼保持一致,用revert。
git revert用於反轉提交,行evert命令時要求工作樹必須是干凈的。
git revert用一個新提交來消除一個歷史提交所做的任何修改。
revert之后你的本地代碼會回滾到指定的歷史版本,這時你再git push就可以把線上的代碼更新。(這里不會像reset造成沖突的問題)
revert的使用,需要先找到你想回滾版本唯一的commit標識代碼,可以用git log或者在adgit搭建的web環境歷史提交記錄里查看。
git revert c011eb3c20ba6fb38cc94fe5a8dda366a3990c61
通常,前幾位即可
git revert c011eb3
綜上,git revert是用一次新的commit來回滾之前的commit,git reset是直接刪除指定的commit。看似達到的效果是一樣的,其實完全不同:
1、上面我們說的如果你已經push到線上代碼庫,reset刪除指定commit以后,你git push可能導致一大堆沖突,但是revert 不會。
2、如果在日后現有分支和歷史分支需要合並的時候,reset恢復部分的代碼依然會出現在歷史分支里,但是revert方向提交的commit並不會出現在歷史分支里。
3、reset是在正常的commit歷史中,刪除了指定的commit,這時HEAD是向后移動了。而revert是在正常的commit歷史中再commit一次,只不過是反向提交,它的HEAD是一直向前的。