使git重置restage已删除的文件

时间:2013-03-13 19:01:06

标签: git

假设我在提交fileA中删除了abc123。然后,当我git reset时,git diff的输出显示已删除fileAfileA已不在我的工作目录中,因此无法重新添加。

git reset的默认值为git reset --mixed。这在man git-reset中描述为:

  

重置索引但不重置工作树(即更改的文件是   保留但未标记为提交)并报告未提交的内容   更新。

什么是优雅的解决方案。一种解决方法是签出包含该文件的后续提交,复制该文件,然后签出abc123并再次添加。

以下两种解决方案是正确的。其中一个显示了如果检出删除它的提交,如何恢复文件,只需运行git checkout fileA。另一个显示了如何恢复当前提交中的文件,该提交稍后是fileA被删除的提交。您运行git checkout abc123~ -- file A--确保checkout命令知道我们正在尝试回滚文件而不是更改分支。)

3 个答案:

答案 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从索引中删除文件 在工作副本中。