git checkout -b 用于创建新分支并立即切换,如 git checkout -b feature/login;它等价于先 git branch 再 git checkout,但更高效;需注意分支名不可含空格、未提交更改会被继承、同名分支存在时会报错;git 2.23+ 推荐用 git switch -c 替代。

git checkout -b 创建分支并立即切换
这是最常用的一体化操作,比先 git branch 再 git checkout 少敲一次命令,也避免漏切分支导致在错误位置提交。
实际用法:git checkout -b feature/login 会创建名为 feature/login 的新分支,并自动切换过去。注意分支名里不要带空格或特殊符号(斜杠允许,常用于命名空间分类)。
容易踩的坑:
- 如果当前有未提交的修改,
git checkout -b仍能成功,但新分支会继承这些“脏”状态——可能不是你想要的干净起点 - 分支名若已存在,命令直接报错:
fatal: A branch named 'xxx' already exists.,不会覆盖 - Git 2.23+ 推荐改用
git switch -c(见下一条),但checkout -b仍完全可用,不必强切
git switch -c 替代 checkout 的现代写法
git switch 是 Git 2.23 引入的专用分支切换命令,语义更清晰:它只负责“切换”,不承担检出文件、恢复暂存区等额外职责。
创建并切换:git switch -c bugfix/header-align;只切换已有分支:git switch main。
和 checkout 的关键差异:
-
git switch默认拒绝切换到有未提交改动的分支(除非加-f),防止意外覆盖工作区 - 不支持
git switch -b xxx --track origin/xxx这种一键设置上游的写法,得拆成两步:git switch -c xxx→git branch --set-upstream-to=origin/xxx - 如果你用的是旧版 Git(switch 命令不存在,别白试
git checkout xxx 切换分支时的隐性风险
单独用 git checkout 切分支,表面没问题,但容易触发两类意外行为:
- 如果输入的名称既不是本地分支,也不是远程分支,Git 会尝试把它当作文件名去检出——比如误输
git checkout feat/login(少写了-b),而当前恰好有个叫feat/login的文件,Git 就真把它从暂存区还原了,分支没切,文件还被覆盖了 - 切换前若存在未合并的本地提交,且目标分支有同名但不同内容的文件,Git 可能拒绝切换并提示冲突,而不是自动合并——这其实是保护机制,但新手常以为是“命令坏了”
- 用
git checkout切远程分支(如git checkout origin/develop)会进入“分离头指针”状态,后续提交无法归属到任何分支,极易丢失
分支名规范与远程同步的实操要点
本地分支创建完默认不关联远程,push 时需显式指定上游:git push -u origin feature/user-list。加 -u 才会把本地分支和远程分支绑定,之后 git pull 或 git push 就不用再写完整路径。
常见疏忽点:
- 团队协作中,分支名最好小写、用短横线分隔(
hotfix-202405),避免大小写混用引发 Windows/macOS 兼容问题 - 不要用
git push origin :feature/old这种冒号语法删远程分支——虽然有效,但容易手抖多打空格变成git push origin : feature/old,结果推了个空分支过去 - 删除本地分支前,确保它已被合并(
git branch --merged查看),否则git branch -d会拒绝,必须用-D强删——后者不校验,删错就真没了











