如何撤消上一个Git添加?


How can you undo the last git add?

是否可以取消Git中最后阶段(未提交)的更改?假设当前分支中有很多文件,一些是分阶段的,一些不是。在某种程度上,一些愚蠢的程序员意外地执行了:

1
git add -- .

……代替:

1
git checkout -- .

这个程序员现在能用一些神奇的git命令取消他最后的更改吗?或者,他应该在实验之前就做出承诺吗?


您可以使用git reset。这将"取消"上次提交后添加的所有文件。

如果只想取消某些文件的存储,请使用git reset --

此外,还可以使用git reset -p来取消文件中的某些更改。


您不能撤消最新的git add,但可以撤消自上次提交以来的所有add。不带commit参数的git reset重置索引(取消分段更改):

1
git reset


所以真正的答案是

Can this programmer now unstage his last changes with some magical git command?

实际上是:不,你不能只拆下最后一个git add

也就是说,如果我们将问题解释为以下情况:

初始文件:

1
2
3
4
5
6
7
void foo() {

}

main() {
    foo();
}

第一次变更后接git add

1
2
3
4
5
6
7
void foo(int bar) {
    print("$bar");
}

main() {
    foo(1337);
}

第二次变更后接git add

1
2
3
4
5
6
7
void foo(int bar, String baz) {
    print("$bar $baz");
}

main() {
    foo(1337,"h4x0r");
}

在这种情况下,git reset -p将不会有帮助,因为它最小的粒度是行。git不知道以下中间状态:

1
2
3
4
5
6
7
void foo(int bar) {
    print("$bar");
}

main() {
    foo(1337);
}

再。


您可以使用git reset(见文档)


在Git提示的日期:

  • 如果文件不在回购协议中,则为use"git rm --cached ..." to unstage。它会把保存在那里的文件拆开。
  • use"git reset HEAD ..." to unstage,如果文件在repo中,并且您在添加它们时进行了修改。它保持文件的原样,并将其拆下。
  • 据我所知,您不能撤消git add --,但您可以取消对上述文件列表的存储。


    如果要从git中删除所有添加的文件以进行提交

    1
    git reset

    如果要删除单个文件

    1
    git rm <file>


    • 从索引中删除该文件,但保持其版本化,并在工作副本中保留未提交的更改:

      1
      git reset head <file>
    • 将文件从头重设为最后一个状态,撤消更改并将其从索引中删除:

      1
      2
      3
      4
      5
      git reset HEAD <file>
      git checkout <file>

      # If you have a `<branch>` named like `<file>`, use:
      git checkout -- <file>

      这是必需的,因为git reset --hard HEAD不适用于单个文件。

    • 从索引和版本控制中删除,将未版本控制的文件保留在工作副本中:

      1
      git rm --cached <file>
    • 完全删除工作副本和版本控制中的

      1
      git rm <file>


    根据困难的大小和规模,您可以创建一个临时分支并在那里提交当前工作。

    然后切换到并签出原始分支,并从零开始提交中选择适当的文件。

    至少您有一个当前和以前状态的永久记录,可以从中工作(直到您删除该草稿分支)。