我使用命令错误地将文件添加到 Git :

git add myfile.txt

我还没跑呢git commit。我如何撤销这些修改,使这些修改不包含在承诺中?


当前回答

要重置特定文件夹( 及其子文件夹) 中的每一文件, 您可以使用以下命令 :

git reset *

其他回答

撤消撤消git add用于未承诺更改的更改 :

git reset <file>

这将将文件从当前索引( “ 即将被承诺” 列表) 中删除, 而不更改其它内容 。


取消所有文件的所有更改 :

git reset

在旧的 Git 版本中,上述命令相当于git reset HEAD <file>git reset HEAD或将失效,如果HEAD未定义(因为你尚未在仓库中做出任何承诺)或模糊(因为你创建了一个分支,称为:HEAD这是你不该做的蠢事在Git 1.8.2中更改。,所以在现代版本的 Git 中,你可以使用上面的命令,甚至在你第一次做出承诺之前:

当您在历史中没有任何承诺时, “ 将重置” (没有选项或参数) 用于错误退出, 但它现在给了您一个空索引( 匹配不存在的重置, 您甚至没有在 ) 。

文 件:git 重设

缩略git reset命令帮助您修改中转区域或中转区域以及工作树。 Git 的手工能力与您想要的完全一样,意味着有时需要取消对您所要的修改的修改git add.

你可以通过拨打电话来做到这一点git reset HEAD <file to change>。您有两种选择可以完全消除变化。git checkout HEAD <file(s) or path(s)>是一种快速的方法 来消除改变你的中转区和工作树的改变。

但是要小心这个命令, 因为它会消除你工作树上的所有变化。 Git 根本不知道这些变化, 因为他们从未被执行过。 一旦你执行这个命令, 就没有办法让这些变化回来 。

您可支配的另一个命令是git reset --hard。它同样会破坏您的工作树,任何未承诺的改变或分阶段的改变在运行后都会丢失。运行中git reset -hard HEAD做同样的事情git checkout HEAD。它只是不需要文件或工作路径。

您可以使用--softgit reset。它将存储库重新设置为您指定和分阶段进行所有这些修改的承诺。您已经进行的任何修改都不会受到影响,工作树上的修改也不会受到影响。

最终,你可以使用--mixed将工作树重置,不进行任何修改。这也将取消任何正在准备的修改。

在源树中,您可以通过 GUI 轻松地做到这一点。您可以检查源树命令用什么来取消文件 。

我创建了一个新的文件, 并将其添加到 Git 中。 然后我用“ 原始树 GUI” 解除了它。 这是结果 :

解除文件 [08/12/ 15 10: 43] git - c diff. mnemonicprefix= false - c c c核心. cootepath= false - creedical. helper= 源树重新设置 -q - 路径/ 到/ 文件/ files/ filename.java

源树用途reset以卸载新文件。

您想要 :

git rm --cached <added_file_to_undo>

理由:

当我刚开始做这个的时候,我第一次尝试

git reset .

(取消我最初添加的全部内容), 只是为了得到这个(不是这样的)有用信息:

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

结果发现,这是因为 HEAD ref (blanch?) 直到第一次承诺之后才存在。 这就是说,你会遇到跟我一样的初学者的问题, 如果你的工作流程像我的一样, 像是:

  1. Cd 我伟大的新项目目录 试探Git, 新的热度
  2. git init
  3. git add .
  4. git status

    ...很多垃圾卷轴 通过...

    该死,我不想加上这些

  5. google “ 未跳过 git 添加 ”

    找到堆叠溢出

  6. git reset .

    致命: 解决“ HEAD” 有效参考失败 。

更进一步发现a 窃听器记录与邮件列表中的无益对比。

正确的解决方案就在 Git 状态输出中( 是的, 我将它伪装成“ 废话 ” ) 。

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

解决的确是使用git rm --cached FILE.

请注意这里其他地方的警告-git rm删除本地文件的工作副本,但使用-- -- cooked。以下是git help rm:

--cached 使用此选项来卸载和从索引中删除路径。 工作树文件, 不论是否修改, 都会被左移 。

我开始使用

git rm --cached .

把所有东西都搬走,重新开始。虽然没有成功,因为当add .循环,结果rm需要满足的需求-r来重复。 叹气 。

git rm -r --cached .

好了,现在我回到我开始的地方 下次我再用-n以进行一个干燥的运行,然后观察将要增加什么:

git add -n .

在信任之前,我把所有东西都拉到一个安全的地方git help rm关于 The 的--cached你们不要毁灭任何物,如果我误译了它,

问题未明确提出,原因是:git add有两个含义:

  1. 添加 a新文件到集结区,然后撤消git rm --cached file.
  2. 添加 a修改后撤消区域文件,然后用git reset HEAD file.

如果有疑问,使用

git reset HEAD file

因为它在两种情况下都做了预期的事

警告 :如果有的话git rm --cached file档案中修改后(一个之前在存储库中存在的文件) , 然后文件将会在git commit! 它将仍然存在于您的文件系统中, 但是如果有其他人拉动您的承诺, 文件将会从他们的工作树上删除 。

git status将会告诉你,如果文件是新文件修改后:

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   my_new_file.txt
    modified:   my_modified_file.txt