當(dāng)我們對(duì)當(dāng)前版本的代碼不滿意時(shí)询枚,想要回到以前某個(gè)版本時(shí)颅崩,Git有后悔藥讓我們吃绒北,下面就介紹幾個(gè)版本回退的命令戳稽。
在使用中大致分兩種情況:
1)還沒有push到遠(yuǎn)程倉庫
這種情況發(fā)生在你的本地代碼倉庫,可能你add ,commit 以后發(fā)現(xiàn)代碼有點(diǎn)問題,準(zhǔn)備取消提交,用到下面命令。
reset
git reset [--soft | --hard | --mixed]
常見上面三種類型:
1.--soft
保留源碼,只回退到commit 信息到某個(gè)版本痹仙。不涉及index的回退,如果還需要提交,直接commit即可是尔。之前修改的記錄還在暫存區(qū),可以直接 commit 到版本庫中开仰。
2.--hard
源碼也會(huì)回退到某個(gè)版本,commit和index 都會(huì)回退到某個(gè)版本拟枚。(注意,這種方式是改變本地代碼倉庫源碼) 之前修改的記錄全部丟失。
3.--mixed
會(huì)保留源碼,只是將git commit和index 信息回退到了某個(gè)版本众弓。之前修改的記錄在工作區(qū)恩溅。
git reset 默認(rèn)是 --mixed 模式
git reset --mixed 等價(jià)于 git reset
使用方法:首先,Git必須知道當(dāng)前版本是哪個(gè)版本谓娃,在Git中脚乡,用HEAD表示當(dāng)前版本,上一個(gè)版本就是HEAD滨达,上上一個(gè)版本就是HEAD奶稠,當(dāng)然往上100個(gè)版本寫100個(gè)比較容易數(shù)不過來,所以寫成HEAD~100捡遍。
git reset --hard HEAD^
當(dāng)然使用對(duì)應(yīng)的commit id也可以锌订。
2)已經(jīng)push了
對(duì)于已經(jīng)把代碼push到線上倉庫,你回退本地代碼其實(shí)也想同時(shí)回退線上代碼,回滾到某個(gè)指定的版本,線上,線下代碼保持一致。你要用到下面的命令画株。
revert
git revert xxx
- git revert用于反轉(zhuǎn)提交,執(zhí)行evert命令時(shí)要求工作樹必須是干凈的辆飘。
- git revert用一個(gè)新提交來消除一個(gè)歷史提交所做的任何修改。
- revert 之后你的本地代碼會(huì)回滾到指定的歷史版本,這時(shí)你再 git push 既可以把線上的代碼更新谓传。(這里不會(huì)像reset造成沖突的問題)
使用方法:需要先找到你想回滾版本唯一的commit標(biāo)識(shí)代碼,可以用 git log 或者在adgit搭建的web環(huán)境歷史提交記錄里查看.
git revert c011eb3c20ba6fb38cc94fe5a8dda366a3990c61
通常,前幾位即可
git revert c011eb3
reset和revert比較:
git revert是用一次新的commit來回滾之前的commit劈猪,git reset是直接刪除指定的commit。
如果你已經(jīng)push到線上代碼庫, reset 刪除指定commit以后,你git push可能導(dǎo)致一大堆沖突良拼。但是revert 并不會(huì)。
如果在日后現(xiàn)有分支和歷史分支需要合并的時(shí)候,reset 恢復(fù)部分的代碼依然會(huì)出現(xiàn)在歷史分支里充边。但是revert 方向提交的commit 并不會(huì)出現(xiàn)在歷史分支里庸推。
reset 是在正常的commit歷史中,刪除了指定的commit,這時(shí) HEAD 是向后移動(dòng)了,而 revert 是在正常的commit歷史中再commit一次,只不過是反向提交,他的 HEAD 是一直向前的。