你怎么能撤消最后一个git add?

时间:2012-08-26 17:21:06

标签: git

是否可以取消 git 中的最后一次(未提交)更改?假设当前分支中有很多文件,有些是暂存的,有些则没有。在某些时候,一些愚蠢的程序员意外地执行了:

git add -- .

...而不是:

git checkout -- .

这位程序员现在可以通过一些神奇的 git 命令取消他的最后一次更改吗?或者他应该在首先尝试之前做出承诺吗?

9 个答案:

答案 0 :(得分:288)

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

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

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

答案 1 :(得分:38)

您无法撤消最新 git add,但您可以撤消自上次提交以来的所有add。没有commit参数的git reset重置索引(unstages staged changes):

git reset

答案 2 :(得分: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);
}

答案 3 :(得分:5)

您可以使用git reset(请参阅docs

答案 4 :(得分:3)

日期git提示:

  1. use "git rm --cached <file>..." to unstage如果文件不在回购邮件中。它会将文件保留在那里以保存它们。
  2. use "git reset HEAD <file>..." to unstage如果文件在repo中,并且您将其添加为已修改。它保存文件,并取消它们。
  3. 据我所知,您无法撤消git add --,但您可以取消上面提到的文件列表。

答案 5 :(得分: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>
    

答案 6 :(得分:2)

如果您想从git for

删除所有添加的文件
git reset

如果您想删除单个文件

git rm <file>

答案 7 :(得分:1)

您可以使用

git reset

撤消最近添加的本地文件

 git reset file_name

撤消对特定文件的更改

答案 8 :(得分:0)

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

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

至少你会有一个永久记录当前和以前的状态(直到你删除该临时分支)。