課下來自己動手試試git的命令
主要嘗試及記錄
git reset --hard
git reset --soft
git revert
以上3個命令的具體作用及區(qū)別吏砂,這些命令主要用于撤銷修改,但又各有些小區(qū)別
嘗試準(zhǔn)備
首先,為了制造合適的測試環(huán)境镊叁,我選擇重新初始化一個本地git倉庫來嘗試柠辞,因為不涉及到push到遠程倉庫团秽,所以也就不需要遠程倉庫了,這個本地倉庫純用于測試
了解HEAD
為了更加方便理解命令的作用不同,我們還需要了解一個HEAD的概念
HEAD簡單來說,指的就是當(dāng)前當(dāng)前分支的最近一次提交后的版本著拭,也就是說载佳,HEAD代表的是最新的版本,根據(jù)這個概念硫狞,我們還可以知道HEAD就是指上一個版本,同理HEAD就是再上一個版本,因為(英文符號shift+6)不太方便予颤,我們也可以以HEAD~x來表示距離最新版本的之前幾個版本
建立本地倉庫并添加文件
橫向?qū)Ρ?/h2>
準(zhǔn)備工作做好后,我們就來試試幾個命令
首先冬阳,我們先對a.md進行3次編輯及提交以產(chǎn)生3個版本記錄
這里引入了一個log的新用法git log --oneline
蛤虐,這個log命令能夠讓我們相對直觀的看到最近的版本記錄并標(biāo)識出提交版本號
在這個情況下,我們的工作區(qū)和暫存區(qū)都是干凈的肝陪,我們不想要第三次提交了驳庭,我們來試試三個命令的不同
git reset --hard
這時候我們看到操作成功,我們來看一下對于文件產(chǎn)生了什么作用氯窍,首先查看a.md饲常,并查看狀態(tài)
我們能看到,reset --hard命令不僅將修改的文件變?yōu)榱说诙翁峤坏臓顟B(tài)狼讨,并且不用我們再次commit
這時候我們再log --oneline看一下
我們看到贝淤,我們的第三次提交記錄被抹去了,也就是說熊楼,reset --hard的作用差不多是完全重置到某個版本并且銷毀提交記錄霹娄,本能的感覺到這個操作比較危險能犯,我們來看一下歷史的log
可以看到我們當(dāng)前的HEAD確實處于了第二次編輯提交的狀態(tài),按下不表犬耻,接著試試--soft
git reset --soft
之前的記錄已經(jīng)被毀了踩晶,但是通過查閱資料,我們是可以恢復(fù)的
我們從git reflog中可以看到枕磁,第三次編輯并提交的版本號為0379f9d,所以我們用--hard+版本號參數(shù)的命令回到三次編輯并提交的狀態(tài)渡蜻,接著嘗試--soft
同樣的,我們不想要第三次提交计济,希望回退到第二次提交
看到操作成功了茸苇, 但是并沒有什么提示,那我們看看git狀態(tài)和a.md的狀態(tài)吧
我們看到了沦寂,--soft命令学密,僅僅是把我們的第三次‘commit’的操作給撤銷了,a.md處于第三次編輯完成传藏、add完成腻暮,但未提交的狀態(tài)
簡單來看,也就是說--soft命令是撤銷指定版本內(nèi)容的那一次commit毯侦,其他的東西都不改變哭靖,接著試試revert命令
git revert
我們再次使用git reflog查詢版本號并回到三次編輯提交的狀態(tài),同樣侈离,還是不希望保留第三次編輯提交
然后我們試試revert
在回到3次編輯提交的版本后试幽,我進行了一次log查詢及狀態(tài)查詢,狀態(tài)顯示沒有待提交的的東西卦碾,但是在進行revert想回到第二次編輯的狀態(tài)時铺坞,提示失敗,失敗后再查看狀態(tài)看到了a.md的unmerged的提示蔗坯,講道理康震,我到這里已經(jīng)有點懵逼了,就按照提示宾濒,我再進行了一次commit腿短,并產(chǎn)生了一條“由于revert失敗,提交一次第三次編輯的a.md”的修改版本記錄绘梦,這一點有點摸不到頭腦橘忱,回頭還是會問一下老師,總之卸奉,我們繼續(xù)
我們還會是向回到第二次編輯狀態(tài)钝诚,嘗試git revert
我們看到,操作成功了榄棵,并且自動打開了vim讓我們編輯本次變動的提交信息凝颇,我們直接保存退出
操作成功后潘拱,查看status并查看a.md的狀態(tài)
我們發(fā)現(xiàn)a.md被改變了,改成了一個奇怪的樣子拧略,到這里我已經(jīng)完全懵逼了芦岂,,所以我覺得從頭來一次純凈版本的revert
重新建立b.md并編輯提交3次
我們來直接試試revert到第二次編輯
我們看到這次的revert操作比較成功垫蛆,但是由于目標(biāo)是第二次編輯提交的版本禽最,所以在revert的時候接連彈出了兩個revert的commit信息輸入框,完成后的log如下圖袱饭,生成了兩個新log川无,一個是回退到第三次編輯提交、一個是回退到第二次編輯提交
從這里有兩步我們就可以看出虑乖,revert命令會講文件修改為目標(biāo)版本的上一個版本懦趋,也就是撤銷了修改及add、commit
小結(jié)
其實到這里决左,我還是有點懵逼的愕够,但是基本的效果大概有了一定了解
git reset --hard
毀滅性質(zhì)的直接將版本重置到指定版本的狀態(tài),直接刪除指定版本的commit內(nèi)容佛猛,同時如果本地有修改內(nèi)容話也會丟失
事了拂衣去,并不會留下通常能查到的版本記錄坠狡,僅能在git reflog查詢
git reset --soft
只告訴Git將其他的commit重置到HEAD,并不影響工作區(qū)文件
同樣不會保留常規(guī)log
git revert
這其實算是一個進度往前走的逆向提交继找,也就是說HEAD版本及提交記錄將會繼續(xù)前進,只是新的commit的內(nèi)容和要revert的內(nèi)容正好相反逃沿,能夠抵消要被revert的內(nèi)容婴渡。
大概就是這么多淺顯理解,還有很多不足凯亮,希望能夠在今后的常規(guī)使用中逐漸加深理解边臼!