GIT 挽回误会

GIT Restore Misunderstanding

我一直在阅读官方 GIT 手册,我正在努力理解 git restore 命令,我相信它应该取代 checkout 的部分功能。无论如何,这就是我所在的位置:

  1. 我在我的工作目录中编辑了一个名为 git.md
  2. 的文件
  3. 然后我暂存该文件,但继续对我工作区中的 git.md 文件进行修改。我决定要恢复到暂存区中的文件。
  4. 我使用 git restore git.md,它将当前 git.md 替换为暂存区中的快照。

按预期工作。下一个场景:

  1. 我对 git.md 进行了一些更改并暂存它,但我意识到我想用上次提交中的 git.md 文件的快照替换它。
  2. 我运行git restore --staged git.md
  3. 我检查了文件,我对文件所做的所有更改仍然存在,并且当前在工作区中。

我期待看到暂存的 git.md 被最后提交的快照所取代 git.md

问题,这是它应该如何工作还是应该用上次提交中的那个替换分阶段 git.md

the manual page for git restore 的介绍部分说:

Restore specified paths in the working tree with some contents from a restore 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 参数将命令的目标 指定为 暂存区(索引)。

要恢复的文件的来源--source参数指定,但根据目标有不同的默认值:

If not specified, the contents are restored from HEAD if --staged is given, otherwise from the index.

所以,两个常见的选项是:

  • 未指定 --staged--source,从暂存区恢复工作副本。实际上,它会“撤消”任何尚未暂存的本地更改。
  • --staged 指定但未指定 --source,从 HEAD(当前签出的提交)恢复暂存区。实际上,它“取消暂存”任何尚未提交的更改。

要从当前提交恢复暂存区工作树,需要同时指定--staged--worktree,并且明确说明来源。

手册给出了这个例子:

git restore --source=HEAD --staged --worktree hello.c

还有这个相当神秘的缩写形式:

git restore -s@ -SW hello.c

据我理解,这相当于运行两个默认模式依次为:

git restore --staged   # target staging area, implicit source HEAD
git restore            # implicit target worktree, implicit source staging area

最后一点,我看到手册上说这个命令仍然是“实验性的”。将来可能会对其进行调整,并且这种情况会变得更容易(或只是不同)。