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

lur*_*her 470 git git-checkout

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

git checkout -- <file>
Run Code Online (Sandbox Code Playgroud)

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

error: pathspec '<file>' did not match any file(s) known to git.
Run Code Online (Sandbox Code Playgroud)

什么命令将恢复该单个文件而不撤消其他更改?

奖励点:另外,如果我要丢弃的更改是添加文件怎么办?我想知道如何取消这种变化.

twa*_*erg 728

假设你想要撤消类似的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>
Run Code Online (Sandbox Code Playgroud)

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

  • ` - `是关键.`git reset <file>`不起作用,这就是我带到这里的原因. (59认同)
  • @handsv这不是严格要求的(你可以选择`git reset HEAD <file>`,这是等效的),但是`git reset`将`end-of-options-marker`之前的第一个参数视为ref名称,而不是文件名.可以更灵活地写一下吗?大概.为什么不呢?可能只有开发人员才知道. (4认同)
  • @NeerajB。手册页概要说`git reset [-q] [&lt;tree-ish&gt;] [--] &lt;paths&gt;...`。如果你的 `&lt;file&gt;` 参数与 `&lt;tree-ish&gt;`(一个分支,或 `HEAD` 或一个标签或 ...)的名称匹配,那么它会做一些你想象的事情,如果你不使用`--`。这就是它存在的原因。 (4认同)
  • 为什么仅在已删除文件的情况下需要`end-of-options-marker`? (2认同)
  • @twalberg`git reset filename`适用于未删除的文件. (2认同)

sep*_*010 51

这两个问题都得到了解答git status.

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

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

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

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

另一方面,git checkout --永远不要失败,它只会丢弃非分阶段的变化.

  • 我没有在Debian的git 1.7.2.5中看到删除文件的提示. (5认同)
  • 一般来说,至少从 git 2.24.3 开始,现在是 `git Restore --staged returned-file` (但也可能是更早的版本) (2认同)

Ben*_*son 11

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

一旦你上传了一个文件(通常有git add,但是其他一些命令也隐含地对这些更改进行了调整,例如git rm),你可以退出该更改git reset -- <file>.

在您的情况下,您必须已经习惯git rm删除该文件,这相当于简单地删除它,rm然后暂存该更改.如果你先与它一起取消它,git reset -- <file>那么你可以恢复它git checkout -- <file>.


mic*_*ver 7

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

git reset COMMIT_HASH file_path
git checkout COMMIT_HASH file_path
git add file_path
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

git restore --staged -- <file>