2013-03-13 84 views
1

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

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

重置索引而不是工作树(即更改的文件 保留,但不标记为提交)和报告一直没有什么 更新。

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

SOLUTION:下面

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

+0

您可以使用'git stash'临时保留您的临时区域中的更改,同时重置 – 2013-03-13 19:05:04

+0

我编辑了我的问题。您的评论不再相关。 – 2013-03-13 19:13:16

回答

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

git reset --hard将重置索引和工作树,这将恢复删除的文件。如果你只是想重新添加已删除,你知道存在于当前的头一个单一的文件,你可以这样做有:

git checkout HEAD -- fileA 
1

您可以从一个特定版本签一个单独的文件:

因为它在提交 存在紧前面的提交ID之后提交 abc123它被除去,由于波浪 ( ~
git checkout abc123~ -- fileA 

这将检出的fileA版本。这会修改索引以及工作的 树,所以就好像文件也被添加了一样。如果不需要,可以使用 使用git rm --cached fileA从索引中删除文件,同时将 保留在工作副本中。

+0

如果在'abc123'提交过程中'fileA'被修改了怎么办?当我们检出前一次提交的文件时,这些修改是否会丢失?如果在提交'abc123'期间添加了'fileA'会怎么样? – 2013-03-13 19:55:59

+0

这个问题表明该文件在'abc123'提交中被删除。如果在上次提交后修改(或创建)文件,那么这些更改确实会丢失。如果文件在某个时候被添加到git中,您可以使用'git fsck --lost-found'将它恢复到'.git/lost-found/other'中,但这可能会产生许多无用的文件名字,你需要弄清楚它是哪个文件。 – qqx 2013-03-13 20:15:38