在git中取消已删除的文件

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

git checkout -- <file>

如果我想要丢弃的更改是删除文件呢?上面的代码行会给出一个错误:

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

什么命令可以在不取消其他更改的情况下恢复该单个文件?

同样,如果我想要丢弃的更改是添加一个文件呢?我也想知道如何消除这种变化。

274104 次浏览

这两个问题都在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 --从来不取消阶段,它只是丢弃非阶段的更改。

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

一旦您执行了一个文件(通常使用git add,尽管其他一些命令也隐式执行更改,如git rm),您可以使用git reset -- <file>退出更改。

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

假设你想要撤销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>,上面的第一行就足够了,假设您还没有提交。

如果它已经被暂存并提交,那么以下命令将重置该文件:

git reset COMMIT_HASH file_path
git checkout COMMIT_HASH file_path
git add file_path

这将适用于前几次提交的删除。

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

# EYZ0

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

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

git reset HEAD .

在这一点上,我能够完成删除项目的签出:

git checkout -- WorkingFolder/FileName.ext

最后,我能够重新部署剩余的文件并继续提交。

从手册页,

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.