git之 git checkout

摘自《Git權威指南》

 

檢出命令git checkout是git最常用的命令之一,同時也是一個很危險的命令,因爲這條命令會重寫工作區。檢出命令的用法如下:

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

用法二:git checkout [<branch>]

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

上面列出的第一種用法和第二種用法的區別在於,第一種用法在命令中包含路徑<paths>。爲了避免路徑和引用(或者提交ID)同名而發生衝突,可以在<paths>前用兩個連續的短線(短號)作爲分隔。

第一種用法的<commit>是可選項,如果省略則相當於從暫存區(index)進行檢出。這和上一章的重置命令大不相同:重置的默認值是HEAD,而檢出的默認值是暫存區。因此重置一般用於重置暫存區(除非使用--hard參數,否則不會重置工作區),而檢出命令主要是覆蓋工作區(如果<commit>不省略,也會替換暫存區中相應的文件)。

第一種用法(包含了路徑<paths>的用法)不會改變HEAD頭指針,主要是用於指定版本的文件覆蓋工作區中對應的文件。如果省略<commit>,則會用暫存區的文件覆蓋工作區的文件,否則用指定提交中的文件覆蓋暫存區中和工作區中對應的文件。

第二種用法(不使用路徑<paths>的用法)則會改變HEAD頭指針。之所以後面的參數會寫作<branch>,是因爲只有HEAD切換到一個分支纔可以對提交進行跟蹤,否則仍然會進入“分離頭指針”的狀態。在“分離頭指針”狀態下的提交不能被引用關聯到,從而可能丟失。所以用法二最主要的作用就是切換到分支。如果省略<branch>則相當於對工作區進行狀態檢查。

第三種用法主要是創建和切換到新的分支(<new_branch>),新的分支從<start_point>指定的提交開始創建。新分支和我們熟悉的master分支沒有什麼實質的不同,都是在refs/heads命名空間下的引用。

下圖所示的版本庫模型圖描述了git checkout實際完成的操作。

clip_image002

下面通過一些示例具體看一下檢出命令的不同用法。

$ git checkout branch

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

$ git checkout

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

$ git checkout HEAD

同上

$ git checkout -- filename

用暫存區中filename文件來覆蓋工作區中的filename文件。相當於取消自上次執行git add filename以來(如果執行過)的本地修改。

$ git checkout branch -- filename

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

$ git checkout -- . 或寫作 git checkout .

注意git checkout 命令後的參數爲一個點(“.”)。這條命令最危險!會取消所有本地的  修改(相對於暫存區)。相當於用暫存區的所有文件直接覆蓋本地文件,不給用戶任何       確認的機會!


轉載註明出處:http://www.cnblogs.com/craftor/archive/2012/11/04/2754147.html

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