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

我错误地使用以下命令将文件添加到git:

git add myfile.txt

我还没有运行git commit 。 有没有办法解决这个问题,所以这些文件不会包含在提交中?


您可以在提交之前撤消git add

git reset <file>

这将从当前索引(“即将承诺”列表)中删除它,而不会改变任何其他内容。

您可以使用

git reset

没有任何文件名称以取消所有应有的更改。 当在合理的时间内逐一列出太多文件时,这可以派上用场。

在旧版本的Git中,上述命令分别等同于git reset HEAD <file>git reset HEAD ,如果HEAD未定义(因为您尚未在您的repo中进行任何提交)或模糊(因为您创建了一个名为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?)直到第一次提交后才存在。 也就是说,如果您的工作流程与我的工作流程类似,您将遇到与我一样的初学者问题:

  • 光盘到我的伟大的新项目目录尝试Git,新的热点
  • git init
  • git add .
  • git status

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

    =>该死的,我不想补充所有这些。

  • 谷歌“撤消git添加”

    =>找到堆栈溢出 - 耶

  • git reset .

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

  • 它进一步证明了,在邮件列表中没有记录这个bug的缺点。

    而且正确的解决方案就在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没有破坏任何东西(以及如果我拼写--cached了会怎么样)。


    如果你输入:

    git status
    

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

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

    我发现git在推动我在这种情况下做正确的事情方面做得相当不错。

    注意:最近的git版本(1.8.4.x)已经改变了这个消息:

    (use "git rm --cached <file>..." to unstage)
    
    链接地址: http://www.djcxy.com/p/23.html

    上一篇: How to undo 'git add' before commit?

    下一篇: How to check whether a string contains a substring in JavaScript?