git checkout命令


git checkout命令用於切換分支或恢復工作樹檔案。git checkout是git最常用的命令之一,同時也是一個很危險的命令,因為這條命令會重寫工作區。

使用語法

git checkout [-q] [-f] [-m] [<branch>]
git checkout [-q] [-f] [-m] --detach [<branch>]
git checkout [-q] [-f] [-m] [--detach] <commit>
git checkout [-q] [-f] [-m] [[-b|-B|--orphan] <new_branch>] [<start_point>]
git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>…?
git checkout [-p|--patch] [<tree-ish>] [--] [<paths>…]

描述

更新工作樹中的檔案以匹配索引或指定樹中的版本。如果沒有給出路徑 - git checkout還會更新HEAD,將指定的分支設定為當前分支。

範例

以下是一些範例 -

範例-1

以下順序檢查主分支,將Makefile還原為兩個修訂版本,錯誤地刪除hello.c,並從索引中取回。

$ git checkout master             #(1)
$ git checkout master~2 Makefile  #(2)
$ rm -f hello.c
$ git checkout hello.c            #(3)

(1) 切換分支
(2) 從另一個提交中取出檔案
(3)從索引中恢復hello.c

如果想要檢出索引中的所有C原始檔,可以使用以下命令 -

$ git checkout -- '*.c'

注意:*.c是使用引號的。 檔案hello.c也將被檢出,即使它不再在工作樹中,因為檔案globbing用於匹配索引中的條目(而不是在shell的工作樹中)。

如果有一個分支也命名為hello.c,這一步將被混淆為一個指令切換到該分支。應該寫:

$ git checkout -- hello.c

範例-2

在錯誤的分支工作後,想切換到正確的分支,則使用:

$ git checkout mytopic

但是,您的「錯誤」分支和正確的「mytopic」分支可能會在在本地修改的檔案中有所不同,在這種情況下,上述檢出將會失敗:

$ git checkout mytopic
error: You have local changes to 'frotz'; not switching branches.

可以將-m標誌賦給命令,這將嘗試三路合併:

$ git checkout -m mytopic
Auto-merging frotz

在這種三路合併之後,原生的修改沒有在索引檔案中註冊,所以git diff會顯示從新分支的提示之後所做的更改。

範例-3

當使用-m選項切換分支時發生合併衝突時,會看到如下所示:

$ git checkout -m mytopic
Auto-merging frotz
ERROR: Merge conflict in frotz
fatal: merge program failed

此時,git diff會顯示上一個範例中乾淨合併的更改以及衝突檔案中的更改。 編輯並解決衝突,並用常規方式用git add來標記它:

$ edit frotz # 編輯 frotz 檔案中內容,然後重新新增
$ git add frotz

其它範例

git checkout的主要功能就是遷出一個分支的特定版本。預設是遷出分支的HEAD版本
一此用法範例:

$ git checkout master     #//取出master版本的head。
$ git checkout tag_name    #//在當前分支上 取出 tag_name 的版本
$ git checkout  master file_name  #//放棄當前對檔案file_name的修改
$ git checkout  commit_id file_name  #//取檔案file_name的 在commit_id是的版本。commit_id為 git commit 時的sha值。

$ git checkout -b dev/1.5.4 origin/dev/1.5.4

# 從遠端dev/1.5.4分支取得到本地分支/dev/1.5.4
$ git checkout -- hello.rb
#這條命令把hello.rb從HEAD中籤出.
$ git checkout .
#這條命令把 當前目錄所有修改的檔案 從HEAD中簽出並且把它恢復成未修改時的樣子.
#注意:在使用 git checkout 時,如果其對應的檔案被修改過,那麼該修改會被覆蓋掉。