git中checkout和swtich

git checkoutgit switch 都可以用于切换分支,但它们的设计目的不同。

一句话理解

  • checkout:老命令,功能很多(切换分支、恢复文件、创建分支等)。
  • switch:新命令(Git 2.23+),专门用于切换分支,语义更清晰。

官方也推荐新用户优先使用 switch


1. 切换已有分支

假设当前分支:

复制代码
git branch

输出:

复制代码
* dev
  main
  test

切换到 main

checkout写法

复制代码
git checkout main

switch写法(推荐)

复制代码
git switch main

效果完全一样。


2. 创建并切换到新分支

创建 feature/login 分支并切换过去。

checkout写法

复制代码
git checkout -b feature/login

switch写法(推荐)

复制代码
git switch -c feature/login

说明:

复制代码
-b  == 创建分支
-c  == create

3. 切换到上一个分支

例如:

复制代码
main -> dev

然后想回到 main。

checkout

复制代码
git checkout -

switch

复制代码
git switch -

效果一样。


4. checkout容易让新手困惑

例如:

复制代码
git checkout test

你可能以为:

复制代码
切换到 test 分支

但如果项目里恰好存在一个文件:

复制代码
test

Git有时会理解成:

复制代码
恢复文件 test

容易产生歧义。


5. switch不存在歧义

复制代码
git switch test

Git明确知道:

复制代码
我要切换分支

不会被理解成文件操作。


6. 为什么Git后来增加了switch

因为原来的 checkout 承担了太多职责:

复制代码
git checkout main          # 切换分支
git checkout -b dev        # 创建分支
git checkout file.txt      # 恢复文件
git checkout HEAD~1 a.py   # 恢复指定版本文件

一个命令干了很多事。

Git 2.23 开始拆分:

功能 新命令
切换分支 git switch
恢复文件 git restore

例如:

旧写法:

复制代码
git checkout a.py

新写法:

复制代码
git restore a.py

7. 实际工作推荐

如果你的 Git 版本较新(Git ≥ 2.23):

复制代码
git switch main
git switch dev
git switch -c feature_xxx

如果是一些老服务器、老 CI 环境:

复制代码
git checkout main
git checkout -b feature_xxx

因为所有 Git 版本都支持 checkout


GitLab 合并冲突场景推荐

假设你当前在功能分支:

复制代码
feature/test

想先同步 main 最新代码再解决冲突:

复制代码
# 切到main
git switch main

# 更新main
git pull origin main

# 切回功能分支
git switch feature/test

# 合并main
git merge main

如果你的服务器 Git 版本较老,则全部替换为:

复制代码
git checkout main
git pull origin main

git checkout feature/test
git merge main

这两套命令效果完全一致。