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 强制重置已存在的分支指针
  • 切到已有分支可能失败:未提交改动与目标分支冲突时会被拒绝,需要先 commitstash
  • 暂存区内容也会保留git add 过但未 commit 的内容同样跟着走
创建于 2026/7/8 更新于 2026/7/15