在git中取消删除已删除的文件

时间:2012-03-06 20:33:42

标签: git git-checkout

通常,要放弃对文件的更改:

git checkout -- <file>

如果我要放弃的更改是删除文件怎么办?上面的行会出错:

error: pathspec '<file>' did not match any file(s) known to git.

在不撤消其他更改的情况下,什么命令将恢复该单个文件?

奖励点另外,如果我要放弃的更改添加文件怎么办?我想知道如何取消这一变化。

7 个答案:

答案 0 :(得分:658)

假设您要撤消git rm <file>rm <file>后跟git add -A或类似内容的影响:

# this restores the file status in the index
git reset -- <file>
# then check out a copy from the index
git checkout -- <file>

要撤消git add <file>,上面的第一行就足够了,假设您尚未提交。

答案 1 :(得分:48)

这两个问题都在git status中解答。

要取消添加新文件,请使用git rm --cached filename.ext

# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   test

要取消暂停删除文件,请使用git reset HEAD filename.ext

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

另一方面,git checkout --永远不会失效,只会丢弃非分阶段的变化。

答案 2 :(得分:10)

您的两个问题的答案是相关的。我将从第二个开始:

暂存文件后(通常使用git add,虽然其他一些命令也会隐式更改这些更改,例如git rm),您可以使用git reset -- <file>撤消该更改。< / p>

在您的情况下,您必须使用git rm删除该文件,这相当于只需使用rm删除它,然后暂存该更改。如果您首先使用git reset -- <file>取消暂存,则可以使用git checkout -- <file>恢复它。

答案 3 :(得分:7)

如果已经暂存并提交,则以下内容将重置文件:

git reset COMMIT_HASH file_path
git checkout COMMIT_HASH file_path
git add file_path

这适用于之前发生过几次提交的删除。

答案 4 :(得分:4)

git v2.23开始,您还有另一个选择:

git restore --staged -- <file>

答案 5 :(得分:0)

我尝试了上述解决方案,但仍然遇到困难。我还有其他文件,其中有两个文件被意外删除。

要撤消两个已删除的文件,我必须撤消所有文件的工作:

git reset HEAD .

那时,我可以对已删除项目进行结帐:

git checkout -- WorkingFolder/FileName.ext

最后,我能够重新整理其余文件并继续进行提交。

答案 6 :(得分:0)

在手册页上,

git-reset - Reset current HEAD to the specified state
git reset [-q] [<tree-ish>] [--] <paths>...
In the first and second form, copy entries from <tree-ish> to the index.

例如,当我们使用git reset HEAD~1时 它将我们当前的HEAD重置为HEAD〜1

所以当我们使用git reset 'some-deleted-file-path'

git假定“ some-deleted-file-path”作为某个提交点,然后尝试将当前的HEAD重置到该位置。

以失败告终

fatal: ambiguous argument 'some-deleted-file-path': unknown revision or path not in the working tree.