如果你用的是 Git 2.23 及以上版本,切换分支时优先用git switch,恢复文件时用git restore;旧版本或需要兼容脚本时继续用git checkout。
先说结论:git switch是 Git 官方为分支切换专门设计的命令,语义更清晰、操作更安全,但需要 Git 2.23+ 版本支持。
- 适合:Git 2.23 及以上版本,日常分支切换场景
- 重点看:命令职责分离(switch 管分支、restore 管文件)、未提交更改保护机制
- 别忽略:旧版本兼容性问题、
checkout -b与checkout -B的行为差异
命令速用版
下面是常用场景的命令对照,可以直接复制使用:
# 切换到已有分支
git switch dev # 推荐
git checkout dev # 兼容旧版本# 创建并切换新分支
git switch -c feature/login # 推荐
git checkout -b feature/login # 兼容旧版本# 从远程分支创建本地跟踪分支
git switch -c release-1.2 `--track` origin/release-1.2
git checkout -b release-1.2 origin/release-1.2# 恢复文件(switch 不支持,用 restore 或 checkout)
git restore `--source` HEAD -- file.txt
git checkout HEAD -- file.txt为什么会这样
Git 在 2.23 版本之前,git checkout承担了太多职责:既能切换分支,又能恢复文件。这种设计带来两个问题:
第一,命令意图不清晰。看到git checkout xxx,你无法一眼判断是要切换分支还是恢复文件,得看xxx是分支名还是文件名。
第二,误操作风险高。比如你想恢复某个文件的修改,却漏写了--参数,Git 可能尝试切换到同名分支;或者在有未提交更改时切换分支,checkout会尝试合并更改,失败才报错,而switch会直接阻止切换。
官方引入git switch和git restore,就是把这两件事拆开:switch 专管分支切换,restore 专管文件恢复。命令职责单一,出错概率自然降低。
分步处理
第一步:确认 Git 版本
git `--version`如果版本低于 2.23,git switch命令不可用,继续使用git checkout即可。如果版本满足要求,可以开始迁移到新命令。
第二步:切换已有分支
git switch main执行前建议先运行git status检查工作区状态。如果有未提交的更改,git switch会直接报错提醒你处理,不会像checkout那样尝试合并。
第三步:创建并切换新分支
git switch -c feature/new-feature这等价于先运行git branch feature/new-feature再运行git switch feature/new-feature。如果要基于远程分支创建,加上`--track`参数即可。
第四步:恢复文件修改
git restore `--source` HEAD -- file.txt注意git switch不支持文件恢复,这个场景需要用git restore或继续用git checkout。
怎么验证是否生效
执行完分支切换后,用以下命令确认当前所在分支:
git branch `--show-current`或者查看完整分支列表,当前分支前会有星号标记:
git branch如果是从远程分支创建的跟踪分支,可以用git status查看上游分支信息,确认跟踪关系是否建立成功。
常见坑
坑一:在旧版本或脚本中默认使用 switch
git switch是 2.23 版本才引入的,如果你的团队有人还在用旧版本,或者 CI/CD 脚本运行在旧环境中,直接写git switch会报错。这种场景建议继续用git checkout,或者在脚本开头检查版本。
坑二:误以为 checkout -b 会重置已存在分支
git checkout -b existing-branch如果分支已存在,会直接报错,不会执行重置。若要强制重置需使用git checkout -B existing-branch,这会导致该分支指向当前 HEAD,历史提交可能丢失。git switch在不带-c参数时遇到已存在分支也会报错,避免了误用强制重置参数的风险,更安全。
坑三:在 detached HEAD 状态下提交后忘记建分支
用git switch `--detach` abc1234切换到某次提交浏览时,如果在这个状态下做了提交,没有及时用git switch -c new-branch创建分支指向它,这些提交可能在 Git 垃圾回收后被清理。临时浏览没问题,要保留就得立刻建分支。
坑四:忘记 switch 不支持文件恢复
习惯了git checkout的人可能会尝试git switch HEAD -- file.txt,这会报错。文件恢复场景请改用git restore或继续用git checkout。
参考来源
- Git Official Documentation - git-scm.com
- Git 2.23.0 Release Notes
原文链接:https://www.zjcp.cc/ask/11130.html
