1. 程式人生 > >【Git學習】深入瞭解git checkout命令

【Git學習】深入瞭解git checkout命令

檢出命令(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命令的這個用法會在具體介紹。

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

 

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

命令: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 命令後的引數為一個點(".")。這條命令最危險!會取消所有本地的修改(相對於暫存區)。相當於用暫存區的所有檔案直接覆蓋本地檔案,不給使用者任何確認的機會!