GIT 挽回误会
GIT Restore Misunderstanding
我一直在阅读官方 GIT 手册,我正在努力理解 git restore
命令,我相信它应该取代 checkout
的部分功能。无论如何,这就是我所在的位置:
- 我在我的工作目录中编辑了一个名为 git.md
的文件
- 然后我暂存该文件,但继续对我工作区中的
git.md
文件进行修改。我决定要恢复到暂存区中的文件。
- 我使用
git restore git.md
,它将当前 git.md
替换为暂存区中的快照。
按预期工作。下一个场景:
- 我对 git.md 进行了一些更改并暂存它,但我意识到我想用上次提交中的
git.md
文件的快照替换它。
- 我运行
git restore --staged git.md
- 我检查了文件,我对文件所做的所有更改仍然存在,并且当前在工作区中。
我期待看到暂存的 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
最后一点,我看到手册上说这个命令仍然是“实验性的”。将来可能会对其进行调整,并且这种情况会变得更容易(或只是不同)。
我一直在阅读官方 GIT 手册,我正在努力理解 git restore
命令,我相信它应该取代 checkout
的部分功能。无论如何,这就是我所在的位置:
- 我在我的工作目录中编辑了一个名为 git.md 的文件
- 然后我暂存该文件,但继续对我工作区中的
git.md
文件进行修改。我决定要恢复到暂存区中的文件。 - 我使用
git restore git.md
,它将当前git.md
替换为暂存区中的快照。
按预期工作。下一个场景:
- 我对 git.md 进行了一些更改并暂存它,但我意识到我想用上次提交中的
git.md
文件的快照替换它。 - 我运行
git restore --staged git.md
- 我检查了文件,我对文件所做的所有更改仍然存在,并且当前在工作区中。
我期待看到暂存的 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
最后一点,我看到手册上说这个命令仍然是“实验性的”。将来可能会对其进行调整,并且这种情况会变得更容易(或只是不同)。