为了拆分 git checkout 这个"多功能"命令,使其更安全、语义更清晰,Git 在 2.23版本(2019年) 引入了两个新的专用命令:git switch 和 git restore。
简单来说,git checkout 的职责被一分为二:
git switch:专用于切换和创建分支。git restore:专用于恢复文件(撤销工作区或暂存区的更改)。
使用新命令可以避免因文件和分支同名导致的误操作,也更符合"一个命令只做一件事"的原则。
📝 新旧命令对比与用法速查
下面这个表格清晰地展示了新旧命令的对应关系,你可以根据需要选择性替换旧命令。
| 功能 | 新命令(推荐) | 旧命令 (git checkout) |
示例与说明 |
|---|---|---|---|
| 切换分支 | git switch <分支名> |
git checkout <分支名> |
git switch main 切换到 main 分支。 |
| 创建并切换到新分支 | git switch -c <新分支名> |
git checkout -b <新分支名> |
git switch -c feature-x 从当前提交创建新分支。 |
| 切换到远程分支 | git switch --track origin/<分支名> |
git checkout -b <分支名> origin/<分支名> |
先执行 git fetch,然后 git switch --track origin/feature-x 会创建本地跟踪分支。 |
| 快速切换回上一个分支 | git switch - |
git checkout - |
在A、B两个分支间来回切换时特别方便。 |
| 恢复工作区文件 | git restore <文件> |
git checkout -- <文件> |
git restore README.md 放弃工作区对 README.md 的修改。 |
| 恢复暂存区文件 | git restore --staged <文件> |
git reset HEAD <文件> |
git restore --staged README.md 将已 git add 的文件撤出暂存区。 |
| 恢复文件到指定版本 | git restore --source=<提交> <文件> |
git checkout <提交> -- <文件> |
git restore --source=HEAD~2 README.md 将文件恢复到前两次提交时的状态。 |
💡 迁移建议与注意事项
- 版本要求 :
git switch和git restore需要 Git 2.23 或更高版本 。你可以通过git --version命令确认。 - 逐步迁移 :旧的
git checkout命令仍然完全有效且被支持 。你可以根据自己的节奏,在熟悉的分支操作上先尝试使用git switch。 - 处理未提交的更改 :和以前一样,如果切换分支时有未提交的更改可能被覆盖,Git会阻止操作。你可以:
- 暂存更改 :
git stash-> 切换分支 ->git stash pop。 - 强制切换(慎用) :
git switch --discard-changes <分支名>会丢弃更改。
- 暂存更改 :
- 注意"分离头指针"状态 :无论是用
git checkout <提交号>还是git switch --detach <提交号>直接切换到某个历史提交,都会进入此状态。在此状态下新建的提交易丢失,建议先用git switch -c <新分支名>创建一个新分支再操作。
🔍 其他相关更新
git sparse-checkout:这是一个更独立的命令,用于配置"稀疏检出",让你只克隆仓库的特定目录,在大仓库中非常有用。它早期功能也整合在git checkout中,但现已发展成功能完善的独立命令。
总的来说,git switch 和 git restore 让 Git 的日常操作变得更清晰和安全。建议你从最常用的分支切换开始尝试 git switch,慢慢就能感受到其直观的好处。