命令概述
當(dāng)要回退到某一次提交的狀態(tài)時唇跨,可以使用git reset命令稠通。有三個常用參數(shù):--soft,--mixed买猖,--hard改橘。按照Git文檔的習(xí)慣,可以寫作
git reset [--soft | --mixed | --hard] [<commit>]
其中玉控,<commit>是指commit的hashcode飞主。
也可以使用HEAD代替<commit>,命令為
git reset [--soft | --mixed | --hard] [HEAD]
其中高诺,
HEAD 最近一個提交(倒數(shù)第一次)
HEAD^ 上一次提交(倒數(shù)第二次)
HEAD^^ 上一次的上一次提交(倒數(shù)第三次)
HEAD^^^ 倒數(shù)第四次提交
或者碌识,
HEAD~0 最近一個提交(倒數(shù)第一次)
HEAD~1 上一次提交(倒數(shù)第二次)
HEAD^2 上一次的上一次提交(倒數(shù)第三次)
HEAD^3 倒數(shù)第四次提交
如果在最近一次提交之后,沒有任何文件修改虱而,則使用HEAD或者HEAD~0筏餐,不會產(chǎn)生任何效果。
三個參數(shù)對比
通過以下公式牡拇,可以直觀的反映出三個參數(shù)的區(qū)別:
git reset --mixed <commit>
+ git add .
= git reset --soft <commit>
git reset --hard <commit>
= git reset --soft <commit>
+ git reset --hard HEAD
= git reset --mixed <commit>
+ git reset --hard HEAD
詳細(xì)的介紹魁瞪,可以參考CSDN的文章:關(guān)于 git reset 命令幾個常用參數(shù)的理解。
需要指出的是诅迷,文章對--hard參數(shù)的說明不完全準(zhǔn)確佩番。--hard舍棄的提交,并沒有徹底刪除罢杉,還存在倉庫里趟畏,如果知道被舍棄提交的hashcode,仍然可以恢復(fù)該提交滩租。
--hard參數(shù)的使用
當(dāng)要回退到之前某一次提交赋秀,并修改文件,且不希望放棄后面已有提交的時候律想,有兩種操作方式猎莲。
1、完全在本地倉庫完成
如果想在本地完成技即,可以在reset之前著洼,新建一個分支,保存狀態(tài);在reset之后身笤,修改文件豹悬,并提交,然后將新建分支合并到reset所在分支液荸。這時瞻佛,需手動消除沖突,重新跟蹤被修改文件娇钱,并提交伤柄。最后push到遠(yuǎn)程倉庫。
上圖顯示的就是這一過程文搂。
我們在狀態(tài)C适刀,新建分支branch-C,然后在master分支细疚,reset到狀態(tài)B蔗彤,修改文件,并提交狀態(tài)B1疯兼。這時然遏,如果將branch-C合并到master,Git會提示沖突吧彪,需要手動消除待侵。
2、借助遠(yuǎn)程倉庫完成
如果借助遠(yuǎn)程倉庫姨裸,則不必新建分支秧倾,直接reset到之前的某一次提交,修改文件傀缩,然后提交那先。這時,如果直接push到遠(yuǎn)程倉庫赡艰,Git會提示失敗售淡,需要pull遠(yuǎn)程倉庫到本地,然后手動消除沖突慷垮,重新跟蹤被修改的文件揖闸,并提交,最后push料身。
上圖顯示了這一過程汤纸。
在commit d809fd46,reset到狀態(tài)B芹血,修改文件贮泞,并提交狀態(tài)B2楞慈。這時,如果直接push隙畜,Git會提示失敗抖部,需要先pull遠(yuǎn)程倉庫到本地,Git提示沖突议惰,然后手動消除沖突。