- 已经会基本提交和分支操作的开发者
- 想理解命令边界与风险的人
Command Reference
git checkout 教程
说明 git checkout 作为旧式多用途命令的两大职责,以及它与 switch、restore 的现代分工。
- 知道工作区、暂存区、提交的基本关系
- 能读懂 `git status` 和简单历史图
- 误把本地整理命令用到共享历史
- 在没确认恢复路径前直接继续改写历史
一句话理解
git checkout 是 Git 里的经典多用途命令,既能切分支,也能把路径恢复到指定状态。
为什么它现在看起来有点“重”
正因为它承担了两类不同职责,所以新版本 Git 才引入了 git switch 和 git 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 状态,适合临时查看历史或进行实验。
图例理解
分支/提交引用路径(可选)索引或 HEAD 快照
HEAD 引用指向工作区文件内容detached HEAD 状态
正因为它同时负责两件事,新版本 Git 才引入了 switch(切分支)和 restore(恢复路径)来拆分职责。
特殊情况与边界
- 用
git checkout恢复路径时,本地未暂存的改动会被直接覆盖且无法恢复,操作前务必确认。 - checkout 到某个提交后进入 detached HEAD,如果继续提交又忘记创建分支,这些实验性提交很容易丢失。
- 当参数可能是分支名也可能是路径名时,用
--分隔符消除歧义:git checkout -- <path>。 - 工作区有未提交改动时切换分支,Git 会拒绝以避免覆盖——需要先提交、stash 或丢弃改动。