git checkout 和 git switch 的区别:新手该用哪个
git checkout 身兼数职容易混淆,Git 2.23 推出了更清晰的 git switch 和 git restore。本文讲清 switch/restore/checkout 的分工,以及为什么新项目推荐用 switch。
场景:你常看到两种写法切分支——git checkout 和 git switch,想知道区别、该用哪个。这背后其实是 Git 一次重要的命令重构。
背景:checkout 太"万能"了
老版 git checkout 一个命令干了好几件事,容易混淆:
git checkout main # 切分支
git checkout -b new # 建分支并切换
git checkout 某文件.txt # 恢复文件(?!)
git checkout 某提交 # 检出历史提交
同一个词既能切分支、又能恢复文件,初学易错。于是 Git 2.23 拆分成两个职责单一的命令:
新命令分工
| 命令 | 职责 |
|---|---|
git switch | 只负责切换/创建分支 |
git restore | 只负责恢复文件/暂存区 |
git switch main # 切分支(等价 checkout main)
git switch -c new # 建并切(等价 checkout -b new)
git restore 某文件.txt # 恢复文件(等价 checkout -- 某文件)
常用对照表
| 想做的事 | 新写法 | 旧写法 |
|---|---|---|
| 切换分支 | git switch 分支 | git checkout 分支 |
| 创建并切换 | git switch -c 分支 | git checkout -b 分支 |
| 切换到上次分支 | git switch - | git checkout - |
| 从远程拉新分支并切换 | git switch -c 分支 origin/分支 | git checkout -b 分支 origin/分支 |
| 恢复工作区文件 | git restore 文件 | git checkout -- 文件 |
| 取消暂存 | git restore --staged 文件 | git reset HEAD 文件 |
新手建议:用 switch 切分支
# 推荐日常
git switch main
git switch -c feature/login
# 查看分支
git branch
git switch - # 快速回上一个分支
保留 checkout 的场景
checkout 并未废弃,仍有 switch 不具备的用法:
git checkout 某提交哈希 # 检出历史提交(游离状态,switch 不支持)
git checkout 标签名 # 检出标签
需要检出具体提交/标签时,仍用 checkout。
常见问题
- 提示 Unknown switch 或无法识别:Git 版本太老,升级或改用 checkout。
- 想切换但工作区有未提交改动:Git 会阻止切换到冲突分支,先
git stash或提交。 - IDE 里显示的是 checkout 还是 switch:很多工具内部仍用 checkout,不影响你命令行习惯。
一句话速记
Git 2.23+ 用 git switch 切分支、git restore 恢复文件;旧版/检出提交仍用 git checkout。
?
常见问题 FAQ
git switch 和 git checkout 都能切换分支吗?
都能。但 checkout 除了切分支还能恢复文件、切换 commit,职责过多易误用。switch 只专注"切换分支",语义更清晰,是 Git 2.23+ 推荐写法。
我的 Git 版本不支持 switch 怎么办?
switch 需要 Git 2.23+(2019年8月发布)。老版本用 git checkout 代替,功能一样。可用 git --version 查看版本。
git switch -c 和 git checkout -b 区别?
等价,都是"创建并切换新分支"。switch -c 是新写法,checkout -b 是旧写法,效果相同。
想恢复被误删/误改的文件该用哪个命令?
用 git restore 文件(新)或 git checkout -- 文件(旧)。restore 专门负责恢复文件,不再和切分支混淆。切分支用 switch,恢复文件用 restore。