首页 > 解决方案 > GIT还原误区

问题描述

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

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

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

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

我期待看到暂存的 git.md 替换为最后提交的快照git.md

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

标签: gitrestorestaging

解决方案


git restore 手册页的介绍部分说:

使用还原源中的一些内容还原工作树中的指定路径。
...
该命令还可用于使用--staged 恢复索引中的内容,或使用--staged --worktree 恢复工作树和索引。

因此,该--staged参数将命令的目标指定为暂存区域(索引)。

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

如果未指定,如果给出了 --staged,则从 HEAD 恢复内容,否则从索引恢复。

因此,两个常见的选项是:

  • 不指定--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

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


推荐阅读