git回滾命令reset、revert的區別


##使用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是一直向前的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM