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还原误区的主要内容,如果未能解决你的问题,请参考以下文章