您如何撤消最后的git add?


193

是否可以取消登载git的最后一个登台(未提交)更改?假设当前分支中有很多文件,有些已上演,有些则没有。在某些时候,一些愚蠢的程序员不小心执行了:

git add -- .

...代替:

git checkout -- .

现在,该程序员可以使用一些神奇的git命令来取消最后一次更改吗?还是他应该先进行实验才能做出承诺?


h 我们从中得到了一个有用的问题和答案。
Steveha


我相信这不是重复的。OP中的另一个问题是要求一种方法来撤消此操作或从提交中删除这些文件。我想要的是,仅要撤销上一条git add命令所添加的更改,尤其是对于已经进行了更改的文件,以及一些将要撤消而不进行更改的文件。不能说其他问题无关。
Septagram 2015年

1
也许他应该先做/ been /做出承诺。
android.weasel,2015年

@ android.weasel是的,那是很多年前的……
Septagram 2015年

Answers:


298

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

如果只想取消转储某些文件,请使用git reset -- <file 1> <file 2> <file n>

也可以通过使用取消暂存文件中的某些更改git reset -p


3
多么悲伤。我猜我的提交实践毕竟有问题。接受此答案,因为您提到了-p开关。谢谢!:)
Septagram

生成(对我而言)错误:致命:无法将“ HEAD”解析为有效的引用。我还没有提交任何东西(新回购),只是完成了git add。并为此感到遗憾。我不想重置整个添加,仅重置一个目录。git reset-dir /*.*产生以上错误。
弗朗西斯·戴维

...啊,我知道发生了什么事。我没有任何要指向HEAD的东西,所以git reset失败了(因为它在HEAD上运行)。
弗朗西斯·戴维

42

您不能撤消最新的 git add,但是可以撤消add自上一次提交以来的所有。git reset如果没有提交参数,则会重置索引(取消阶段化的更改):

git reset

2
“您不能撤消最新的 git add”:哇,这令人惊讶,并且可能很痛苦。是否有确定的来源?另外,是否应该有充分的理由呢?谢谢!
Andrew Moylan

@AndrewMoylan:嗯,没有自动的方法。您可以始终reset单个文件,也可以reset -p用于取消暂存特定的块。
knittl

15

所以真正的答案

现在,该程序员可以使用一些神奇的git命令来取消最后一次更改吗?

实际上是:不,您不能仅取消最后一个git add

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

初始文件:

void foo() {

}

main() {
    foo();
}

首先更改,其次是git add

void foo(int bar) {
    print("$bar");
}

main() {
    foo(1337);
}

第二次更改,其次是git add

void foo(int bar, String baz) {
    print("$bar $baz");
}

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

在这种情况下,git reset -p将无济于事,因为它的最小粒度是线。git不知道以下情况的中间状态:

void foo(int bar) {
    print("$bar");
}

main() {
    foo(1337);
}

还有。


我之所以喜欢,是因为作为git的新用户,这是一个非常重要的区别,它突出了我的朋友所说的“具有良好的检查卫生”……我的个人经历-被形容为“拼车”(不好!)。
benc


3

在日期git提示:

  1. use "git rm --cached <file>..." to unstage如果文件不在仓库中。它将文件暂存,将其保留在其中。
  2. use "git reset HEAD <file>..." to unstage如果文件在存储库中,并且您将其修改后添加。它将文件保持原样,并取消暂存。

据我所知,您不能撤消该git add --文件,但是可以取消登台上述文件列表。


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

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

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

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

  • <file>从索引和版本控制中删除,使未版本化的文件保持工作副本中的更改:

    git rm --cached <file>
    
  • <file>从工作副本和版本中完全删除:

    git rm <file>
    

2

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

git reset

如果要删除单个文件

git rm <file>

1

您可以使用

git reset

撤消最近添加的本地文件

 git reset file_name

撤消对特定文件的更改


0

根据困难的规模和规模,您可以创建临时的临时分支并在此处提交当前工作。

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

至少您将拥有当前和先前状态的永久记录(直到删除该暂存分支)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.