如何从git分支恢复单个暂存的已删除文件?

时间:2017-08-24 21:12:56

标签: git

我正在尝试从我的本地分支恢复暂存的已删除文件。我尝试了git checkout文件名,但它没有用。我不想使用重置硬盘,因为它会重置我对其他文件所做的所有必要更改。那么有没有办法只恢复已删除的文件?

2 个答案:

答案 0 :(得分:0)

有几种方法可以做到这一点。 git reset <filename>应仅重置单个文件。

您也可以执行git show HEAD:<filename>并将输出保存回 filename ,然后再将git add重新保存。

答案 1 :(得分:0)

让我们先重述一下这个问题。

鉴于此git status的输出:

$ git status
On branch SOMEBRANCH
Your branch is up-to-date with ...

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        deleted:    SOMEFILE

您现在希望将文件SOMEFILE恢复到工作树和索引中,以便git status输出deleted: SOMEFILE

方法1:遵循建议git status给出

如果您遵循git status本身打印的建议:

$ git reset HEAD SOMEFILE

状态将变为:

$ git status
On branch SOMEBRANCH
Your branch is up-to-date with ...

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:    SOMEFILE

现在你必须在git status中再次提出建议:

$ git checkout -- SOMEFILE

方法2(捷径)

方法1上方的文字是快捷方式的关键。我们希望将文件SOMEFILEHEAD提交复制到索引中,然后将文件SOMEFILE从索引复制到工作树中。有一个命令可以执行此操作:它是git checkout

$ git checkout HEAD -- SOMEFILE

诀窍是当你说git checkout -- SOMEFILE时,你告诉Git将文件从索引复制到工作树。

这就是为什么按照git status建议的方式执行它需要两个步骤:第一步git reset HEAD SOMEFILE将文件从HEAD提交复制到索引。第二步git checkout -- SOMEFILE将文件从索引复制到工作树。使用git checkout HEAD -- SOMEFILE语法,我们将Git从HEAD复制到索引,然后从索引到工作树,所有这些都使用一个命令。

(但git status给出的建议也有效。)