首先我們先來了解一下這3個命令都有什么作用
git reset --hard xxx:
重置當(dāng)前分支的HEAD為指定commit传货,同時重置暫存區(qū)和工作區(qū),與指定commit一致
git reset --soft xxx:
重置當(dāng)前的HEAD為指定commit宏娄,但保持暫存區(qū)和工作區(qū)不變
git revert xxx:
新建一個commit问裕,用來撤銷指定commit,后者的所有變化都將被前者抵消孵坚,并且應(yīng)用到當(dāng)前分支
剛接觸可能不太了解HEAD是什么粮宛,其實這是當(dāng)前分支版本頂端的別名,也就是在當(dāng)前分支你最近的一個提交卖宠。HEAD 并不是只能指向分支的最頂端(時間節(jié)點(diǎn)距今最近的那個)巍杈,實際上它可以指向任何一個節(jié)點(diǎn)。
使用git reflog命令來查看所有的版本信息
我們可以看到在是用來git reset --hard 3bc9551命令后扛伍,再次查看版本信息發(fā)現(xiàn)HEAD指向了3bc9551這個節(jié)點(diǎn)筷畦。但是要知道,暫存區(qū)和工作區(qū)同時也被重置了刺洒,所以可能造成數(shù)據(jù)的丟失鳖宾。
同樣的,在使用git reset --soft 3bc9551命令后逆航,查看版本信息后發(fā)現(xiàn)HEAD同樣指向了3bc9551這個節(jié)點(diǎn)鼎文。但是soft命令并沒有改變暫存區(qū)和工作區(qū),所以用commit進(jìn)行提交的還是原來的暫存區(qū)和工作區(qū)的文件纸泡。
而git revert xxx命令則會對某次操作進(jìn)行撤銷漂问,但是這次操作之前或者之后的commit都將被保留赖瞒,并把這次撤銷當(dāng)做一次新的提交。