Skip to content

Git checkout、switch 与 restore 的用法与区别

  • 状态:已验证
  • 来源:对话整理
  • 更新时间:2026-03-19

关键结论

  • git checkout 是多功能历史命令,不推荐作为日常主力命令。
  • git switch 专用于分支切换,语义清晰,适合日常使用。
  • git restore 专用于文件恢复,替代 checkout 的文件操作场景。
  • 在工程实践中,应把分支操作和文件操作彻底分离。
  • 本条目只讨论命令职责拆分和基本用法,不展开本地分支删除 warning 或远程跟踪分支的概念。

详细分析

  • git checkout 同时承担多种职责,包括:
    • 分支切换
    • 文件恢复
    • 创建分支
  • 由于参数形式相近,checkout 容易把“切分支”和“恢复文件”混淆,误操作风险更高。
  • Git 2.23 引入 switchrestore,本质是把 checkout 的职责拆分:
    • switch 只处理分支切换
    • restore 只处理工作区和暂存区内容恢复
  • switchrestore 的价值不只是语法更短,而是把命令意图显式化,降低认知负担。
  • 在老版本 Git 或旧脚本中,checkout 仍可能需要保留,但新项目应优先采用拆分后的命令。
  • 如果你正在排查“分支删除时为什么提示 merged to remote but not HEAD”,应查看 branch.md,而不是在本条目里继续推导删除逻辑。

可执行步骤

  1. 使用 git switch main 切换到目标分支。
  2. 使用 git switch -c feature 创建并切换到新分支。
  3. 使用 git switch - 切换到上一个分支。
  4. 使用 git restore file.c 恢复工作区文件。
  5. 使用 git restore --staged file.c 从暂存区移除文件改动。

命令 / 配置 / 代码

旧写法,不推荐:

bash
git checkout main
git checkout -b feature
git checkout -- file.c

新写法,推荐:

bash
git switch main
git switch -c feature
git restore file.c
git restore --staged file.c

风险与注意事项

  • git checkout file 可能覆盖未提交修改。
  • git restore 默认会覆盖工作区内容,使用前要确认目标文件。
  • 老版本 Git(低于 2.23)不支持 switchrestore
  • CI 脚本或遗留工具链中仍可能需要保留 checkout
  • 分支删除、远程跟踪分支和 HEAD 判定属于不同主题,不要继续在本条目中扩展。