提交前如何撤销 Git 中的删除操作?

54

我不小心执行了以下命令:

git rm filename.txt -f

现在如果我执行git commit -m '',它会提交这个删除操作。在执行 git commit 命令之前,如何取消文件的删除操作呢?


我相信你不会经常使用空消息进行提交…… - Cascabel
有点尴尬,但是没错...在使用Subversion时我确实经常这样做。但幸运的是,默认情况下git commit会要求我填写一条消息。 - John
2
我的建议是只运行 git commit(不带参数),让它打开编辑器并引导你完成。 - Cascabel
1个回答

87

要将当前提交(HEAD)的版本放入索引(暂存区,即将提交的内容)和工作树中:

git checkout HEAD filename.txt

请注意,这不仅适用于“撤销”操作-它可以让您回到提交版本的状态,无论您是通过更改一行代码还是删除整个文件来进行修改。

另外,如果其他人正在查找略微不同的答案,要将版本从索引返回到工作目录中,可以使用以下命令:

git checkout filename.txt

当你成功地将所有更改暂存到commit中,然后因犯了个错误(比如误删文件)时,恢复索引可以帮助你自救。


+1 特别是提到了这也会将文件暂存 - 我认为这会导致混淆,因为(在 S.O. 上)人们通常在描述 git checkout <tree-ish> -- <path> 的效果时不会提到这一点。 - Mark Longair
@Mark:啊,是的,这可能会让你感到意外。如果你把索引看作是所有操作的工作树和存储库之间的中间层,而不仅仅是工作树->索引->提交,那么它就更有意义了。 - Cascabel
有关特殊字符的任何提示?我尽量不在文件名中使用它们,但在这种情况下:git checkout HEAD "...logo-construcci\303\263n.svg" 带有西班牙口音的文件找不到:error: pathspec '...logo-construcci\303\263n.svg' did not match any file(s) known to git. 但是git状态显示:deleted: "...logo-construcci\303\263n.svg" - Alexandru Trandafir Catalin
1
@AlexandruTrandafirCatalin 尝试使用制表符自动完成或通配符,如果没有类似的文件名需要担心 (...logo-construcci*n.svg)? - Cascabel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接