git - GIT还原误区
问题描述
我一直在阅读官方 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
用最后一次提交中的那个来替换分阶段?
解决方案
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
最后一点,我看到手册指出这个命令仍然是“实验性的”。将来可能会对其进行调整,并且这种情况会变得更容易(或只是不同)。
推荐阅读
- java - 如何使用条件注释覆盖spring中的配置(例如)
- angular - 将 Angular 应用程序部署到 Azure Web 应用程序 Angular 9 的问题
- c# - 验证 URL 时出现“请求被中止:无法创建 SSL/TLS 安全通道”异常
- php - 检查单选按钮是否具有正确的数据库值
- java - Apache Ignite 中客户端的内存指标
- c# - c# Linq 比较具有相同文件名但没有扩展名的文件
- azure - 如何在实施 QA 自动化时克服 azure Active Directory MFA
- laravel-6 - 在 IIS 10 服务器中托管 Laravel 项目
- sockets - 如何在套接字中分配客户端端口?
- bash - 如何使用 bash/shell 脚本从文件的第一行删除一个单词