#### 檢出命令
此命令會重寫工作區
該命令的實質就是修改HEAD本身的指向,不會影響分支游標。當執行此命令時,HEAD頭指針被更改了,由指向一個引用(分支)變成了指向一個提交ID,分支(master)的指向沒有改變,仍舊指向原有的提交ID
“分離頭指針”狀態:指的是HEAD頭指針指向了一個具體的提交ID
用法一:git checkout [-q] [<commit>] [--] <paths>... ? ?為避免路徑和引用(或提交ID)同名而發生沖突,可以在<paths>前用--作為分隔
此用法不會改變HEAD頭指針,主要用于指定版本的文件覆蓋工作區中對應的文件。若省略<commit>,則會用暫存區的文件覆蓋工作區的文件,否則用指定提交中的文件覆蓋暫存區和工作區中對應的文件。
用法二:git checkout [<branch>]
此用法會改變HEAD頭指針,之所以后面的參數寫作<branch>,是因為只有HEAD切換到一個分支才可以對提交進行跟蹤,否則仍然會進入“分離頭指針”的狀態,此狀態下提交不能被引用關聯到,從而可能丟失。所以此用法最主要的作用就是切換到分支,若省略<branch>則相當于對工作區進行狀態檢查。
用法三:git checkout [-m] [[-b | orphan] <new_branch>] [<start_point>]
此用法主要是創建和切換到新的分支,新的分支從<start_point>指定的提交開始創建。新分支與master分支沒什么實質的不同,都是在refs/heads命名空間下的引用。
~~~
$ git checkout branch
~~~
檢出branch分支,更新HEAD以指向branch分支,以及用branch指向的樹更新暫存區和工作區。
~~~
$ git checkout 、 $ git checkout HEAD
~~~
匯總顯示工作區、暫存區與HEAD的差異
~~~
$ git checkout -- filename
~~~
用暫存區中filename文件覆蓋工作區中的filename文件,相當于取消自上次執行git add filename以來(如果執行過)的本地修改(會悄無聲息覆蓋)
~~~
$ git checkout branch -- filename
~~~
維持HEAD的指向不變,用branch所指向的提交中的filename替換暫存區和工作區中相應的文件,會將暫存區和工作區中的filename文件直接覆蓋
~~~
$ git checkout -- 或 $ git checkout .
~~~
取消所有本地的修改(相對于暫存區),相當于用暫存區的所有文件直接覆蓋本地文件,不給用戶任何確認機會。