协慌网

登录 贡献 社区

如何在提交前撤消'git add'?

1
88250
贡献值 285
贡献次数 1

我不小心把不需要提交的文件给提交了:

git add myfile.txt

我还没有运行 git commit。有没有办法撤消 git add,让文件不要包含在提交内?

答案

1
88250
贡献值 586
贡献次数 1

你可以在提交之前撤消git add的,这样做就可以了:

git reset <file>

这将从当前索引(“提交” 列表)中删除它而不更改任何其他内容。

使用

git reset

不指定文件名的话会撤销所有变更,如果文件太多时可以这么做。

在旧版本的 Git 中,上面的命令分别等同于 git reset HEAD <file>git reset HEAD ,如果未指定 HEAD(比如没有任何变更)或者 HEAD 模棱两可(你创建了名为 HEAD 的分支)会导致执行失败。不过在 Git 1.8.2 中已经改了 ,新版 Git 中你可以在第一次提交之前(没有任何变更前)就使用上面的命令:

之前当你在没有任何提交时使用 “git reset”(没有选项或参数)会报错,目前不会报错了,并会为你创建一个空索引用来匹配不存在的提交。

你要:

git rm --cached <added_file_to_undo>

推理:

当我刚接触这个时,我首先尝试过

git reset .

(撤消我的整个初始添加),只是为了得到这个(不那么)有用的消息:

fatal: Failed to resolve 'HEAD' as a valid ref.

事实证明,这是因为 HEAD ref(branch?)直到第一次提交后才存在。也就是说,如果你的工作流程像我一样,你会遇到和我一样的初学者问题:

  1. cd 到我伟大的新项目目录,尝试 Git,新的热点
  2. git init
  3. git add .
  4. git status

    ...... 很多废话卷轴......

    => 该死,我不想加上所有这些。

  5. 谷歌 “撤消 git 添加”

    => 查找 Stack Overflow - yay

  6. git reset .

    => 致命:无法将'HEAD' 解析为有效的参考号。

事实证明,在邮件列表中存在一个针对此无益的错误

并且正确的解决方案就在 Git 状态输出中(是的,我把它作为 '废话' 掩盖了)

...
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
...

而解决方案确实是使用git rm --cached FILE

请注意此处其他地方的警告 - git rm删除文件的本地工作副本,但如果使用--cached 则 不会删除。这是git help rm的结果:

--cached 使用此选项仅从索引中取消暂存和删除路径。将保留工作树文件,无论是否已修改。

我继续使用

git rm --cached .

删除所有内容并重新开始。虽然没有工作,因为虽然add .是递归的,结果是rm需要-r来递归。叹。

git rm -r --cached .

好的,现在我回到了我开始的地方。下次我要使用-n进行干运行,看看会添加什么:

git add -n .

我把所有东西都拉到一个安全的地方,然后相信git help rm关于--cached没有破坏任何东西(如果我拼错它会怎么样)。

如果您输入:

git status

git 会告诉你什么是上演的,包括如何取消演出的说明:

use "git reset HEAD <file>..." to unstage

我发现 git 在推动我在这样的情况下做正确的事情方面做得非常好。

注意:最近的 git 版本(1.8.4.x)已更改此消息:

(use "git rm --cached <file>..." to unstage)