git checkout 命令
简介
git checkout 是 Git 中一个功能强大的命令,主要用于切换分支、创建新分支、恢复文件以及检出特定提交。它是 Git 中最常用的命令之一。
基本概念
git checkout 主要有两个用途:
- 切换分支:在不同的分支之间切换
- 恢复文件:将文件恢复到特定版本
命令语法
1 2 3 4 5 6 7 8 9 10 11
| git checkout [选项] <分支名>
git checkout -b <新分支名> [起始点]
git checkout [选项] [--] <文件>...
git checkout [选项] <提交>
|
查看帮助文档
常用选项
| 选项 |
说明 |
-b <分支名> |
创建新分支并切换过去 |
-B <分支名> |
创建或重置分支并切换过去 |
-f, --force |
强制切换,丢弃本地更改 |
-q, --quiet |
静默模式,减少输出 |
--track |
设置上游分支跟踪 |
--no-track |
不设置上游分支跟踪 |
-l, --create-reflog |
为新分支创建 reflog |
--orphan <分支名> |
创建孤立分支(无父提交) |
--detach |
分离 HEAD(检出提交而非分支) |
--ours |
在合并冲突时使用我们的版本 |
--theirs |
在合并冲突时使用他们的版本 |
-p, --patch |
交互式选择要恢复的更改 |
-- |
分隔选项和路径 |
切换分支
基本切换
1 2 3 4 5 6 7 8
| $ git checkout main
$ git checkout develop
$ git checkout origin/feature-branch
|
创建新分支并切换
1 2 3 4 5 6 7 8 9 10 11
| $ git checkout -b feature/new-feature
$ git checkout -b feature/new-feature main
$ git checkout -b hotfix abc1234
$ git checkout -b local-branch origin/remote-branch
|
强制切换
1 2 3 4 5
| $ git checkout -f main
$ git checkout --force develop
|
警告:使用 -f 会丢失未提交的更改,请谨慎使用!
重置并切换分支
1 2 3 4 5
| $ git checkout -B branch-name
$ git checkout -B branch-name commit-hash
|
跟踪远程分支
1 2 3 4 5 6 7 8
| $ git checkout --track origin/feature-branch
$ git checkout -b local-name --track origin/remote-name
$ git checkout --no-track -b local-branch origin/remote-branch
|
查看分支信息
1 2 3 4 5 6 7 8
| $ git checkout -v main
$ git branch -a
$ git branch --show-current
|
恢复文件
恢复工作区文件
1 2 3 4 5 6 7 8 9 10 11
| $ git checkout -- README.md
$ git checkout -- file1.txt file2.txt
$ git checkout -- src/
$ git checkout -- README.md
|
从特定提交恢复文件
1 2 3 4 5 6 7 8 9 10 11
| $ git checkout HEAD -- README.md
$ git checkout abc1234 -- README.md
$ git checkout main -- README.md
$ git checkout origin/main -- README.md
|
交互式恢复
1 2 3 4 5
| $ git checkout -p README.md
$ git checkout -p
|
恢复暂存区文件
1 2 3 4 5
| $ git restore --staged README.md
|
检出特定提交
分离 HEAD 状态
1 2 3 4 5 6 7 8
| $ git checkout abc1234
$ git checkout v1.0.0
$ git checkout origin/main
|
注意:在分离 HEAD 状态下,任何提交都不会属于任何分支。如果需要保留更改,应该创建新分支。
从分离状态创建分支
1 2 3 4 5
| $ git checkout -b new-branch
$ git checkout -b fix-bug abc1234
|
高级用法
创建孤立分支
1 2 3 4 5
| $ git checkout --orphan new-branch
|
使用 reflog
1 2 3 4 5
| $ git checkout -l -b new-branch
$ git reflog
|
合并冲突时选择版本
1 2 3 4 5 6 7 8
| $ git checkout --ours conflicted-file.txt
$ git checkout --theirs conflicted-file.txt
$ git add conflicted-file.txt
|
批量恢复文件
1 2 3 4 5 6 7 8
| $ git checkout .
$ git checkout -- '*.txt'
$ git checkout -- src/
|
实际应用场景
场景1:日常分支切换
1 2 3 4 5 6 7 8
| $ git checkout main
$ git checkout feature/login
$ git checkout -
|
场景2:创建功能分支
1 2 3 4 5 6 7
| $ git checkout main $ git pull origin main $ git checkout -b feature/user-profile
$ git checkout -b feature/user-profile origin/main
|
场景3:修复紧急 bug
1 2 3 4 5 6 7 8 9 10 11
| $ git checkout main $ git checkout -b hotfix/critical-bug
$ git add . $ git commit -m "Fix critical bug"
$ git checkout main $ git merge hotfix/critical-bug
|
场景4:恢复误删的文件
1 2 3 4 5
| $ git checkout HEAD -- deleted-file.txt
$ git checkout abc1234 -- deleted-file.txt
|
场景5:撤销文件更改
1 2 3 4 5 6
| $ git checkout -- modified-file.txt
$ git status $ git checkout -- file1.txt file2.txt
|
场景6:查看历史版本
1 2 3 4 5 6 7 8
| $ git checkout abc1234
$ git checkout main
$ git checkout -b temp-view abc1234
|
场景7:同步远程分支
1 2 3 4 5 6 7 8
| $ git fetch origin
$ git checkout feature-branch
$ git checkout -b local-branch --track origin/remote-branch
|
场景8:处理合并冲突
1 2 3 4 5 6 7 8 9 10 11 12 13
| $ git merge feature-branch
$ git status
$ git checkout --ours conflicted-file.txt $ git add conflicted-file.txt
$ git checkout --theirs conflicted-file.txt $ git add conflicted-file.txt
|
场景9:创建发布分支
1 2 3 4 5
| $ git checkout -b release/v1.0.0 v1.0.0
$ git checkout -b release/v1.0.0 main
|
场景10:实验性更改
1 2 3 4 5 6 7 8 9
| $ git checkout -b experiment/new-approach
$ git checkout main $ git branch -D experiment/new-approach
|
与其他命令的组合
git checkout + git branch
1 2 3 4 5 6 7 8 9
| $ git branch -a
$ git checkout -b new-branch
$ git checkout main $ git branch -D old-branch
|
git checkout + git fetch
1 2 3 4 5
| $ git fetch origin
$ git checkout feature-branch
|
git checkout + git stash
1 2 3 4 5 6 7 8 9
| $ git stash
$ git checkout other-branch
$ git checkout original-branch $ git stash pop
|
git checkout + git merge
1 2 3 4 5
| $ git checkout main
$ git merge feature-branch
|
常见问题和解决方案
问题1:有未提交的更改无法切换分支
错误信息:
1
| error: Your local changes to the following files would be overwritten by checkout
|
解决方案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| $ git add . $ git commit -m "Save changes" $ git checkout other-branch
$ git stash $ git checkout other-branch $ git stash pop
$ git checkout -f other-branch
$ git checkout -- modified-file.txt $ git checkout other-branch
|
问题2:分离 HEAD 状态
问题:检出了提交而非分支,处于分离 HEAD 状态
解决方案:
1 2 3 4 5
| $ git checkout -b new-branch-name
$ git checkout main
|
问题3:分支不存在
错误信息:
1
| error: pathspec 'branch-name' did not match any file(s) known to git
|
解决方案:
1 2 3 4 5 6 7 8 9
| $ git branch -a
$ git checkout -b local-branch origin/remote-branch
$ git fetch origin $ git checkout branch-name
|
问题4:文件名冲突
问题:分支名和文件名相同
解决方案:
1 2 3 4 5
| $ git checkout -- branch-name
$ git checkout refs/heads/branch-name
|
问题5:无法删除当前分支
错误信息:
1
| error: Cannot delete branch 'branch-name' checked out at '/path'
|
解决方案:
1 2 3 4 5
| $ git checkout main
$ git branch -D branch-name
|
问题6:恢复文件后仍显示为修改
问题:使用 git checkout -- file 后,文件仍显示为修改
解决方案:
1 2 3 4 5 6 7 8 9 10
| $ git status
$ git restore --staged file.txt $ git restore file.txt
$ git reset HEAD file.txt $ git checkout -- file.txt
|
最佳实践
1. 切换分支前检查状态
1 2 3 4 5 6 7
| $ git status
$ git stash
$ git commit -m "WIP"
|
2. 使用描述性的分支名
1 2 3 4 5 6 7 8 9
| $ git checkout -b feature/user-authentication $ git checkout -b bugfix/login-error $ git checkout -b hotfix/security-patch
$ git checkout -b test $ git checkout -b fix $ git checkout -b new
|
3. 定期同步远程分支
1 2 3 4 5 6 7 8
| $ git fetch origin
$ git checkout feature-branch
$ git checkout -b local-branch --track origin/remote-branch
|
4. 恢复文件时使用 –
1 2 3 4 5
| $ git checkout -- README.md
$ git checkout README.md
|
5. 避免在分离 HEAD 状态下工作
1 2 3 4 5 6 7
| $ git checkout abc1234 $ git commit -m "Changes"
$ git checkout -b temp-branch abc1234 $ git commit -m "Changes"
|
6. 使用 git switch 和 git restore(Git 2.23+)
Git 2.23 引入了新命令来分离 git checkout 的功能:
1 2 3 4 5 6 7
| $ git switch main $ git switch -c new-branch
$ git restore README.md $ git restore --staged README.md
|
7. 创建分支时指定起始点
1 2 3 4 5 6 7 8
| $ git checkout -b feature/new main
$ git checkout -b local origin/remote
$ git checkout -b feature/new
|
8. 处理合并冲突
1 2 3 4 5 6 7 8 9 10
| $ git status
$ git checkout --ours file.txt
$ git checkout --theirs file.txt
$ git add file.txt
|
git checkout vs git switch vs git restore
Git 2.23+ 的新命令
Git 2.23 引入了 git switch 和 git restore 来替代 git checkout 的部分功能:
| 功能 |
旧命令 |
新命令(推荐) |
| 切换分支 |
git checkout branch |
git switch branch |
| 创建分支 |
git checkout -b branch |
git switch -c branch |
| 恢复文件 |
git checkout -- file |
git restore file |
| 取消暂存 |
git reset HEAD file |
git restore --staged file |
使用建议
- Git 2.23+:优先使用
git switch 和 git restore
- 旧版本 Git:继续使用
git checkout
- 兼容性:
git checkout 仍然可用,不会被移除
常用别名
1 2 3 4 5 6 7 8 9 10 11
| $ git config --global alias.co checkout $ git config --global alias.cob 'checkout -b' $ git config --global alias.sw 'switch' $ git config --global alias.rs 'restore'
$ git co main $ git cob feature/new $ git sw main $ git rs README.md
|
总结
git checkout 是 Git 中最常用的命令之一,掌握它可以帮助你:
- 切换分支:在不同分支之间自由切换
- 创建分支:快速创建新的工作分支
- 恢复文件:撤销文件更改或恢复误删文件
- 查看历史:检出特定提交查看历史版本
- 处理冲突:在合并冲突时选择版本
虽然 Git 2.23+ 引入了 git switch 和 git restore 来分离功能,但 git checkout 仍然是最广泛使用的命令,理解它的各种用法对于 Git 工作流至关重要。