1

假设我fileA在 commit中删除了abc123。然后,当 I 时,显示git reset的输出被删除。不再在我的工作目录中,所以我无法重新添加它。git difffileAfileA

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

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

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

解决方案

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

4

3 回答 3

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如果您在索引或工作树中没有您关心的任何其他更改,您也可以使用。

于 2013-03-13T19:31:00.840 回答
1

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

git checkout HEAD -- fileA 
于 2013-03-13T19:31:05.197 回答
1

您可以从特定版本签出单个文件:

git checkout abc123~ -- fileA

由于提交 ID 后面的波浪号 ( ),这将检查fileA它在提交之前的提交中存在的版本。这会与工作树一起修改索引,因此就好像文件也被添加了一样。如果不希望这样做,您可以使用从索引中删除文件,同时将其保留在工作副本中。abc123~git rm --cached fileA

于 2013-03-13T19:36:40.597 回答