?
This document uses PHP Chinese website manual Release
git-checkout - 切換分支或恢復(fù)工作樹文件
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 [<tree-ish>] [--] <pathspec>… git checkout (-p|--patch) [<tree-ish>] [--] [<paths>…]
更新工作樹中的文件以匹配索引或指定樹中的版本。如果沒有給出路徑,git checkout
也將更新HEAD
以將指定的分支設(shè)置為當(dāng)前分支。
git checkout <branch>
要準(zhǔn)備在<branch>上工作,通過(guò)更新工作樹中的索引和文件并將HEAD指向分支來(lái)切換到它。對(duì)工作樹中的文件進(jìn)行本地修改保留,以便它們可以被提交給<分支>。
如果找不到<branch>,但確實(shí)在一個(gè)遠(yuǎn)程(具有匹配的名稱稱為<remote>)中存在跟蹤分支,則視為等同于
$ git checkout -b <branch> --track <remote>/<branch>
您可以省略<branch>,在這種情況下,命令退化為“檢出當(dāng)前分支”,這是一種非常光榮的禁用操作,其副作用相當(dāng)昂貴,只顯示當(dāng)前分支的跟蹤信息(如果存在)。
git checkout -b|-B <new_branch> <start point>
指定-b
會(huì)導(dǎo)致創(chuàng)建一個(gè)新分支,就像調(diào)用git-branch [1]然后檢出一樣。在這種情況下,您可以使用--track
或--no-track
選項(xiàng),它們將被傳遞給git branch
。作為一種方便,--track
不-b
意味著分支的創(chuàng)建; 請(qǐng)參閱--track
下面的說(shuō)明。
如果-B
給出,如果它不存在則創(chuàng)建<new_branch>; 否則,它被重置。這是事務(wù)性的等價(jià)物
$ git branch -f <branch> [<start point>]$ git checkout <branch>
也就是說(shuō),除非“git checkout”成功,否則該分支不會(huì)被重置/創(chuàng)建。
git checkout --detach <branch> git checkout --detach <commit>
準(zhǔn)備工作在<commit>之上,通過(guò)分離HEAD(參見“DETACHED HEAD”部分),并更新工作樹中的索引和文件。保留對(duì)工作樹中文件的本地修改,以使生成的工作樹成為提交時(shí)記錄的狀態(tài)和本地修改。
當(dāng)<commit>參數(shù)是分支名稱時(shí),該--detach
選項(xiàng)可用于在分支尖端分離HEAD(git checkout <branch>
將檢出該分支而不分離HEAD)。
省略<分支>在當(dāng)前分支的頂端分離HEAD。
git checkout <tree-ish> <pathspec>…
通過(guò)替換索引或<tree-ish>中的內(nèi)容(通常是提交)覆蓋工作樹中的路徑。當(dāng)給出<tree-ish>時(shí),匹配<pathspec>的路徑將在索引和工作樹中更新。
由于先前的合并失敗,索引可能包含未合并的條目。默認(rèn)情況下,如果您試圖從索引中檢出這樣的條目,則檢出操作將失敗并且不會(huì)檢出任何內(nèi)容。使用-f
將忽略這些未合并的條目。通過(guò)使用--ours
或,可以從索引中檢出合并的特定方的內(nèi)容--theirs
。使用時(shí)-m
,可以放棄對(duì)工作樹文件所做的更改,以重新創(chuàng)建原始沖突的合并結(jié)果。
git checkout (-p|--patch) <tree-ish> <pathspec>…
這與上面描述的“從索引或樹狀結(jié)構(gòu)檢查工作樹的路徑”類似,但可以使用交互式界面來(lái)顯示“diff”輸出并選擇要在哪個(gè)區(qū)塊中使用的區(qū)塊結(jié)果。請(qǐng)參閱下面的--patch
選項(xiàng)說(shuō)明。
-q --quiet
安靜,抑制反饋信息。
--no-progress
除非--quiet
已指定,否則標(biāo)準(zhǔn)錯(cuò)誤流默認(rèn)情況下會(huì)將其連接到終端時(shí)報(bào)告進(jìn)度狀態(tài)。無(wú)論如何,即使沒有附加到終端,該標(biāo)志也能夠進(jìn)行進(jìn)度報(bào)告--quiet
。
-f --force
切換分支時(shí),即使索引或工作樹與HEAD不同,也要繼續(xù)。這用于丟棄本地更改。
從索引檢出路徑時(shí),請(qǐng)勿在未合并的條目上失敗; 相反,未合并的條目將被忽略。
--ours --theirs
從索引檢出路徑時(shí),請(qǐng)檢查階段#2(ours
)或#3(theirs
)以獲取未合并路徑。
需要注意的是在git rebase
和git pull --rebase
,ours
并theirs
可能出現(xiàn)交換; --ours
給出了分支版本的變化重新分配到--theirs
的版本,同時(shí)給出了分支中保存正在重新分配工作的版本。
這是因?yàn)?code>rebase在將遠(yuǎn)程歷史記錄視為共享規(guī)范的工作流中使用,并將待分配的分支上的工作作為要整合的第三方工作來(lái)處理,并且您暫時(shí)承擔(dān)亞歷山大期間經(jīng)典歷史的守護(hù)者。作為規(guī)范歷史的守護(hù)者,您需要從遠(yuǎn)程查看歷史記錄ours
(即“我們共享的規(guī)范歷史”),而您在您的支行上做的是theirs
(即“一個(gè)貢獻(xiàn)者的工作”)。
-b <new_branch>
創(chuàng)建一個(gè)名為<new_branch>的新分支并在<start_point>處啟動(dòng)它; 有關(guān)詳細(xì)信息,請(qǐng)參閱git-branch [1]。
-B <new_branch>
創(chuàng)建分支<new_branch>并在<start_point>處啟動(dòng)它; 如果它已經(jīng)存在,則將其重置為<start_point>。這相當(dāng)于用“-f”運(yùn)行“git branch”; 有關(guān)詳細(xì)信息,請(qǐng)參閱git-branch [1]。
-t --track
創(chuàng)建新分支時(shí),設(shè)置“上游”配置。有關(guān)詳細(xì)信息,請(qǐng)參閱git-branch [1]中的“--track”。
如果沒有-b
給出選項(xiàng),則通過(guò)查看為相應(yīng)的遠(yuǎn)程配置的refspec的本地部分,然后剝離最初的部分直到“*”,新分支的名稱將從遠(yuǎn)程跟蹤分支派生。這將告訴我們?cè)诜种А皁rigin / hack”(或“遠(yuǎn)程/源/黑客”,甚至“refs / remotes / origin / hack”)時(shí)使用“hack”作為本地分支。如果給定名稱沒有斜線,或者上述猜測(cè)結(jié)果為空名稱,則猜測(cè)會(huì)中止。-b
在這種情況下,你可以明確地給出一個(gè)名字。
--no-track
即使branch.autoSetupMerge配置變量為true,也不要設(shè)置“上游”配置。
-l
創(chuàng)建新分支的reflog; 有關(guān)詳細(xì)信息,請(qǐng)參閱git-branch [1]。
--detach
而不是檢查一個(gè)分支來(lái)處理它,檢查提交檢查和可廢棄的實(shí)驗(yàn)。當(dāng)<commit>不是分支名稱時(shí),這是“git checkout <commit>”的默認(rèn)行為。有關(guān)詳細(xì)信息,請(qǐng)參閱下面的“分離頭部”一節(jié)。
--orphan <new_branch>
創(chuàng)建一個(gè)orphan
名為<new_branch> 的新分支,從<start_point>開始并切換到該分支。在這個(gè)新分支上進(jìn)行的第一次提交將沒有父母,它將成為與所有其他分支和提交完全斷開連接的新歷史記錄的根。
索引和工作樹被調(diào)整,就像您以前運(yùn)行過(guò)“git checkout <start_point>”一樣。這允許您通過(guò)輕松運(yùn)行“git commit -a”來(lái)啟動(dòng)一個(gè)新的歷史記錄來(lái)記錄一組類似<start_point>的路徑,以便進(jìn)行根提交。
如果您想從提交中發(fā)布樹而不公開完整的歷史記錄,這會(huì)很有用。您可能想要這樣做來(lái)發(fā)布項(xiàng)目的開源分支,該分支的當(dāng)前樹是“干凈的”,但其完整歷史記錄包含專有或其他設(shè)計(jì)的代碼位。
如果你想啟動(dòng)一個(gè)斷開的歷史記錄,記錄一組完全不同于<start_point>的路徑,那么你應(yīng)該通過(guò)運(yùn)行“git rm -rf”在創(chuàng)建孤立分支后立即清除索引和工作樹。 “ 來(lái)自工作樹的頂層。之后,您將準(zhǔn)備好準(zhǔn)備新文件,重新填充工作樹,從別處復(fù)制它們,提取 tarball 等。
--ignore-skip-worktree-bits
在稀疏結(jié)帳模式下,git checkout -- <paths>
只會(huì)更新$ GIT_DIR / info / sparse-checkout中由<路徑>和稀疏模式匹配的條目。此選項(xiàng)會(huì)忽略稀疏模式并添加<paths>中的任何文件。
-m --merge
在切換分支時(shí),如果對(duì)當(dāng)前分支與切換到的分支之間的一個(gè)或多個(gè)文件進(jìn)行本地修改,則該命令將拒絕切換分支以便在上下文中保留修改。但是,使用此選項(xiàng),當(dāng)前分支,工作樹內(nèi)容和新分支之間的三向合并已完成,并且您將位于新分支上。
當(dāng)合并沖突發(fā)生時(shí),沖突路徑的索引條目未被合并,您需要解決沖突并標(biāo)記已解析的路徑git add
(或git rm
合并是否應(yīng)導(dǎo)致刪除路徑)。
當(dāng)從索引檢出路徑時(shí),使用此選項(xiàng)可以在指定的路徑中重新創(chuàng)建沖突的合并。
--conflict=<style>
與上面的--merge選項(xiàng)相同,但改變了沖突的區(qū)塊顯示方式,覆蓋merge.conflictStyle配置變量??赡艿闹凳恰昂喜ⅰ保J(rèn))和“diff3”(除了“合并”樣式顯示的內(nèi)容,顯示原始內(nèi)容)。
-p --patch
在<tree-ish>(或索引,如果未指定)和工作樹之間的區(qū)別中交互地選擇hunk。然后將選定的區(qū)塊反向應(yīng)用于工作樹(并且如果指定了<tree-ish>,則索引)。
這意味著您可以使用git checkout -p
有選擇地放棄當(dāng)前工作樹中的編輯。請(qǐng)參閱git-add [1]的“交互模式”部分了解如何操作該--patch
模式。
--ignore-other-worktrees
git checkout
當(dāng)被通緝的裁判已經(jīng)被另一個(gè)工作樹簽出時(shí)拒絕。這個(gè)選項(xiàng)使它無(wú)論如何檢查裁判。換句話說(shuō),裁判可以由多個(gè)工作樹持有。
--no-recurse-submodules
使用-- recurse 子模塊將根據(jù)超級(jí)項(xiàng)目中記錄的提交更新所有已初始化的子模塊的內(nèi)容。如果覆蓋子模塊中的本地修改,則除非-f
使用,否則檢出將失敗。如果沒有使用(或--no-recurse-submodules),則子模塊的工作樹將不會(huì)更新。
<branch>
分行結(jié)賬; 如果它引用了一個(gè)分支(即,前綴為“refs / heads /”的名稱是一個(gè)有效的 ref),那么該分支將被簽出。否則,如果它指向一個(gè)有效的提交,那么您的 HEAD 變?yōu)椤胺蛛x”,并且您不再在任何分支上(詳情見下文)。
作為特例,第"@{-N}"
N 個(gè)分支/提交的語(yǔ)法檢出分支(而不是分離)。你也可以指定-
哪一個(gè)是同義詞"@{-1}"
。
作為更進(jìn)一步的特例,如果只有一個(gè)合并基礎(chǔ),則可以將其"A...B"
用作合并基礎(chǔ)的快捷方式。你可以在大多數(shù)的一個(gè)離開了和,在這種情況下默認(rèn)為ABABHEAD
。
<new_branch>
新分支的名稱。
<start_point>
要開始新分支的提交的名稱; 有關(guān)詳細(xì)信息,請(qǐng)參閱git-branch [1]。默認(rèn)為HEAD。
<tree-ish>
要檢出的樹(當(dāng)有路徑時(shí))。如果未指定,則會(huì)使用索引。
HEAD通常指的是一個(gè)命名分支(例如master
)。同時(shí),每個(gè)分支都提到特定的提交。讓我們看看一個(gè)有三個(gè)提交的回購(gòu),其中一個(gè)被標(biāo)記,并且master
檢出分支:
HEAD (refers to branch 'master') | v a---b---c branch 'master' (refers to commit 'c') ^ | tag 'v2.0' (refers to commit 'b')
在此狀態(tài)下創(chuàng)建提交時(shí),分支會(huì)更新以引用新的提交。具體來(lái)說(shuō),git commit
創(chuàng)建一個(gè)新的提交d
,其父提交c
,然后更新分支master
引用新的提交d
。HEAD仍然指向分支master
,因此間接地指的是commit d
:
$ edit; git add; git commit HEAD (refers to branch 'master') | v a---b---c---d branch 'master' (refers to commit 'd') ^ | tag 'v2.0' (refers to commit 'b')
能夠檢出不在任何命名分支頂端的提交,或者甚至創(chuàng)建未由命名分支引用的新提交,有時(shí)很有用。讓我們看看 checkout 提交時(shí)會(huì)發(fā)生什么b
(這里我們展示了兩種可能的做法):
$ git checkout v2.0 # or $ git checkout master^^ HEAD (refers to commit 'b') | v a---b---c---d branch 'master' (refers to commit 'd') ^ | tag 'v2.0' (refers to commit 'b')
請(qǐng)注意,無(wú)論我們使用哪個(gè) checkout 命令,HEAD 現(xiàn)在都直接引用commit b
。這被稱為處于分離 HEAD 狀態(tài)。這意味著 HEAD 指的是一個(gè)特定的提交,而不是指向一個(gè)已命名的分支。我們來(lái)看看創(chuàng)建提交時(shí)會(huì)發(fā)生什么:
$ edit; git add; git commit HEAD (refers to commit 'e') | v e /a---b---c---d branch 'master' (refers to commit 'd') ^ | tag 'v2.0' (refers to commit 'b')
現(xiàn)在有一個(gè)新的提交e
,但它只被 HEAD 引用。我們當(dāng)然可以在這個(gè)狀態(tài)下添加另一個(gè)提交:
$ edit; git add; git commit HEAD (refers to commit 'f') | v e---f /a---b---c---d branch 'master' (refers to commit 'd') ^ | tag 'v2.0' (refers to commit 'b')
事實(shí)上,我們可以執(zhí)行所有正常的 Git 操作。但是,讓我們看看當(dāng)我們結(jié)賬主人時(shí)會(huì)發(fā)生什么:
$ git checkout master HEAD (refers to branch 'master') e---f | / v a---b---c---d branch 'master' (refers to commit 'd') ^ | tag 'v2.0' (refers to commit 'b')
重要的是要認(rèn)識(shí)到,在這一點(diǎn)上什么都不是提交f
。除非我們?cè)谶@之前創(chuàng)建了一個(gè)引用,否則最終提交f
(并通過(guò)擴(kuò)展提交e
)將被例程
Git 垃圾收集進(jìn)程刪除。如果我們還沒有離開提交f
,其中任何一個(gè)都會(huì)創(chuàng)建一個(gè)對(duì)它的引用:
$ git checkout -b foo (1)$ git branch foo (2)$ git tag foo (3)
創(chuàng)建一個(gè)新的分支foo
,引用 commit f
,然后更新 HEAD 以引用分支foo
。換句話說(shuō),在這個(gè)命令之后,我們將不再處于分離的 HEAD 狀態(tài)。
類似地創(chuàng)建了一個(gè)新的分支foo
,它引用了 commit f
,但是將 HEAD 分開。
創(chuàng)建一個(gè)新的標(biāo)簽foo
,它引用 commit f
,使 HEAD 脫離。如果我們已經(jīng)離開 commit f
,那么我們必須首先恢復(fù)它的對(duì)象名(通常使用 git reflog),然后我們可以創(chuàng)建一個(gè)對(duì)它的引用。例如,要查看 HEAD 引用的最后兩個(gè)提交,我們可以使用以下任一命令:$ git reflog -2 HEAD?;? git log -g -2 HEADArgument 消歧當(dāng)只有一個(gè)參數(shù)給出而且它不是--
(例如“git checkout abc”),當(dāng)參數(shù)是有效的<tree-ish>
(例如分支“abc”存在)和有效的<pathspec>
(例如文件或名稱為“abc”的目錄)時(shí),Git 通常會(huì)要求您歧義。因?yàn)闄z查分支是非常常見的操作,但是,“git checkout abc”<tree-ish>
在這種情況下。使用git checkout -- <pathspec>
如果要檢出這些路徑出 index.Examples 的
以下序列檢出master
分支,將其恢復(fù)Makefile
為兩個(gè)修訂版,錯(cuò)誤地刪除hello.c,并從索引中取回它。
$ git checkout master(1)$ git checkout master?2 Makefile(2)$ rm -f hello.c $ git checkout hello.c(3)
1. switch branch2. take a file out of another commit
3. restore hello.c from the index If you want to check out all C source files out of the index, you can say $ git checkout -- '*.c' Note the quotes around *.c. The file hello.c will also be checked out, even though it is no longer in the working tree, because the file globbing is used to match entries in the index (not in the working tree by the shell). If you have an unfortunate branch that is named hello.c, this step would be confused as an instruction to switch to that branch. You should instead write: $ git checkout -- hello.cAfter working in the wrong branch, switching to the correct branch would be done using:
$ git checkout mytopic
但是,您在本地修改的文件中,您的“錯(cuò)誤”分支和正確的“mytopic”分支可能有所不同,在這種情況下,上述結(jié)帳將失敗,如下所示:
$ git checkout mytopic錯(cuò)誤:您對(duì)'frotz'進(jìn)行了本地更改; 不切換分支。
您可以將該-m
標(biāo)志賦予該命令,該命令將嘗試三路合并:
$ git checkout -m mytopic Auto-merging frotz
在這種三路合并之后,本地修改被not
注冊(cè)在您的索引文件中,因此git diff
會(huì)顯示自從新分支的提示以來(lái)所做的更改。
在使用該-m
選項(xiàng)切換分支期間發(fā)生合并沖突時(shí),您會(huì)看到如下所示的內(nèi)容:
$ git checkout -m mytopic自動(dòng)合并frotz錯(cuò)誤:在frotz致命合并沖突:合并程序失敗
此時(shí),git diff
如前面的示例所示,顯示合并的干凈合并以及沖突文件中的更改。編輯并解決沖突并git add
像往常一樣將其標(biāo)記為已解決:
$ edit frotz $ git add frotz