Git Checkout



命令 git checkout 允許我們在分支之間切換,或者將工作目錄中的檔案恢復到特定分支或提交時的狀態。

它支援專案管理和撤銷更改。

  • git checkout 將工作目錄的檔案修改為與索引版本或特定提交匹配。

  • 此外,如果沒有提供檔案或路徑,它會更新 HEAD 以切換到所選分支。

  • 我們可以使用此命令更好地使我們的工作目錄與特定分支或提交匹配。

語法

git checkout [<branch-name>]

用法

Git 命令 git checkout 具有多種用途。以下是其主要用途:

1. 切換分支 - git checkout 命令允許我們在分支之間切換。它將你的工作目錄和 HEAD 指標移動到指定的分支。

git checkout [<branch-name>]

2. 檢出到特定提交 - 此命令還可以用於透過其雜湊值檢出到特定提交。這會將你的工作目錄置於 分離的 HEAD 狀態。

git checkout [<commit-hash>]

3. 建立新分支 - 使用以下選項,命令 git checkout -b|-B <new-branch> [<start-point>] 建立並切換到新分支

git checkout -b|-B <new-branch> [<start-point>]
  • -b <new-branch>:這將建立一個名為 <new-branch> 的新分支並切換到它。

    • 這類似於在執行 git branch <new-branch> 後使用 git checkout <new-branch>。

    • 此外,我們可以使用 --track 或 --no-track 選項指定新分支是否應該跟蹤遠端分支。

  • -B <new-branch>:如果新分支 <new-branch> 不存在,這將建立它。

    • 如果找到該分支,則該分支將重置為給定的 <start-point>。

    • 作為事務性操作,此選項只有在 git checkout(分支切換)成功的情況下才會重置或建立分支。

4. 恢復檔案 - git checkout 命令可用於將特定檔案恢復到特定提交中的先前狀態。這對於撤消更改而不影響專案的其他部分非常有用。

git checkout HEAD -- samplefile.txt

5. 跟蹤遠端分支 - Git 將生成一個跟蹤遠端分支的新本地分支。

git checkout -b <branch> --track <remote>/<branch>
  • 它修改 HEAD 以指向指定的分支,並修改我們的工作目錄和索引以匹配給定的 <branch>。

  • 我們可以將本地更改提交到新分支,它們將保持不變。

  • 這類似於執行 git checkout -b <branch> --track <remote>/<branch>。

    如果 <branch> 在本地不存在,但識別到同名的遠端分支並且未指定 --no-guess

  • 如果沒有提供分支,則該命令實際上在分支切換方面不會完成任何操作,但如果可用,它將顯示當前分支的跟蹤資訊。

6. 分離分支 - 使用命令 git checkout --detach [<branch>]git checkout [--detach] <commit>,我們可以將 HEAD 分離到特定提交併對其進行操作。這意味著:

git checkout --detach [<branch>]
git checkout [--detach] <commit>
  • 如果 <commit> 是分支名稱:--detach 檢查分支,但在分支的頂端,它會分離 HEAD

  • 如果 <commit> 是提交雜湊:它會保持任何本地修改不變,並在指定的提交處分離 HEAD,更新我們的工作目錄和索引以反映該提交。

  • 省略 <branch>:在當前分支的頂端分離 HEAD

7. 覆蓋檔案 - 使用不同的引數使用 git checkout 命令時,檔案內容將根據提供的路徑規範被覆蓋。

git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <pathspec>…​
git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] --pathspec-from-file=<file> [--pathspec-file-nul]
  • 在沒有 <tree-ish> 的情況下,索引的內容將更新到工作樹中。

  • 使用 <tree-ish> 時,它會使用指定提交或樹的內容更新工作樹和索引。

  • 如果使用 -f,則可以忽略索引中未合併的元素,否則它將失敗。

  • --ours--theirs 等選項允許我們從索引中檢出未合併路徑的特定版本。

  • 可以使用 -m 選項丟棄更改來恢復衝突的合併結果。

8. 應用更改作為補丁 - git checkout (-p|--patch) [<tree-ish>] [--] [<pathspec>…​] - 我們可以使用該命令互動式地評估和應用來自特定提交或樹的更改。

git checkout (-p|--patch) [<tree-ish>] [--] [<pathspec>…​]
  • 我們可以使用 -p--patch 選項將特定更改塊應用於我們的工作目錄。

  • 這使我們可以精確控制整合到檔案中的修改。

選項

git checkout 命令具有以下選項:

-q

--quiet

  • 使用 -q--quiet 選項時,Git 會停用命令輸出和反饋訊息。

  • 因此,命令以很少的輸出執行,僅提供問題或必要資訊——沒有進一步的訊息或狀態更新。

--progress

--no-progress

  • --progress--no-progress 標誌管理 Git 命令中進度狀態的報告。

  • --progress:要求即使未連線到終端,也要在標準錯誤流上提供進度狀態。

  • --no-progress:關閉輸出設定和與終端附件相關的進度報告。

--ours

--theirs

  • 這些選項允許我們在從索引中檢出路徑時,從階段 #2(--ours)或階段 #3(--theirs)選擇未合併路徑的檔案版本。

  • 變基上下文:使用 git rebasegit pull --rebase 時,我們正在變基到的分支(共享規範歷史記錄)由 --ours 表示。

    而我們當前正在處理的分支(各個貢獻者的工作)由 --theirs 表示。

  • 變基合併來自我們分支的修改,並將遠端歷史記錄視為權威的,這導致了這種區別。

-b <new-branch>

  • 在 Git 中,-b <new-branch> 選項完成以下任務:

    • 建立新的分支 {<new-branch>}。

    • <start-point>(可以是提交或其他引用)是新分支的起始位置。

    • 透過切換到它,使最近生成的分支成為我們工作目錄中的活動分支。

-B <new-branch>

  • 使用 Git 的 -B <new-branch> 選項可以實現以下目標:

    • 它從 <start-point> 開始,並建立一個名為 <new-branch> 的新分支。

      如果該分支已存在,它會將其重置為 <start-point>。

    • 我們工作目錄中當前開啟的分支隨後就是新建立或更新的分支。

-t

--track[=(direct|inherit)]

  • 在 Git 中建立新分支時,上游跟蹤配置使用 -t--track[=(direct|inherit)] 選項。

  • 如果未給出 -b,它會根據遠端跟蹤分支的本地部分自動命名新分支。

  • 如果派生的名稱為空或缺少斜槓,則會跳過自動命名,並且可以使用 -b 顯式提供名稱。

--no-track

  • 即使啟用了 branch.autoSetupMerge 配置變數,它也能確保。

  • 這通常會預設設定跟蹤,新分支將不會設定任何 上游 跟蹤配置。

--guess

--no-guess

  • --guess:預設情況下,如果 <branch> 在本地未發現但在恰好一個遠端中存在,則 Git 會自動建立並使用該遠端跟蹤分支。

    當分支存在於多個遠端時,Git 使用 checkout.defaultRemote 提供的遠端來解決歧義。

  • --no-guess:停用自動猜測行為,這意味著如果本地未找到分支,Git 將不會從遠端位置自動構建或跟蹤它。

    可以使用 checkout.guesscheckout.defaultRemote 設定更改預設行為。

-l

  • Git 中的 -l 選項確保在建立新分支時新增 reflog。

  • reflog 會跟蹤分支的更新歷史記錄,這對於監控修改和糾正錯誤非常有用。

-d

--detach

  • -d--detach 檢查提交而不是分支,允許在不影響任何分支的情況下進行檢查或測試。

  • git checkout <commit> 使用提交而不是分支名稱時,這是預設值。

--orphan <new-branch>

  • <start-point> 建立一個新的、無提交的分支 <new-branch>

  • 新的、孤立的歷史記錄將從該分支上的第一次提交開始。

  • 調整索引和工作樹以匹配 <start-point> 為新提交或新專案提供了一個新的起點。

  • 這在使用白板啟動專案或建立全新的歷史記錄時非常有用。

--ignore-skip-worktree-bits

  • 此選項保證在使用稀疏檢出模式時,git checkout -- <paths> 會更新 <paths> 中所有指定的檔案,同時帶回任何被跳過的檔案並忽略稀疏檢出模式。

-m

--merge

  • --m,也稱為 --merge:此選項允許我們即使存在本地更改也能交換分支,方法是在目標分支、我們的工作樹和當前分支之間完成三方合併。

  • 出現的衝突會保持獨立,需要手動解決。

  • 從索引中檢出路徑時,此選項還允許重建衝突的合併;但是,它不能與 tree-ish 一起使用。

  • 使用 --merge 時,請記住可能會丟失暫存的修改。

--conflict=<style>

  • 此選項的工作方式類似於--merge,不同之處在於它允許我們選擇用於呈現衝突部分的樣式。

  • 三個樣式,"merge"(預設)、"diff3""zdiff3"是可以覆蓋merge.conflictStyle設定的值。

--patch

  • 基於工作樹和<tree-ish>(或索引)之間的差異,啟用互動式選擇塊。

  • 透過反向將選定的塊應用於工作樹(以及給定的索引),可以有選擇地丟棄編輯。

  • 此選項不支援疊加模式,預設情況下以非疊加模式執行。

--ignore-other-worktrees

  • 由於--ignore-other-worktrees,即使另一個工作樹已檢出該引用,也允許許多工作樹使用該引用,從而允許git checkout繼續進行。

--overwrite-ignore

--no-overwrite-ignore

  • --overwrite-ignore:切換分支時,靜默覆蓋被忽略的檔案(預設行為)。

  • --no-overwrite-ignore:如果在新分支中發現被忽略的檔案,則停止分支切換。

--recurse-submodules

  • 使用--recurse-submodules命令更新每個活動子模組,使其與超專案中記錄的提交相匹配。

    如果子模組中的本地更改被覆蓋並且也沒有使用-f,則檢出將失敗。

  • --no-recurse-submodules:不修改子模組的工作樹;子模組保持不變。

--overlay

  • --overlay:預設模式,其中git checkout不會刪除索引或工作樹中的檔案。

  • --no-overlay:刪除工作樹和索引中不屬於<tree-ish>的檔案,確保它們完全匹配。

從 Git 2.23 開始,git checkout已拆分為更具體的命令

git switch(用於切換分支)。點選這裡瞭解更多詳情。

git restore(用於恢復檔案)。點選這裡瞭解更多詳情。

廣告