現實生活中雖然沒有后悔藥,但程序世界是有的。 reset 就是git中的后悔藥,而且還可以根據參數不同來調整后悔的程度。
說明:
本文章并非git基礎知識,需要對gi命令有一定的熟練程度才能理解,如果看官對 『工作區』『暫存區』『存儲庫』這三個詞比較陌生,或者完全不理解是什么,那還是先請去看看git基礎知識,再回頭來往下瀏覽,以免浪費寶貴時間
1,前置知識說明
- 工作區: 即 Working Tree 或 Working Directory,不同文章中叫法不同。
- 暫存區:即 Index/Stage 或 Staged Snapshot。
- 存儲庫:即 Repository。
當我們新增或修改文件時,文件最先會放在工作區,這個階段是我們正在進行文件的創建和編輯階段。當使用 git add 命令,即表示我們的創建或編輯工作已經完成,準備將勞動成果添加到git倉庫,但這時所有的創建或修改還只是臨時的,被改動的文件只是轉移到暫存區臨時保存,并沒有真正影響到git倉庫的內容,只有使用 git commit 命令之后,所有的改動才最終生效,git 倉庫中也產生新的文件版本記錄。
簡單來說,一個文件在git目錄中有三種情況:
1,剛剛添加到目錄中,或剛剛被修改過,此時文件被記錄在工作區。
2,執行了 git add 命令, 此時文件由工作區轉移到了暫存區
3,執行了 git commit 命令,此時文件由暫存區轉移到git倉庫,即存儲庫。
2,resset 的三種模式
如果把上面的 添加文件到 執行 git commit 的過程看作是前進,那么 git reset 就是回退,reset 的不同模式,其實就是回退幾步,上面的提交一共有三步,對應的,reset 可以讓你選擇是回退一步,兩步,還是三步。
以一個實例來說明,新建一個名稱為 git-reset 的文件夾,使用執行 git init
將該文件夾初始化為一個git目錄,然后進行如下操作:
1,新建一個文本文件 1.txt, 并添加內容為 1234
2,執行 git add 1.txt
3,執行 git commit -m '添加1.txt文件'
如果操作無誤,使用 git log 命令查看日志,應該會看到一條提交記錄。
為了方便下面的 reset 命令的理解 ,再繼續進行如下操作:
4,修改1.txt,在原來內容后面添加 abcd。 (1.txt 最終的內容為 1234abcd)
5,執行 git add 1.txt
6,執行 git commit -m '修改1.txt文件,添加新內容'
如果操作無誤,使用 git log 命令查看日志,應該會看到兩條提交記錄。
-
--hard
硬核模式,完全回退(就是腸子都悔清了,恨不得事情沒有發生過), 就是回退三步。
在上面的例子中,執行如下命令:
$ git reset --hard HEAD^
執行完成之后,查看1.txt的內容,會發現只有1234,也就是說,1.txt 被退回到了上面 6步中的第三步之后的狀態,456這三步相當于就沒有發生過。
這就是--hard 模式,完全回退,使用此參數,在上一次執行 git commit 命令之后的所有操作都將會被抹除,相當于沒有發生過,也就是之前在上一次git commit 命令之后的所有操作都是做了無用功,白費力氣了。
**警告:
**此模式相當危險,除非你已經完全明白這個參數的含義以及執行這條命令之后的結果,否則不建議使用該參數。
-
--mixed
混合模式,回退到工作區(后悔不已,希望事情回到最初開始,自己可以做些事情來改變劇情的發展),就是回退兩步。
為方便理解,將上面的 456三步再做一次(因為經過上面的 --hard 之后,456已經被抹掉了,相當于沒發生),然后執行如下命令:
$ git reset --mixed HEAD^
執行完成之后,使用 git status 查看狀態,并查看1.txt 的文件內容,會發現內容還是1234abcd,但git status顯示的文件名稱是紅色,這是沒有執行git add 1.txt 命令的狀態,也就是說操作被回退到了第4步之后。
這就是 --mixed 模式,也是reset 的默認模式,即與 git reset HEAD^
效果是一樣的,文件的修改操作并沒有被抹除,也就是文件操作沒有影響,但git操作被撤消了。
這是最常用的模式,所以如果不使用參數,默認即是這個模式。
-
--soft
輕度模式(或可以叫軟模式),回退到暫存區(內心其實是不怎么后悔的,只是想修改一下提交記錄)。
為方便理解,將上面的56兩步再做一次(道理同上),然后執行如下命令:
$ git reset --soft HEAD^
執行完成之后,使用 git status 查看狀態,并查看1.txt 的文件內容,會發現內容還是1234abcd,但git status顯示的文件名稱是綠色,這是執行了git add 命令,但沒有執行 git commit 命令的效果,說明操作被回退到了第5步之后。
3,總結
git reset 的三種不同模式,其實對應的就是 git 提交的三個步驟,只要弄清楚了git提交的步驟,并能熟練使用,那么 git reset 其實也不難理解了。