16. branch與HEAD的理解,使用git reset恢復到過去的某個版本

1. branch指針與HEAD指針

1.1 branch是什麼?
branch本質上是指向commit對象的指針。
1.2 HEAD是什麼?
HEAD是指向branch的指針,指向的是當前所在的分支。
爲什麼需要HEAD指針?因爲往往分支都會有很多個,比如說master,dev等等,那麼怎麼知道當前所在的分支是哪個呢?就是通過HEAD指針來知道的,它指向的分支就是當前所在的分支。
在切換分支的時候,只是簡單的HEAD指針的移動。所以git切換分支很快。

2. git reset恢復版本

如下圖所示,是當前git倉庫(Git Repository)、暫存區(Index)以及工作區(Working Directory)的狀態。
HEAD和master都指向了最後一次的提交file.tex v3。暫存區和工作區中的file.txt也是v3版本。
在這裏插入圖片描述

2.1 簡單的三條reset命令

可以使用三條命令來恢復到上一個commit:git reset --soft HEAD~ 、 git reset --mixed HEAD~ 、git reset --soft HEAD~
HEAD~表示的是當前commit節點的父節點。

1. git reset --soft HEAD~   // 撤銷git倉庫的上一次的commit,但是不改變暫存區以及工作區

執行上面的命令,指針移動如下:git倉庫中的HEAD指針以及分支master指針都會移動到上一次的提交。但是暫存區和工作區不會發生變化。
在這裏插入圖片描述

2. git reset --mixed HEAD~ // 撤銷git倉庫和暫存區的上一次的commit,但是不改變工作區

執行上面的命令,指針移動如下:git倉庫中的HEAD指針以及分支master指針都會移動到上一次的提交。同事暫存區也會恢復到上一次的提交。但是工作區不會發生變化。
在這裏插入圖片描述

3. git reset --hard HEAD~ // 撤銷git倉庫、暫存區以及工作區上一次的commit

執行上面的命令,指針移動如下:git倉庫中的HEAD指針以及分支master指針都會移動到上一次的提交。同事暫存區也會撤銷到上一次的提交。最後工作區也會撤銷到上一次的提交。
在這裏插入圖片描述
注意:

  1. git reset HEAD~ 與 git reset mixed HEAD~等價。也就是說直接執行git reset HEAD ~會恢復git倉庫和暫存區。
  2. –hard比較危險,因爲它連工作區的文件也回滾了。如果被回滾的文件,被commit過,那麼git數據庫中還保留一個該文件的V3版本,可以通過reflog來找回。但是如果沒有被提交過,就永遠找不回來了。

2.2 git reset指定的文件

1. git reset file.txt // 撤銷file.txt的暫存,和git add操作相反

詳細解釋的話,其實就是將HEAD指向的commit(HEAD指向的是當前所在的分支),複製到暫存區中。
在這裏插入圖片描述

2. git reset eb43bf file.txt // 指定特定的commit,複製到暫存區中(eb43bf就是commit的hash值)

如下圖所示的例子:將file.txt v1 複製到暫存區,但是工作區以及git倉庫保持不變
在這裏插入圖片描述

3. git reset命令的總結

如下圖所示,REF表示的是會改變git倉庫中的branch和HEAD的指向。
Index一欄的YES表示的是會改變暫存區。
Workdir一欄的YES表示的是會改變工作區。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章