git checkout 是 Git 的老牌「多面手」:既能切分支,又能恢复文件,还能检出某个历史版本的文件内容。正因为职责太重,Git 2.23 起官方把它的能力拆给了 git switch 和 git restore。

新脚本建议用新命令,但维护旧项目、读老教程、写 CI 时仍会大量遇到它。本文把 git checkout 的常用参数按「切分支 / 恢复文件 / 处理冲突」三类列出并解说。

ℹ️
关于本系列
本文是《Git 使用教程》按命令拆分的第 20 / 28 篇,全部收录在 Git 栏目。参数表列的是日常高频项,并非穷举;想看某个命令的完整参数,用 git checkout -h 看精简列表、git help checkout 看完整手册。示例以 Git 2.56.0 为准。

一、命令语法

先看语法骨架,再对照下一节的参数表。<占位> 表示必填值,实际输入时不要带尖括号;[...] 表示可选项,-- 用来分隔选项与路径。

bash语法
git checkout [<branch>]                       # 切分支
git checkout -b <new-branch> [<start-point>]  # 新建并切换
git checkout [<tree-ish>] -- <pathspec>...    # 恢复文件
git checkout --ours/--theirs -- <pathspec>    # 冲突时选一边

二、参数逐项详解

下表按用途列出 git checkout 的常用参数,每项都注明了「它到底改变了什么」。

参数作用
<branch>切换到已有分支;本地没有时会按远端同名分支自动创建(自动跟踪)
-b <名字> [<起点>]新建分支并切过去,等价于 git switch -c
-B <名字> [<起点>]分支已存在时强制重置再切,等价于 switch -C
--detach切到提交 / 标签,进入游离 HEAD
--orphan <名字>创建无父提交的全新分支
-t / --track基于远端分支创建本地分支并建立跟踪
-切回上一个分支
-- <pathspec>恢复文件:从索引取内容覆盖工作区,等价于 git restore
<tree-ish> -- <pathspec>从指定提交取文件,等价于 git restore --source=<tree>
--ours / --theirs冲突时取本方 / 对方版本(配合 -- <路径>)
-m / --merge切换时尝试三方合并,保留本地改动
-p / --patch交互式按 hunk 从索引或提交恢复
--conflict=<风格>重建冲突标记,风格 merge / diff3 / zdiff3

三、常用示例

老项目里常见的写法

bash老项目里常见的写法
git checkout main
git checkout -b feature/login
git checkout --
git checkout HEAD~2 -- README.md

换成新命令(推荐)

bash换成新命令(推荐)
git switch main
git switch -c feature/login
git restore .
git restore --source=HEAD~2 -- README.md

冲突时选某一边的版本

bash冲突时选某一边的版本
git checkout --ours -- src/conflict.js
git add src/conflict.js
# 或
git checkout --theirs -- src/conflict.js

四、注意事项

⚠️
最容易出事的地方:路径与分支同名
git checkout foo 在既有 foo 分支又有 foo 文件时会优先切分支,可能不是你想要的。恢复文件时务必加 --:git checkout -- foo。这也是官方拆出 switch / restore 的主要原因。
不用改老脚本也能降低风险: 把所有「切分支」的 checkout 换成 switch、「恢复文件」的换成 restore,checkout 只保留在冲突处理(--ours/--theirs)等少数场景里。

五、小结

git checkout 今天更像一个「历史兼容层」:能不用就不用,但必须看得懂。判断口诀是——动了 HEAD 就是切换,加了 -- 就是恢复文件;新代码里请一律改用 switch 与 restore。

本系列共 28 篇,一个命令一篇,完整目录见 Git 栏目。下一篇:git merge 命令参数详解。