簡體中文 ▾ 主題 ▾ 最新版本 ▾ git-switch 最後更新於 2.50.0

名稱

git-switch - 切換分支

概要

git switch [<options>] [--no-guess] <branch>
git switch [<options>] --detach [<start-point>]
git switch [<options>] (-c|-C) <new-branch> [<start-point>]
git switch [<options>] --orphan <new-branch>

描述

切換到指定分支。工作區和索引會更新以匹配該分支。所有新提交將新增到此分支的頂部。

可以選擇使用 -c-C 來建立新分支,或者自動從同名遠端分支建立(參見 --guess),或者使用 --detach 將工作區與任何分支分離,同時進行切換。

切換分支不需要乾淨的索引和工作區(即與 HEAD 沒有差異)。但如果操作導致本地更改丟失,則操作會被中止,除非使用 --discard-changes--merge 另行指定。

此命令是實驗性的。其行為可能會發生變化。

選項

<branch>

要切換到的分支。

<new-branch>

新分支的名稱。

<start-point>

新分支的起始點。指定 <start-point> 允許您建立一個基於歷史中某個其他點的分支,而不是 HEAD 當前指向的點。(或者,在使用 --detach 的情況下,允許您檢查並從其他點分離。)

您可以使用 @{-<N>} 語法來引用使用 git switchgit checkout 操作切換到的倒數第 <N> 個分支/提交。您也可以指定 -,它等同於 @{-1}。這通常用於在兩個分支之間快速切換,或撤銷錯誤的分支切換。

作為一種特殊情況,如果存在且只有一個合併基礎,您可以使用 <rev-a>...<rev-b> 作為 <rev-a><rev-b> 的合併基礎的快捷方式。您最多可以省略 <rev-a><rev-b> 中的一個,在這種情況下它預設為 HEAD

-c <new-branch>
--create <new-branch>

在切換到新分支之前,從 <start-point> 建立一個名為 <new-branch> 的新分支。這等同於事務性的

$ git branch <new-branch>
$ git switch <new-branch>

也就是說,除非 git switch 成功(例如,當該分支在另一個工作區中使用時,不僅當前分支保持不變,而且該分支也不會被重置到起始點),否則分支不會被重置/建立。

-C <new-branch>
--force-create <new-branch>

--create 類似,不同之處在於如果 <new-branch> 已經存在,它將被重置到 <start-point>。這是以下命令的便捷快捷方式:

$ git branch -f _<new-branch>_
$ git switch _<new-branch>_
-d
--detach

切換到某個提交以進行檢查和可丟棄的實驗。詳情請參閱 git-checkout[1] 中的“分離 HEAD”部分。

--guess
--no-guess

如果找不到 <branch> 但在恰好一個遠端(稱之為 <remote>)中存在一個匹配名稱的跟蹤分支,則將其視為等同於

$ git switch -c <branch> --track <remote>/<branch>

如果分支存在於多個遠端中,並且其中一個由 checkout.defaultRemote 配置變數命名,我們將使用該遠端進行消歧,即使 <branch> 在所有遠端中不是唯一的。將其設定為例如 checkout.defaultRemote=origin,以便當 <branch> 模糊但存在於 origin 遠端上時,始終從那裡檢出遠端分支。另請參閱 git-config[1] 中的 checkout.defaultRemote

--guess 是預設行為。使用 --no-guess 停用它。

預設行為可以透過 checkout.guess 配置變數設定。

-f
--force

--discard-changes 的別名。

--discard-changes

即使索引或工作區與 HEAD 不同,也繼續進行。索引和工作區都將被恢復以匹配切換目標。如果指定了 --recurse-submodules,子模組內容也將被恢復以匹配切換目標。這用於丟棄本地更改。

-m
--merge

如果您對一個或多個檔案進行了本地修改,這些檔案在當前分支和您要切換到的分支之間有所不同,該命令會拒絕切換分支以保留您的修改。但是,使用此選項,將進行當前分支、您的工作區內容和新分支之間的三方合併,然後您將處於新分支上。

當發生合併衝突時,衝突路徑的索引條目將保持未合併狀態,您需要解決衝突並使用 git add(如果合併應導致路徑刪除,則使用 git rm)標記已解決的路徑。

--conflict=<style>

與上面的 --merge 選項相同,但會更改衝突塊的呈現方式,覆蓋 merge.conflictStyle 配置變數。可能的值為 merge(預設)、diff3zdiff3

-q
--quiet

安靜模式,抑制反饋訊息。

--progress
--no-progress

預設情況下,當標準錯誤流連線到終端時,會報告進度狀態,除非指定了 --quiet。此標誌即使在未連線到終端時也啟用進度報告,無論 --quiet 如何。

-t
--track[ (direct|inherit)]

建立新分支時,設定“上游”配置。隱含 -c。詳細資訊請參閱 git-branch[1] 中的 --track

如果沒有給出 -c 選項,新分支的名稱將從遠端跟蹤分支派生,方法是檢視為相應遠端配置的引用規範的本地部分,然後剝離直到“*”的初始部分。這將告訴我們在從 origin/hack(或 remotes/origin/hack,甚至 refs/remotes/origin/hack)分支出來時使用 hack 作為本地分支。如果給定的名稱沒有斜槓,或者上述猜測導致空名稱,則猜測中止。在這種情況下,您可以使用 -c 顯式提供一個名稱。

--no-track

不設定“上游”配置,即使 branch.autoSetupMerge 配置變數為 true。

--orphan <new-branch>

建立一個名為 <new-branch> 的新的未誕生分支。所有被跟蹤的檔案都將被移除。

--ignore-other-worktrees

git switch 會拒絕切換到已被其他工作區檢出的引用。此選項使其無論如何都檢出該引用。換句話說,該引用可以被多個工作區持有。

--recurse-submodules
--no-recurse-submodules

使用 --recurse-submodules 將根據超級專案中記錄的提交更新所有活動子模組的內容。如果沒有(或使用 --no-recurse-submodules),子模組的工作區將不會更新。就像 git-submodule[1] 一樣,這會使子模組的 HEAD 分離。

示例

以下命令切換到“master”分支:

$ git switch master

在錯誤分支上工作後,切換到正確分支將使用:

$ git switch mytopic

然而,您的“錯誤”分支和正確的“mytopic”分支可能在您本地修改的檔案上有所不同,在這種情況下,上述切換將失敗,如下所示:

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

您可以向命令提供 -m 標誌,這將嘗試進行三方合併:

$ git switch -m mytopic
Auto-merging frotz

在此三方合併之後,本地修改並在您的索引檔案中註冊,因此 git diff 將顯示您自新分支頂端以來所做的更改。

要切換回我們切換到 mytopic 之前的分支(即“master”分支):

$ git switch -

您可以從任何提交中建立一個新分支。例如,切換到“HEAD~3”並建立分支“fixup”:

$ git switch -c fixup HEAD~3
Switched to a new branch 'fixup'

如果您想從同名遠端分支開始一個新分支:

$ git switch new-topic
Branch `new-topic` set up to track remote branch `new-topic` from `origin`
Switched to a new branch `new-topic`

在不建立新分支的情況下,檢出提交 HEAD~3 以進行臨時檢查或實驗:

$ git switch --detach HEAD~3
HEAD is now at 9fc9555312 Merge branch 'cc/shared-index-permbits'

如果發現您所做的任何事情都值得保留,您總是可以為其建立一個新名稱(無需切換):

$ git switch -c good-surprises

配置

本節中以下所有內容均從 git-config[1] 文件中選擇性地包含。內容與彼處相同:

checkout.defaultRemote

當您執行 git checkout <something>git switch <something> 且只有一個遠端時,它可能會隱式回退到檢出和跟蹤例如 origin/<something>。一旦您有多個具有 <something> 引用的遠端時,此功能就會停止工作。此設定允許設定首選遠端的名稱,在消歧時該遠端應始終獲勝。典型的用例是將其設定為 origin

目前,git-switch[1]git-checkout[1]git checkout <something>git switch <something> 將檢出另一個遠端上的 <something> 分支時使用此功能,並且 git-worktree[1]git worktree add 引用遠端分支時也使用此功能。此設定將來可能會用於其他類似檢出的命令或功能。

checkout.guess

git checkoutgit switch 中的 --guess--no-guess 選項提供預設值。參見 git-switch[1]git-checkout[1]

checkout.workers

更新工作區時使用的並行工作程序數量。預設值為一,即順序執行。如果設定為小於一的值,Git 將使用與可用邏輯核心數一樣多的工作程序。此設定和 checkout.thresholdForParallelism 影響所有執行檢出操作的命令。例如:checkout、clone、reset、sparse-checkout 等。

注意
並行檢出通常在位於 SSD 或透過 NFS 訪問的倉庫中提供更好的效能。對於位於旋轉磁碟和/或核心數量較少的機器上的倉庫,預設的順序檢出通常效能更好。倉庫的大小和壓縮級別也可能影響並行版本的效能。
checkout.thresholdForParallelism

當以少量檔案執行並行檢出時,子程序生成和程序間通訊的開銷可能超過並行化的收益。此設定允許您定義應嘗試並行檢出的最小檔案數。預設值為 100。

GIT

Git[1] 套件的一部分

scroll-to-top