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


504

通常,要放弃对文件的更改,您可以执行以下操作:

git checkout -- <file>

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

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

用什么命令可以还原单个文件而不撤消其他更改?

优点:另外,如果我要放弃的更改是添加文件怎么办?我也想知道如何取消变更。


1
放弃更改和暂存是两个不同的事情,您正在尝试做什么?
安德鲁·马歇尔

1
在一篇文章中,这是两个不同的问题。这会使答案变得太多,也不必要地造成混淆。
David Sopko

Answers:


778

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


69
--是关键。git reset <file>不起作用,这就是让我来到这里的原因。

但这还将还原所有修改。如果我只想还原所有已删除的文件怎么办。并保持所有修改不变。
Dainius Kreivys

2
为什么仅end-of-options-marker在删除文件的情况下需要?
haridsv

4
@handsv并不是严格要求的(您可以选择do git reset HEAD <file>,它是等效的),但是git reset将其第一个参数end-of-options-marker用作参考名称,而不是文件名。可以写得更灵活些吗?大概。为什么不呢 可能只有开发人员才能确定。
twalberg

2
@twalberg git reset filename适用于未删除的文件。
布赖恩·戈登

56

都回答了两个问题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 --从不撤消,它只会丢弃未撤消的更改。


5
我在Debian上的git 1.7.2.5中看不到删除文件的提示。
2015年

很高兴看到git status被引用;向用户展示了现在和下一次自助的方式,以防在将来的git版本中添加或更新信息。
威尔该隐

错了 “更改承诺”,也就是你看到之前git reset之后git reset,你看“改变,但没有更新”,这意味着在Git作者的母语“的变化不是上演”,显然。更重要的是,关于“ git status告诉您所知道的一切”的整个教条都是谎言。(那些说浪费时间的管理者,应该被解雇。)
personal_cloud

11

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

暂存文件后(通常使用git add,尽管也有一些其他命令隐式地暂存更改,例如git rm),您可以使用撤消更改git reset -- <file>

在您的情况下,您必须曾经git rm删除过文件,这等效于简单地将其删除rm然后进行更改。如果您先将其撤台,则git reset -- <file>可以使用进行恢复git checkout -- <file>


7

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

git reset COMMIT_HASH file_path
git checkout COMMIT_HASH file_path
git add file_path

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


1
效率更高git revert COMMIT_HASH
Flair

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.