GIT还原误区

Posted

技术标签:

【中文标题】GIT还原误区【英文标题】:GIT Restore Misunderstanding 【发布时间】:2021-08-12 19:33:09 【问题描述】:

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

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

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

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

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

问题,这是它应该如何工作还是应该用最后一次提交中的git.md 替换暂存的git.md

【问题讨论】:

@axiac 我编辑了问题以修复您指出的错误。 【参考方案1】:

the manual page for 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

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

【讨论】:

你上面的例子正是我所理解的。就像你说的,它可能需要调整。 我会尝试第一个选项,看看它是否适用于暂存文件。 我使用了 git restore --source=HEAD --staged --worktree myfile 并且它可以正常工作。谢谢。

以上是关于GIT还原误区的主要内容,如果未能解决你的问题,请参考以下文章

开发误区----spring boot误区

开发误区----MySQL数据库误区

避开这十个坑 | 自学编程很轻松

跑步减肥常见的十大误区

跑步减肥常见的十大误区

知道用杀毒软件的十大误区吗