|
檢出命令git checkout是git最常用的命令之一,同時也是一個很危險的命令,因為這條命令會重寫工作區(qū)。檢出命令的用法如下: 用法一:git checkout [-q] [<commit>] [--] <paths>... 用法二:git checkout [<branch>] 用法三:git checkout [-m] [[-b]--orphan] <new_branch>] [<start_point>] 上面列出的第一種用法和第二種用法的區(qū)別在于,第一種用法在命令中包含路徑<paths>。為了避免路徑和引用(或者提交ID)同名而發(fā)生沖突,可以在<paths>前用兩個連續(xù)的短線(短號)作為分隔。 第一種用法的<commit>是可選項,如果省略則相當(dāng)于從暫存區(qū)(index)進行檢出。這和上一章的重置命令大不相同:重置的默認值是HEAD,而檢出的默認值是暫存區(qū)。因此重置一般用于重置暫存區(qū)(除非使用--hard參數(shù),否則不會重置工作區(qū)),而檢出命令主要是覆蓋工作區(qū)(如果<commit>不省略,也會替換暫存區(qū)中相應(yīng)的文件)。 第一種用法(包含了路徑<paths>的用法)不會改變HEAD頭指針,主要是用于指定版本的文件覆蓋工作區(qū)中對應(yīng)的文件。如果省略<commit>,則會用暫存區(qū)的文件覆蓋工作區(qū)的文件,否則用指定提交中的文件覆蓋暫存區(qū)中和工作區(qū)中對應(yīng)的文件。 第二種用法(不使用路徑<paths>的用法)則會改變HEAD頭指針。之所以后面的參數(shù)會寫作<branch>,是因為只有HEAD切換到一個分支才可以對提交進行跟蹤,否則仍然會進入“分離頭指針”的狀態(tài)。在“分離頭指針”狀態(tài)下的提交不能被引用關(guān)聯(lián)到,從而可能丟失。所以用法二最主要的作用就是切換到分支。如果省略<branch>則相當(dāng)于對工作區(qū)進行狀態(tài)檢查。 第三種用法主要是創(chuàng)建和切換到新的分支(<new_branch>),新的分支從<start_point>指定的提交開始創(chuàng)建。新分支和我們熟悉的master分支沒有什么實質(zhì)的不同,都是在refs/heads命名空間下的引用。 下圖所示的版本庫模型圖描述了git checkout實際完成的操作。 下面通過一些示例具體看一下檢出命令的不同用法。 $ git checkout branch 檢出branch分支。要完成圖中的三個步驟,更新HEAD以指向branch分支,以及用branch 指向的樹更新暫存區(qū)和工作區(qū)。 $ git checkout 匯總顯示工作區(qū)、暫存區(qū)與HEAD的差異。 $ git checkout HEAD 同上 $ git checkout -- filename 用暫存區(qū)中filename文件來覆蓋工作區(qū)中的filename文件。相當(dāng)于取消自上次執(zhí)行git add filename以來(如果執(zhí)行過)的本地修改。 $ git checkout branch -- filename 維持HEAD的指向不變。用branch所指向的提交中filename替換暫存區(qū)和工作區(qū)中相 應(yīng)的文件。注意會將暫存區(qū)和工作區(qū)中的filename文件直接覆蓋。 $ git checkout -- . 或?qū)懽?git checkout . 注意git checkout 命令后的參數(shù)為一個點(“.”)。這條命令最危險!會取消所有本地的 修改(相對于暫存區(qū))。相當(dāng)于用暫存區(qū)的所有文件直接覆蓋本地文件,不給用戶任何 確認的機會! |
|
|