Git Switch 创建并切换分支
git switch 命令的用法,重点是 -c 创建新分支并携带未提交改动。
#type / howto
#status / growing
#tech / ops
#resource / git
[!info] related notes
Git Switch 创建并切换分支
一句话定义
git switch 是 Git 后来新增的命令,专门用来切换分支,从 checkout 中拆分出来,语义更清晰。git switch -c 创建新分支并立即切换过去。
git switch vs git checkout
以前大家常用 git checkout dev 切分支,但 checkout 功能太多——既能切分支,又能恢复文件,语义混乱。所以 Git 拆出了两个命令:
git switch # 切换分支
git restore # 恢复文件
所以 git switch dev 大致等价于 git checkout dev。
基本操作
# 切换到已有分支
git switch dev
# 创建并切换到新分支
git switch -c feature/login
# 等价于:git checkout -b feature/login
# 也等价于:git branch feature/login && git switch feature/login
# 基于指定分支创建新分支
git switch -c feature/login main
git switch -c feature/login origin/main
# 强制创建并切换(如果分支已存在则重置)
git switch -C feature/login
未提交改动会一起”带过去”吗?
会。 但这不是 Git 把改动复制到了新分支,而是这些改动本来还没提交,不属于任何分支——切换分支后它们自然还留在工作区。
# 当前状态
git status
# On branch main
# Changes not staged for commit:
# modified: src/App.tsx
# Untracked files:
# src/test.ts
git switch -c feature/app-refactor
git status
# On branch feature/app-refactor
# Changes not staged for commit:
# modified: src/App.tsx
# Untracked files:
# src/test.ts
以下内容都会保留:
- 已修改但未暂存的文件
- 已暂存(
git add)但未提交的文件 - 未跟踪的新文件
最典型使用场景
在 main 上随手改了点东西,突然意识到不该直接在 main 上做:
git status
# On branch main
# modified: src/api.ts
# modified: src/App.tsx
git switch -c feature/api-refactor
git add .
git commit -m "refactor api logic"
# 提交落在 feature/api-refactor 上,而不是 main 上
什么时候会失败?
如果未提交改动和目标分支有冲突,Git 可能拒绝切换:
git switch existing-branch
# error: Your local changes to the following files would be overwritten by checkout:
# src/config.ts
# Please commit your changes or stash them before you switch branches.
注意:git switch -c new-branch 基于当前提交创建新分支,冲突概率很低。更容易出问题的是切到一个已存在的、代码状态不同的分支。
git switch -c vs git branch
git branch feature/login # 只创建分支,不切过去
git switch -c feature/login # 创建并切过去
git switch -c vs git checkout -b
git switch -c feature/login # 推荐:语义清晰
git checkout -b feature/login # 效果相同,但 checkout 历史包袱多
现在更推荐用 git switch + git restore,而不是把所有事情都交给 checkout。
常见误区
- 不是”复制”到新分支:未提交改动不属于任何分支,切换后自然留在工作区
-c小写 vs-C大写:小写-c创建新分支(已存在会报错),大写-C强制重置已存在的分支指针- 切到已有分支可能失败:未提交改动与目标分支冲突时会被拒绝,需要先
commit或stash - 暂存区内容也会保留:
git add过但未commit的内容同样跟着走