Git學習筆記:命令reset和checkout在“重置”功能中的區別及其注意事項
本隨筆介紹在Git系統中,命令git reset
和命令git checkout
在實現重置功能中常用的選項及這兩個命令之間的區別,以及在重置過程中一些需要注意的地方。
本隨筆作者還在學習階段,對Git軟體的理解和使用還不夠透徹,難免會出現一些書寫上或技術上的問題,若出現了問題歡迎在評論區或私信與我討論。本隨筆的內容整理自官方文件
目錄Git中的重置
在使用Git的過程中,難免會出現這樣一種情況:已經進行過一次提交,工作區和暫存區都是乾淨的狀態,但是因為一些原因,需要將工作區或/和暫存區裡的檔案重置為某個先前的版本來測試以前的功能,這就需要用到Git提供的重置功能。Git通常是使用git reset
git checkout
來實現重置功能,這兩個命令在使用過程中會有明顯的區別。
重置完整的內容
僅重置最後一次提交
git reset --soft [commit]
該命令會將最後一次提交的HEAD指標和Branch引用同時重置到引數[commit]
指向的提交。這裡隱含著一個執行後會發生的情況:暫存區會變為最後一次提交之前的狀態,因為暫存區的內容和最後一次提交的內容不再相同。
重置最後一次提交和暫存區
git reset [--mixed] [commit]
同上一個命令一樣,該命令會將最後一次提交的HEAD指標和分支引用同時重置到引數[commit]
指向的提交,但是會有一部額外的操作,將當前HEAD指標指向的提交的內容複製到暫存區裡,因此上一個命令提到的“暫存區會變為最後一次提交之前的狀態”將不會出現,但是基於同樣的理由,工作區的狀態會變為最後一次提交之前的狀態。
重置三棵樹(倉庫、暫存區和工作區)
git reset --hard [commit]
該命令在上一個命令的基礎上,及將HEAD指標指向的提交的內容複製到暫存區裡之後,還會將這個內容複製到工作區,因此並不會出現暫存區和/或工作區的狀態變為最後一次提交之前的狀態。但是因此也表明工作區內所有為暫存提交的內容將會被永久丟棄。
git checkout <commit>
該命令的功能同reset
版本的一致,也是將“三棵樹”重置為指定<commit>
提交的內容,但是有一個最主要的區別就是,checkout
版本的操作僅僅只會將HEAD制動到指定的<commit>
提交,而不會reset
或checkout
命令還原到之前分支的狀態。2、工作區域的內容不會被丟棄掉,因為還存在於之前的分支上,但並不存在於HEAD指標指向的提交,因為HEAD已經從之前的分支上分離開了。
重置指定的檔案
不像重置完整內容的版本有那麼多變體,重置指定檔案的版本僅僅只有兩條條命令(reset
版本和checkout
版本各一條),且這兩條命令都不會移動HEAD指標和分支引用。
git reset [commit] <paths>
:該命令會將當前暫存區的狀態恢復回[commit]
時候的狀態。
git checkout [commit] <paths>
:該命令會將暫存區和工作區的內容恢復回[commit]
時候的狀態。