1. git restore 命令是新命令
在2019年8月发布的 Git 2.23 版本中,git checkout
命令的功能被拆解到两个新的命令中:
git switch
: 负责分支相关的操作git restore
: 负责文件相关的操作
相应的,当我们修改了文件,在 git status
命令给出的提示中看到的提示命令, 也变了:
- 以往会提示
git reset -- <files>
来恢复 stage 区域的内容, 现在则提示git restore --staged <files>
; - 以往会提示
git checkout -- <files>
来恢复 working directory 的内容,现在则提示git restore <files>
遗憾的是, 一些经典的教程尚未做更新,我们只能手动改一下, 例如图解 git 里的: https://marklodato.github.io/visual-git-guide/index-en.html
不过,stackoverflow 上的问答中也有人给出了更好的图解:
2. git官方对于restore命令的说明
https://git-scm.com/docs/git-restore
Restore specified paths in the working tree with some contents from a restore source. If a path is tracked but does not exist in the restore source, it will be removed to match the source.
在工作目录中用恢复源中的内容恢复指定的路径。如果某个路径被跟踪但在恢复源中不存在,它将被删除以匹配源内容。
The command can also be used to restore the content in the index with --staged, or restore both the working tree and the index with --staged --worktree.
该命令也可以使用 --staged 恢复索引中的内容,或者使用 --staged --worktree 同时恢复工作区和索引。
By default, if --staged is given, the contents are restored from HEAD, otherwise from the index. Use --source to restore from a different commit.
默认情况下,如果使用了–staged选项,内容会从HEAD恢复,否则会从索引恢复。使用–source选项可以从不同的提交中恢复。
See “Reset, restore and revert” in git[1] for the differences between the three commands.
很遗憾,截至目前(2024年7月28日),git 官方在线文档里仍然标记 restore
命令为实验性质:
THIS COMMAND IS EXPERIMENTAL. THE BEHAVIOR MAY CHANGE.
3. 总结
一些经典教程中使用了 git reset
和 git checkout
来分别恢复 staging area 和 working directory 内容, 虽然git保持了兼容性,但是新版的git(>=2.23)的 git status
命令给出的提示,是让大家用 git restore --staged
和 git restore
两个命令作为替代。