1. 命令概述

git checkout 是一个多功能命令,其主要功能可以归结为两大类:

1.切换分支:在不同的开发分支之间进行切换。

2.恢复文件:将工作区中的文件恢复到某个特定版本的状态(通常是暂存区或最新提交的版本)。

简单来说,git checkout 就是用来 “切换上下文” 和 “撤销修改” 的命令。它会改变你的工作目录,使其匹配你所选择的提交或分支。

重要提示:由于 git checkout 身兼两职,在 Git 2.23 版本中,引入了两个更专注的新命令 git switchgit restore 来分别接管它的功能,以降低混淆。但 git checkout 依然被广泛使用和理解,因此学习它至关重要。我们会在最后详细讨论这两个新命令。

2. 命令格式

git checkout 的命令格式根据用途有所不同。

// 用于切换分支
git checkout [<branch_name>]
git checkout -b <new_branch_name> [<starting_point>]

// 用于恢复文件
git checkout [<commit_hash>] -- <file_path>
git checkout [<branch_name>] -- <file_path>

3. 基本用法

3.1 切换分支

这是 git checkout 最常用的功能。

3.1.1 切换到已存在的分支

git checkout main
git checkout develop

这会将你的工作目录和暂存区更新为 maindevelop 分支的最新状态。执行后,命令行提示符通常也会显示你当前所在的分支。

3.1.2 创建并切换到新分支

git checkout -b <local-branch> feature/new-feature <starting_point>

这个 -b 选项是一个组合操作,等同于先执行 git branch feature/new-feature 创建分支,再执行 git checkout feature/new-feature 切换过去。<local-branch>是可选的,默认与要检出的远程分支同名。<starting_point> 是可选的,默认为当前所在的提交,你也可以指定从一个特定的提交或标签开始创建:

git checkout -b hotfix master # 基于 master 分支创建 hotfix 分支
git checkout -b old-version v1.0.0 # 基于标签 v1.0.0 创建分支

3.2 恢复文件

当你修改了工作区的文件,但还没有提交,想要放弃这些修改时,可以使用这个功能。

3.2.1 丢弃工作区的修改(未添加到暂存区)

git checkout -- README.md

这个命令会将 README.md 文件恢复到 最近一次 git commit git add 时的状态。这是一个危险操作,本地的修改将会永久丢失

3.2.2 从另一个分支恢复指定文件

git checkout develop -- styles.css

这个命令非常有用。它会把 develop 分支上的 styles.css 文件复制到你的 当前工作分支 的工作区和暂存区。这允许你“借用”另一个分支上的特定文件,而无需合并整个分支。

4. 高级用法

4.1 分离头指针(Detached HEAD)

这是一个非常重要的概念。

git checkout <commit_hash>

当你直接检出一个提交的哈希值(或标签)而不是分支名时,你会进入 “Detached HEAD” 状态。HEAD 指针不再指向任何分支的末端,而是直接指向一个具体的提交。

  • 为什么有用? 用于查看历史代码、调试旧版本问题、或者从某个历史点创建新的分支。
  • 有何风险? 在分离头指针状态下进行的任何提交都不会属于任何分支。如果你切换回其他分支,这些提交可能会被 Git 当作垃圾回收掉,从而丢失。
  • 安全做法:如果你想在某个历史提交上工作,应该立即基于它创建一个新分支:
git checkout -b new-branch-from-history <commit_hash>

4.2 交互式地恢复多个文件(使用 Patch)

-p--patch 选项允许你交互式地选择要恢复的代码块。

git checkout -p

或者针对特定文件:

git checkout -p -- README.md

执行后,Git 会展示每一个改动代码块,并询问你是否要丢弃它。这对于只想撤销部分修改的场景非常高效。

4.3 强制切换分支

如果你的工作区或暂存区有未提交的修改,并且这些修改与目标分支有冲突,Git 会阻止你切换分支,以防止你的修改被覆盖。

  • 如果希望保留修改,请先 git stash 暂存起来。
  • 如果希望丢弃修改,可以使用 -f 或 --force 选项强制切换:
git checkout -f main

请谨慎使用 -f,因为它会无情地丢弃所有未提交的修改。

5. 注意事项

5.1 数据丢失风险

git checkout -- <file>git checkout -f 都会丢弃本地的未提交修改,且无法通过 Git 本身恢复。在执行前请务必确认

5.2 理解分离头指针

Detached HEAD 状态下工作时要非常清楚自己在做什么,确保重要的更改被绑定到分支上

5.3 未提交修改的冲突

在切换分支前,如果存在未提交的修改,Git 会进行校验。养成在切换分支前提交或储藏(stash)修改的好习惯。

5.4 工作区和暂存区的区别

git checkout -- <file> 恢复的是工作区的文件,使其与暂存区(如果文件已 add)或上一次提交(如果文件未 add)一致。它不会改变提交历史。

6. 重要补充

git switch 和 git restore
正如开头所提,由于 git checkout 的职责过于复杂,Git 2.23 引入了两个新命令来取代它,让意图更清晰。

功能 旧命令 (git checkout) 新命令 说明
切换分支 git checkout main git switch main 名字 switch 更直观,就是“切换”
创建并切换分支 git checkout -b new-branch git switch -c new-branch -c 是 --create 的缩写
恢复文件(到暂存区状态) git checkout – file.txt git restore file.txt restore 意为“恢复”,更清晰。
恢复文件(到指定提交的状态) git checkout HEAD~1 – file.txt git restore --source=HEAD~1 file.txt 使用 --source 指定恢复源,语义更明确。
将文件从暂存区撤出 (取消 git add) (无直接对应) git restore --staged file.txt 这是 git reset HEAD file.txt 的现代替代品。
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐