git 筆記記錄(六) git檢出

      1.上一節講了重置命令,重置命令是修改了引用的遊標指向,重置命令所針對的是頭指針HEAD,之所以沒有修改HEAD內容,是因爲HEAD指向了一個引用refs/heads/master,所以重置命令體現爲分支遊標的變更,HEAD本身一直指向的是refs/heads/master,並沒有在重置時改變.
     2.而檢出命令(git checkout)的實質是修改HEAD本身的指向,該命令不會影響分支.

     3.HEAD是當前工作區的"基礎版本",當執行提交時,HEAD指向的提交作爲新提交的父提交.

bluceshang@bluceshang:~/gittemp$ cat .git/HEAD
ref: refs/heads/master
bluceshang@bluceshang:~/gittemp$ git branch -v
* master 3dad65f test reset amend
可以看出當前處於master分支.現在使用git checkout.

bluceshang@bluceshang:~/gittemp$ git checkout 3dad65f^
Note: checking out '3dad65f^'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at 0d61bf3... does master follow this new commit?
可以看出現在處於"分離頭指針"狀態,什麼叫分離頭指針狀態,看看HEAD就知道了.此時的HEAD指向了一個具體的提交ID而不是一個分支,此時HEAD的頭指針被改變了,由指向master分支變成了一個指向的ID

bluceshang@bluceshang:~/gittemp$ cat .git/HEAD
0d61bf3576df85a228b90d421f2410b73d6d9fed
  可以看出master與HEAD已經不一樣了.

bluceshang@bluceshang:~/gittemp$ git rev-parse HEAD master
0d61bf3576df85a228b90d421f2410b73d6d9fed
3dad65fc13072062f5edd94f73990788f0968d8a
此時處於頭指針分離狀態,所作的修改不能被任何一個分支所跟蹤,因此不能保證所作的提交會永久保存,當reflog中含有該日誌過期後,這個提交隨時都會從版本被中清除.挽救的辦法是將分禽狀態的提交merge到master中來.
bluceshang@bluceshang:~/gittemp$ git checkout master
bluceshang@bluceshang:~/gittemp$ git merge e39623e
bluceshang@bluceshang:~/gittemp$ git log --graph --oneline
*   3807484 Merge commit 'e39623e'
|\  
| * e39623e commit in detached HEAD mode
* | 3dad65f test reset amend
|/  
* 0d61bf3 does master follow this new commit?
* d7b6764 add file
* 66ae14e modify welcome
* 15c643c Append a nice line.
* e213c85 change author
* d4e260e first commit
此時可以看到我們已經通過merge合併到master中來了.


git checkout命令的詳細用法

一:git checkout [-q] [<commit>[--] <paths>...]

二:git checkout [<branch>]

三:git checkout [-m] [[--b]--orphan]  <new_branch> [<start_point>]

第一種用法<commit>是可選項,省略則相當於從暫存區進行檢出,與reset 命令不同,reset默認是HEAD,而checkout的默認是暫存區.因此重置一般是用於暫存區,而檢出一般是用於覆蓋工作區.這種用法不會修改HEAD指針,主要用於版本的文件覆蓋工作區中的文件,如果省略<commit>則會用暫存區的文件覆蓋工作區中的文件,否則會用指定提交中的文件覆蓋工作區與暫存區中的文件.

第二種用法是切換分支.如果沒有<branch>會進入頭指針分離狀態.

第三種用法是創建和切換到新的分支中,新的分支從<start_point>指定的提交開始創建.

git  checkout  branch

      檢出branch分支,要完成上圖中的三個步驟,更新HEAD以指向branch以及用branch指向的樹更新暫存區與工作區.

git  checkout

        彙總顯示工作區,暫存區與HEAD的差異

git  checkout  --  filename

        用暫存區中filename文件來覆蓋工作區中的filename文件,相當於取消上次執行git  add  filename以來的本地修改.

git  checkout  branch  --   filename  

       維持HEAD的指向不變,會用branch所指向的提交中的filename替換暫存區和工作區中相應的文件.會直接將暫存區與工作區中的filename文件直接覆蓋.

git  checkout  -- .或git checkout  .

       "."會取消所有本地的修改,會用暫存區中所有文件直接覆蓋本地文件.








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