1. git reset 語法
命令格式:git reset [--soft | --mixed | --hard] [<commit>]
1.1 使用參數(shù)--hard孙援,如git reset --hard <commit ID>
①替換引用的指向。引用指向新的提交ID吕朵。
②替換暫存區(qū)。替換后燃逻,暫存區(qū)的內(nèi)容和引用指向的目錄樹一致杈帐。
③替換工作區(qū)闰蛔。替換后,工作區(qū)的內(nèi)容變得和暫存區(qū)一致香到,也和HEAD所指向的目錄樹內(nèi)容相同鱼冀。
1.2 使用參數(shù)--soft,如 git reset --soft <commit ID>
即只更改引用的指向悠就,不改變暫存區(qū)和工作區(qū)千绪。
只改變commit(指針指向),stage index 和 working directory 不變
1.3 使用參數(shù)--mixed或者不使用參數(shù)(默認為--mixed)梗脾,如 git reset <commit>
更改引用的指向及重置暫存區(qū)荸型,但是不改變工作區(qū)。
只改變commit(指針指向) 和 add (stage index)炸茧,working directory不變
eg.
git status # 查看工作區(qū)是否干凈
subl readme.md # 修改md文件
git add readme.md # 提交到緩存區(qū) stage index
git commit -m '201907071410' # 提交到版本庫
git reset --mix head # 將 stage index 和指針退回到上一次提交
git status # 檢查工作區(qū)狀態(tài)
git checkout --README.md # 將緩存區(qū)文件拉回到工作區(qū)
已經(jīng)push到遠程倉庫的代碼
通過 git reset <commit_id>
直接刪除指定的commit id后面所有的提交瑞妇,指針指向commit id
git push origin HEAD --force
強制提交代碼稿静,因為本地版本早于遠程倉庫代碼
2. git reset 原理
--hard:重置位置的同時,直接將 working Tree工作目錄辕狰、 index 暫存區(qū)及
repository 都重置成目標(biāo)Reset節(jié)點的內(nèi)容,所以效果看起來等同于清空暫存區(qū)和
工作區(qū)改备。
--soft:重置位置的同時,保留working Tree工作目錄和index暫存區(qū)的內(nèi)容蔓倍,只讓repository中的內(nèi)容和 reset 目標(biāo)節(jié)點保持一致悬钳,因此原節(jié)點和reset節(jié)點之間的【差異變更集】會放入index暫存區(qū)中(Staged files)。所以效果看起來就是工作目錄的內(nèi)容不變偶翅,暫存區(qū)原有的內(nèi)容也不變默勾,只是原節(jié)點和Reset節(jié)點之間的所有差異都會放到暫存區(qū)中。
--mixed(默認):重置位置的同時聚谁,只保留Working Tree工作目錄的內(nèi)容母剥,但會將 Index暫存區(qū) 和 Repository 中的內(nèi)容更改和reset目標(biāo)節(jié)點一致,因此原節(jié)點和Reset節(jié)點之間的【差異變更集】會放入Working Tree工作目錄中形导。所以效果看起來就是原節(jié)點和Reset節(jié)點之間的所有差異都會放到工作目錄中媳搪。