文章

git-checkout

切换分支或恢复文件到某个状态。

git-checkout

git checkout

git checkout 可以用来:

  • 切换到某个分支或提交

  • 还原工作区/暂存区的文件内容到某个版本

使用场景与语法大全

切换分支

1
git checkout branch-name
  • 作用:将当前工作目录切换到指定分支。

  • 会更新 .git/HEAD 为该分支名。

  • 会刷新工作区为该分支的文件快照。

创建新分支并切换过去(常见用法)

1
git checkout -b new-branch

等价于:

1
2
git branch new-branch
git checkout new-branch

检出特定 commit(分离 HEAD)

1
git checkout <commit-hash>
  • 会进入“Detached HEAD”状态。

  • 常用于调试旧版本、测试回滚,但不建议在此状态下开发。

还原文件到某个版本(恢复误删/误改)

1
git checkout <branch/commit> -- <file>
  • 用于将某个文件还原到指定分支或提交下的状态。

  • 如果省略 <branch>,默认是 HEAD

示例:

1
2
git checkout HEAD -- src/main.cpp     # 把 main.cpp 恢复为当前分支最后一次提交的版本
git checkout dev -- config.yml        # 用 dev 分支的 config.yml 覆盖当前工作区

git checkout 有多重语义,需结合参数判断行为

用法意义
git checkout dev切换到分支 dev
git checkout -b hotfix创建并切换到 hotfix 分支
git checkout abc123切换到某个提交(Detached HEAD)
git checkout -- file.txt恢复文件到最近提交版本
git checkout branch -- file.txt用某个分支的版本覆盖当前文件

HEAD 和 git checkout 的关系图解

正常切换分支:

1
2
3
HEAD  main         # 当前在 main 分支
git checkout dev
HEAD  dev          # 切换到 dev 分支

分离 HEAD:

1
2
git checkout 1a2b3c4
HEAD  1a2b3c4      # 不再指向任何分支名Detached HEAD

还原文件:

1
2
git checkout main -- app.cpp
#  main 分支里的 app.cpp 拿过来覆盖当前分支的 app.cpp只影响工作区

低层机制

checkout 会:

  • 更新 HEAD(分支切换时);
  • 修改工作区文件(替换内容);
  • 有时还会修改暂存区内容。

所以,使用 git checkout 会影响 HEAD、index(暂存区)、working directory(工作区)

注意事项

注意点说明
会覆盖工作区改动切换分支时若有未提交的改动,Git 会阻止 checkout 以防丢失
分离 HEAD 下提交不会自动保存需要手动 git switch -c 新分支 否则提交历史易丢失
想恢复历史文件,建议加 --否则 Git 会把你当成切分支了,比如 git checkout config

Git 新版本推荐使用 git switchgit restore

从 Git 2.23 起,为了简化语义、避免混淆,Git 引入了:

新命令原功能
git switch专用于切换分支
git restore专用于还原文件内容

示例对比:

操作checkout 命令新推荐命令
切换到分支 devgit checkout devgit switch dev
创建并切换到 featuregit checkout -b featuregit switch -c feature
恢复文件 file.txtgit checkout -- file.txtgit restore file.txt
恢复指定分支的文件git checkout dev -- file.txtgit restore -s dev file.txt

总结速查表

操作命令
查看所有分支git branch
切换分支git checkout dev
创建并切换分支git checkout -b feature
检出某个提交git checkout abc1234
恢复文件到最新提交git checkout -- file.cpp
用某分支版本还原文件git checkout dev -- file.cpp
本文由作者按照 CC BY 4.0 进行授权