分支操作
分支讓你在獨立線上開發,做完再合回 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
切換到已存在的分支:
建立新分支並立刻切過去(-c 是 --create 的縮寫):
從指定的起點開分支,例如從遠端最新的 main 開始:
回到上一個所在的分支(不必記名稱,來回切換很方便):
舊方式:git checkout
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 還原成暫存區的內容:
如果本意是切分支、卻打成檔名,你可能不知不覺丟掉檔案的修改。switch 只接受分支,給它檔名會直接拒絕:
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 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。
相關影音
情境題:忘了開分支
改到一半才發現還在 main 上時該怎麼補救。這部影片是 2020 年製作,示範若出現 git checkout -b,照上面的對照表換成 git switch -c 即可。
更多分支相關影片見 影音教學:分支專題。官方文件:git switch、git checkout。