git reset --soft,--hard的區(qū)別
git reset 命令可以將當(dāng)前的HEAD
重置到特定的狀態(tài)。
首先要搞清楚下面幾個(gè)概念
-
HEAD
:HEAD
就是指向當(dāng)前分支當(dāng)前版本的游標(biāo) - Index: Index即為暫存區(qū),當(dāng)你修改了你的git倉庫里的一個(gè)文件時(shí)重窟,這些變化一開始是unstaged狀態(tài)献幔,為了提交這些修改欢唾,你需要使用
git add
把它加入到index鳄厌,使它成為staged狀態(tài)岂贩。當(dāng)你提交一個(gè)commit時(shí)嗤详,index里面的修改被提交个扰。 - working tree: 即當(dāng)前的工作目錄。
git reset 的用法
git reset [<mode>] [<commit>]
git reset 將當(dāng)前分支的HEAD指向給定的版本葱色,并根據(jù)模式的不同決定是否修改index和working tree递宅。
常用的有三種模式,--soft, --mixed, --hard苍狰,如果沒有給出<mode>則默認(rèn)是--mixed
--soft
使用--soft
參數(shù)將會僅僅重置HEAD
到制定的版本办龄,不會修改index和working tree
38d65dd (HEAD -> master) Third commit
6bf8706 Second commit
093ceb0 First commit
例如當(dāng)前分支現(xiàn)在有三次提交,執(zhí)行git reset --soft HEAD~
之后淋昭,查看git log
6bf8706 (HEAD -> master) Second commit
093ceb0 First commit
而本地文件的內(nèi)容并沒有發(fā)生變化俐填,而index中仍然有最近一次提交的修改,這時(shí)執(zhí)行g(shù)it status會顯示這些修改已經(jīng)在再暫存區(qū)中了翔忽,無需再一次執(zhí)行g(shù)it add
--mixed
使用--mixed
參數(shù)與--soft的不同之處在于英融,--mixed修改了index,使其與第二個(gè)版本匹配歇式。index中給定commit之后的修改被unstaged驶悟。
如果現(xiàn)在執(zhí)行g(shù)it commit 將不會發(fā)生任何事,因?yàn)闀捍鎱^(qū)中沒有修改材失,在提交之前需要再次執(zhí)行g(shù)it add
--hard
使用--hard
同時(shí)也會修改working tree痕鳍,也就是當(dāng)前的工作目錄,如果我們執(zhí)行git reset --hard HEAD~
,那么最后一次提交的修改笼呆,包括本地文件的修改都會被清楚熊响,徹底還原到上一次提交的狀態(tài)且無法找回。所以在執(zhí)行reset --hard
之前一定要小心
git revert
使用git revert
也能起到回退版本的作用诗赌,不同之處在于
-
git revert <commit>
會回退到<commit>之前的那次提交汗茄,比如git revert HEAD~3
會回退到最近的第4個(gè)提交的狀態(tài),而不是第3個(gè) -
git revert
會產(chǎn)生一個(gè)新的commit境肾,將這次回退作為一次修改記錄提交剔难,這樣的好處是不修改歷史提交記錄。