讲讲Git 中引入的 git switch 和 git restore命令
在 Git 2.23 版本(2019年发布)中,Git 官方引入了两个非常重要的新命令:git switch 和 git restore。
引入这两个命令的根本原因是:以前的 git checkout 承担了太多的职责,导致概念混淆。
在过去,git checkout 既可以用来切换分支(操作分支),又可以用来撤销文件修改(操作文件)。这对于初学者来说非常难以理解。因此,Git 社区决定将 git checkout 的功能一分为二,让命令的语义更加清晰:
git switch:专门用于切换分支。git restore:专门用于还原/撤销文件。
下面为你详细拆解这两个命令的用法,并与老版的 git checkout 进行对比。
一、 git switch:专门用于切换分支
顾名思义,switch 就是“切换”。它只负责改变当前的 HEAD 指针(即切换分支),不会去修改或重置你的工作区文件内容(除非是因为切换分支导致的正常文件变动)。
常见用法及对比:
1. 切换到一个已存在的分支
- 新命令:
git switch main - 老命令:
git checkout main
2. 创建并切换到一个新分支
- 新命令:
git switch -c feature-A(-c代表 create,比以前的-b更直观) - 老命令:
git checkout -b feature-A
3. 切换回上一个分支
- 新命令:
git switch - - 老命令:
git checkout -
4. 以“游离 HEAD” (Detached HEAD) 状态切换到某个特定的 Commit
如果你想查看历史中的某个节点,但不想建分支:
- 新命令:
git switch --detach 3a4b5c6(强制要求加上--detach,防止用户误操作导致游离状态) - 老命令:
git checkout 3a4b5c6(以前 Git 会直接进入游离状态,常常让新手不知所措)
二、 git restore:专门用于还原文件修改
restore 的意思是“恢复、还原”。它专门用来处理文件级别的撤销操作,无论是工作区(Working Directory)中尚未提交的修改,还是暂存区(Staging Area)中准备提交的内容,都可以用它来处理。
常见用法及对比:
1. 丢弃工作区中文件的修改(尚未 git add)
如果你修改了一个文件,但不想要这些修改了,想让它恢复到和当前仓库里一样的状态:
- 新命令:
git restore index.html - 老命令:
git checkout -- index.html
2. 将文件从暂存区移出(已经 git add,但不想提交了)
也就是所谓的“取消暂存(Unstage)”,把文件从暂存区放回工作区,但保留文件内容的修改:
- 新命令:
git restore --staged index.html - 老命令:
git reset HEAD index.html(以前用 reset 撤销暂存极其反直觉)
3. 同时撤销工作区和暂存区的修改
既取消暂存,又把文件内容恢复到原始状态:
- 新命令:
git restore --staged --worktree index.html - 老命令:
git checkout HEAD index.html
4. 从另一个分支或特定的 Commit 中恢复某个文件
如果你把某个文件改坏了,想直接把 main 分支上的那个文件“拿”过来覆盖当前文件:
- 新命令:
git restore --source=main index.html - 老命令:
git checkout main -- index.html
三、 总结与建议
用一张表来总结它们的职责划分:
| 你的目的 | 以前的命令 (容易混淆) | 现在的推荐命令 (语义清晰) |
|---|---|---|
| 切换分支 | git checkout <branch> |
git switch <branch> |
| 创建并切换分支 | git checkout -b <branch> |
git switch -c <branch> |
| 撤销工作区文件修改 | git checkout -- <file> |
git restore <file> |
| 取消暂存区文件 (Unstage) | git reset HEAD <file> |
git restore --staged <file> |
新手/老手建议:
git checkout并没有被废弃,为了向下兼容,它仍然可以完全正常使用。你的旧脚本不需要修改。- 但对于日常的手动操作,强烈建议养成使用
switch和restore的习惯。这两个命令的英文语义极其精准,不仅能减少误操作,也能减轻你大脑的记忆负担。看到switch就知道在动分支,看到restore就知道在改文件。