前話:在vscode中,安裝git History插件,安裝之后就可以用F1,選擇Git:View History(git log),即可看到git的提交記錄。
在每一行的最后面,就是commit_id
git reset
如果回退一個(gè)只是commit的,并沒(méi)有push到遠(yuǎn)端分支的提交:
則直接執(zhí)行
git reset --hard commit_id
//回退到commit_id的這次提交
//或者
git reset --hard HEAD^
//回退到上一次提交
//HEAD 等同于當(dāng)前分支的最新的一次commit提交id
//HEAD^ 是上一次提交
注:
如果執(zhí)行g(shù)it reset --hard HEAD^ 顯示More?
這是因?yàn)樵趙indows的cmd控制臺(tái)中換行默認(rèn)符是^,所以More?的意思是問(wèn)你下一行是否需要再輸入,^符號(hào)就被當(dāng)做換行符了。
解決方法:
//加引號(hào)
git reset --hard "HEAD^"
//加^
git reset --hard HEAD^^
//換成~
git reset --hard HEAD~
git reset --hard HEAD~1
//~后面的數(shù)字表示回退幾次提交,默認(rèn)是一次
另外:
git reset 還有以下用法:
git reset --soft
git reset --mixed
區(qū)別就是:
使用--soft就僅僅將頭指針恢復(fù),已經(jīng)add的緩存以及工作空間的所有東西都不變。也就是執(zhí)行了git reset --soft 就相當(dāng)于只回退了git commit -m 這一步,改動(dòng)的文件已經(jīng)在暫存區(qū)了。
使用--mixed,就將頭指針恢復(fù),已經(jīng)add的緩存也會(huì)丟失掉,工作空間的代碼什么的是不變的。也就是執(zhí)行了git reset --mixed 就相當(dāng)于回退到了git add之前,改動(dòng)的文件還在工作區(qū),沒(méi)有add到暫存區(qū)。
使用--hard,一切就全都恢復(fù)了,頭指針恢復(fù),add的緩存消失,工作空間的代碼什么的也恢復(fù)到以前狀態(tài)。也就是相當(dāng)于你啥都沒(méi)干過(guò),工作區(qū)也沒(méi)有了
另外,如果已經(jīng)push到遠(yuǎn)端了,怎么回退?
依舊是先在本地回退,然后推到遠(yuǎn)端。
但是如果直接push的話,會(huì)push失敗,因?yàn)楸镜氐陌姹韭浜笥谶h(yuǎn)端的版本。
那就只有強(qiáng)退,加個(gè)--force參數(shù)
git push origin <branch> --force
git revert
回退版本還可以用git revert
如果回退的是一個(gè)只commit還沒(méi)有push到遠(yuǎn)端的操作:
git revert commit_id 操作不會(huì)刪除commit_id這次提交記錄,并且還會(huì)新增一個(gè)新的revert的提交記錄。
舉個(gè)例子:
如果你依次有commit_id為a、b、c三次提交記錄,并且a和b都已經(jīng)提交到遠(yuǎn)端,c還沒(méi)有push到遠(yuǎn)端,現(xiàn)在想撤銷(xiāo)c的改動(dòng),
則執(zhí)行git revert c,然后會(huì)生成一條d的commit_id,記錄你revert了c。
然后你執(zhí)行g(shù)it status,會(huì)告訴你你有2次commit沒(méi)有push。
然后你執(zhí)行push到遠(yuǎn)端,就會(huì)記錄下來(lái)你的c、d兩次提交。
如果你revert的是已經(jīng)push到遠(yuǎn)端的提交,會(huì)在工作區(qū)報(bào)沖突,需要你手動(dòng)撤銷(xiāo)你revert分支之后的改動(dòng),然后再次add,commit,push就可以了。
舉個(gè)例子:
如果你依次有commit_id為a、b、c三次提交記錄,并且都已經(jīng)提交到遠(yuǎn)端,現(xiàn)在想撤銷(xiāo)b之后的改動(dòng),
則執(zhí)行git revert b,然后工作區(qū)會(huì)報(bào)沖突,報(bào)的是a之后的改動(dòng)和當(dāng)前的改動(dòng)有沖突,可以選擇采用傳入的更改,然后接著add,commit,push就可以了。