通常,要放弃对文件的更改:
git checkout -- <file>
如果我要放弃的更改是删除文件怎么办?上面的行会出错:
error: pathspec '<file>' did not match any file(s) known to git.
在不撤消其他更改的情况下,什么命令将恢复该单个文件?
奖励点另外,如果我要放弃的更改添加文件怎么办?我想知道如何取消这一变化。
答案 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.