我不小心把不需要提交的文件给提交了:
git add myfile.txt
我还没有运行 git commit
。有没有办法撤消 git add,让文件不要包含在提交内?
你可以在提交之前撤消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?)直到第一次提交后才存在。也就是说,如果你的工作流程像我一样,你会遇到和我一样的初学者问题:
git init
git add .
git status
...... 很多废话卷轴......
=> 该死,我不想加上所有这些。
谷歌 “撤消 git 添加”
=> 查找 Stack Overflow - yay
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)