git checkout 和 git switch 都可以用于切换分支,但它们的设计目的不同。
一句话理解
- checkout:老命令,功能很多(切换分支、恢复文件、创建分支等)。
- switch:新命令(Git 2.23+),专门用于切换分支,语义更清晰。
官方也推荐新用户优先使用 switch。
1. 切换已有分支
假设当前分支:
git branch
输出:
* dev
main
test
切换到 main:
checkout写法
git checkout main
switch写法(推荐)
git switch main
效果完全一样。
2. 创建并切换到新分支
创建 feature/login 分支并切换过去。
checkout写法
git checkout -b feature/login
switch写法(推荐)
git switch -c feature/login
说明:
-b == 创建分支
-c == create
3. 切换到上一个分支
例如:
main -> dev
然后想回到 main。
checkout
git checkout -
switch
git switch -
效果一样。
4. checkout容易让新手困惑
例如:
git checkout test
你可能以为:
切换到 test 分支
但如果项目里恰好存在一个文件:
test
Git有时会理解成:
恢复文件 test
容易产生歧义。
5. switch不存在歧义
git switch test
Git明确知道:
我要切换分支
不会被理解成文件操作。
6. 为什么Git后来增加了switch
因为原来的 checkout 承担了太多职责:
git checkout main # 切换分支
git checkout -b dev # 创建分支
git checkout file.txt # 恢复文件
git checkout HEAD~1 a.py # 恢复指定版本文件
一个命令干了很多事。
Git 2.23 开始拆分:
| 功能 | 新命令 |
|---|---|
| 切换分支 | git switch |
| 恢复文件 | git restore |
例如:
旧写法:
git checkout a.py
新写法:
git restore a.py
7. 实际工作推荐
如果你的 Git 版本较新(Git ≥ 2.23):
git switch main
git switch dev
git switch -c feature_xxx
如果是一些老服务器、老 CI 环境:
git checkout main
git checkout -b feature_xxx
因为所有 Git 版本都支持 checkout。
GitLab 合并冲突场景推荐
假设你当前在功能分支:
feature/test
想先同步 main 最新代码再解决冲突:
# 切到main
git switch main
# 更新main
git pull origin main
# 切回功能分支
git switch feature/test
# 合并main
git merge main
如果你的服务器 Git 版本较老,则全部替换为:
git checkout main
git pull origin main
git checkout feature/test
git merge main
这两套命令效果完全一致。