Command Reference

git checkout 教程

说明 git checkout 作为旧式多用途命令的两大职责,以及它与 switch、restore 的现代分工。

适合谁看
  • 已经会基本提交和分支操作的开发者
  • 想理解命令边界与风险的人
前置知识
  • 知道工作区、暂存区、提交的基本关系
  • 能读懂 `git status` 和简单历史图
常见风险
  • 误把本地整理命令用到共享历史
  • 在没确认恢复路径前直接继续改写历史

一句话理解

git checkout 是 Git 里的经典多用途命令,既能切分支,也能把路径恢复到指定状态。

为什么它现在看起来有点“重”

正因为它承担了两类不同职责,所以新版本 Git 才引入了 git switchgit restore 来拆分语义。

旧式但仍然常见的两种用法

切换分支

git checkout main
git checkout -b feature/login

恢复路径

git checkout -- README.md

这会把工作区里的该文件恢复到索引版本,效果上接近今天的 git restore README.md

checkout 某个提交

git checkout <commit>

这样会让你进入 detached HEAD 状态,适合查看历史,但如果你继续提交并希望保留结果,就要尽快创建分支。

什么时候还需要理解 checkout

  • 维护老项目或老脚本
  • 阅读旧教程和团队历史文档
  • 理解 switch / restore 是从哪里拆出来的

checkout 和新命令的关系

  • git switch 继承了“切分支”这部分职责
  • git restore 继承了“恢复路径”这部分职责

所以今天你仍然应该会读懂 checkout,但在教学和日常表达上,通常优先用更明确的新命令。

常见风险

如果你用 checkout 恢复路径,本地改动可能被直接覆盖;如果你 checkout 到某个提交而忘记自己处在 detached HEAD,也容易在后面弄丢实验性提交。

这条命令在流程里解决什么问题

git checkout 是旧式多用途命令,同时承担"切换分支"和"恢复路径"两类职责。它会同时影响工作区和 HEAD 引用——切换分支时替换工作区文件并移动当前引用,恢复路径时用索引或指定提交覆盖工作区中的文件。

典型用例

  • 切换到已有分支或创建新分支(git checkout <branch> / git checkout -b <new>),同时更新工作区文件以匹配目标分支。
  • 恢复文件到索引版本(git checkout -- <path>),丢弃工作区中的未暂存改动——这是现代 git restore 的前身。
  • 检出某个历史提交进入 detached HEAD 状态,适合临时查看历史或进行实验。

图例理解

checkout 的双职责路径checkout 既可以改变 HEAD 引用(切分支),也可以只恢复路径内容(恢复文件),具体行为取决于参数。
输入
分支/提交引用路径(可选)索引或 HEAD 快照
可能变化
HEAD 引用指向工作区文件内容detached HEAD 状态
正因为它同时负责两件事,新版本 Git 才引入了 switch(切分支)和 restore(恢复路径)来拆分职责。

特殊情况与边界

  • git checkout 恢复路径时,本地未暂存的改动会被直接覆盖且无法恢复,操作前务必确认。
  • checkout 到某个提交后进入 detached HEAD,如果继续提交又忘记创建分支,这些实验性提交很容易丢失。
  • 当参数可能是分支名也可能是路径名时,用 -- 分隔符消除歧义:git checkout -- <path>
  • 工作区有未提交改动时切换分支,Git 会拒绝以避免覆盖——需要先提交、stash 或丢弃改动。