(三)分支与标签 - git checkout 命令的使用
等。这是一个综合性的命令,推荐逐渐过渡到新命令,新命令更专一,Git 2.23+ 版本上开始使用。切换分支(git switch)、恢复文件(git restore)。
文章目录
1. 命令概述
git checkout 是一个多功能命令,其主要功能可以归结为两大类:
1.切换分支:在不同的开发分支之间进行切换。
2.恢复文件:将工作区中的文件恢复到某个特定版本的状态(通常是暂存区或最新提交的版本)。
简单来说,git checkout 就是用来 “切换上下文” 和 “撤销修改” 的命令。它会改变你的工作目录,使其匹配你所选择的提交或分支。
重要提示:由于 git checkout 身兼两职,在 Git 2.23 版本中,引入了两个更专注的新命令 git switch 和 git 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
这会将你的工作目录和暂存区更新为 main 或 develop 分支的最新状态。执行后,命令行提示符通常也会显示你当前所在的分支。
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 的现代替代品。 |
更多推荐
所有评论(0)