跳轉至

建立 2024-01-01 更新 2026-09-19

分支操作

分支讓你在獨立線上開發,做完再合回 main。切換與建立分支,現在請優先用 git switch;舊的 git checkout 仍然能用,網路上大多數舊教學也是它。這一頁先給結論,再說明兩者差在哪,讓你看到舊教學時知道怎麼換。

新舊指令對照

想做的事 舊方式(checkout) 新方式(switch)
切換到既有分支 git checkout <分支> git switch <分支>
建立並切換 git checkout -b <新分支> git switch -c <新分支>
從指定起點建立並切換 git checkout -b <新分支> <起點> git switch -c <新分支> <起點>
強制重設同名分支並切換 git checkout -B <分支> git switch -C <分支>
切回上一個分支 git checkout - git switch -
檢視某個 commit/tag(分離 HEAD) git checkout <commit> git switch --detach <commit>
還原單一檔案 git checkout -- <檔案> 不是 switch 的工作,改用 git restore <檔案>

新指令是 Git 2.23(2019 年 8 月) 加入的。先用 git --version 確認版本;更早的版本只能用 checkout。

新方式:git switch

切換到已存在的分支:

git switch <分支名稱>

建立新分支並立刻切過去(-c 是 --create 的縮寫):

git switch -c <新分支名稱>

從指定的起點開分支,例如從遠端最新的 main 開始:

git switch -c feature/login origin/main

回到上一個所在的分支(不必記名稱,來回切換很方便):

git switch -

舊方式:git checkout

git checkout <分支名稱>          # 切換
git checkout -b <新分支名稱>     # 建立並切換

checkout 的名字是「簽出」,本意是把某個版本的內容取出到工作區。因此它同時包辦了四件不同的事:切換分支、建立分支、還原檔案、檢視舊 commit。這是它的歷史包袱,也是它最容易出事的地方。

新舊的差別

Git 2.23 把 checkout 一分為二,各管一件事:

graph LR
    A["git checkout(一個指令做四件事)"] --> B["git switch<br/>切換/建立分支"]
    A --> C["git restore<br/>還原檔案"]
    A --> D["git switch --detach<br/>檢視舊 commit/tag"]

1. 同一個指令,意思取決於你給的參數。 checkout 看到參數時要「猜」你要切分支還是還原檔案。假設資料夾裡有個 a.txt,下面這行不會切換任何分支,而是把 a.txt 還原成暫存區的內容:

git checkout a.txt
# Updated 0 paths from the index

如果本意是切分支、卻打成檔名,你可能不知不覺丟掉檔案的修改。switch 只接受分支,給它檔名會直接拒絕:

git switch a.txt
# fatal: invalid reference: a.txt

2. 分離 HEAD 要明講。 對 checkout 而言,給它 tag 或 commit 就會進入「分離 HEAD(detached HEAD)」狀態,也就是不在任何分支上。此時新增的 commit 沒有分支指著,切走後容易找不到。switch 要你加上 --detach 才會這樣做,忘了加就會停下來提醒:

git switch v1.0
# fatal: a branch is expected, got tag 'v1.0'
# hint: If you want to detach HEAD at the commit, try again with the --detach option.

3. 名稱更好懂。 -b(branch)與 -c(create)功能一樣,但 switch -c 一看就知道是「建立」。switch 也有 --create 這個完整寫法。

4. 沒有差別的部分。 下列行為兩者相同,不必擔心換指令會變危險:

  • 有未提交的修改會被覆蓋時,兩者都會拒絕切換,並要你先 commit 或 stash。要帶著修改切走,可加 -m(--merge);要丟掉修改才用 -f(--discard-changes),請謹慎。
  • 若遠端剛好只有一個同名分支,git switch <分支> 會自動建立追蹤該遠端分支的本機分支,git checkout <分支> 也是。
  • git checkout 沒有被移除,舊腳本與舊教學照常運作。只是新學的人沒有理由再從它開始。

5. 還原檔案的新指令是 git restore。 想把檔案改回最近一次 commit,或從別的分支取回某個檔案:

git restore <檔案>                        # 取消工作區的修改
git restore --source=<分支> <檔案>        # 從另一個分支取回該檔案

更多復原情境見 復原修改。

一句話記法

切分支用 git switch,還原檔案用 git restore,各做一件事。看到舊教學的 git checkout,照上面的對照表換掉即可。

常見流程

git branch                          # 列出本機分支,* 為目前所在
git switch -c feature/new-feature   # 開分支並切過去
git switch main                     # 回到 main
git branch -d feature/new-feature   # 已合併才用 -d;強制刪除用 -D
git push -u origin feature/new-feature

推送新分支時記得加 -u,之後這條分支才能直接 git push/git pull。合併方式見 git merge。

相關影音

情境題:忘了開分支

高見龍「啊,我忘記開分支了!」 來源:為你自己學 Git

改到一半才發現還在 main 上時該怎麼補救。這部影片是 2020 年製作,示範若出現 git checkout -b,照上面的對照表換成 git switch -c 即可。

更多分支相關影片見 影音教學:分支專題。官方文件:git switch、git checkout。