1. 程式人生 > 其它 >Git學習筆記:命令reset和checkout在“重置”功能中的區別及其注意事項

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>提交,而不會

移動分支引用,也就是說HEAD指標變成了遊離態,並沒有指向任何分支,這裡隱含了兩個要點:1、只要知道之前分支的名字,那我們還能夠通過resetcheckout命令還原到之前分支的狀態。2、工作區域的內容不會被丟棄掉,因為還存在於之前的分支上,但並不存在於HEAD指標指向的提交,因為HEAD已經從之前的分支上分離開了。

重置指定的檔案

不像重置完整內容的版本有那麼多變體,重置指定檔案的版本僅僅只有兩條條命令(reset版本和checkout版本各一條),且這兩條命令都不會移動HEAD指標和分支引用。

git reset [commit] <paths>:該命令會將當前暫存區的狀態恢復回[commit]時候的狀態。
git checkout [commit] <paths>:該命令會將暫存區工作區的內容恢復回[commit]時候的狀態。