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