假设我在提交fileA
中删除了abc123
。然后,当我git reset
时,git diff
的输出显示已删除fileA
。 fileA
已不在我的工作目录中,因此无法重新添加。
git reset
的默认值为git reset --mixed
。这在man git-reset
中描述为:
重置索引但不重置工作树(即更改的文件是 保留但未标记为提交)并报告未提交的内容 更新。
什么是优雅的解决方案。一种解决方法是签出包含该文件的后续提交,复制该文件,然后签出abc123
并再次添加。
解:
以下两种解决方案是正确的。其中一个显示了如果检出删除它的提交,如何恢复文件,只需运行git checkout fileA
。另一个显示了如何恢复当前提交中的文件,该提交稍后是fileA
被删除的提交。您运行git checkout abc123~ -- file A
(--
确保checkout命令知道我们正在尝试回滚文件而不是更改分支。)
答案 0 :(得分:1)
我认为这就是发生的事情:
abc123
的提交fileA
。git rm fileA
。git reset
。现在你看到这样的事情:
# On branch master
# Changes not staged for commit:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# deleted: fileA
#
并且您无法使用git add
来获取fileA
,因为它不再存在于文件系统中。
要恢复fileA
,请输入:git checkout fileA
。
如果您在索引或工作树中没有任何其他关注的更改,也可以使用git reset --hard
。
答案 1 :(得分:1)
git reset --hard
将重置索引和工作树,这将恢复已删除的文件。如果您只是想重新添加当前磁头上已知的已删除的单个文件,则可以执行以下操作:
git checkout HEAD -- fileA
答案 2 :(得分:1)
您可以签出特定版本的单个文件:
git checkout abc123~ -- fileA
这将检查提交中存在的fileA
版本
在提交abc123
之前,它被删除了,这要归功于代字号
(~
)在提交ID之后。这会修改索引以及工作
树,所以就好像文件也被添加了一样。如果不希望你这样做
在离开时使用git rm --cached fileA
从索引中删除文件
在工作副本中。