200

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

git add -- .

...代替:

git checkout -- .

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

4

9 回答 9

309

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

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

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

于 2012-08-26T17:59:35.023 回答
42

您无法撤消最新的git add,但您可以撤消add自上次提交以来的所有 s。git reset没有提交参数会重置索引(取消分阶段更改):

git reset
于 2012-08-26T17:39:25.977 回答
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);
}

不再。

于 2015-10-17T12:35:38.350 回答
6

您可以使用git reset(请参阅文档

于 2012-08-26T17:39:32.423 回答
3

在日期 git 提示:

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

据我所知,您无法撤消该操作,git add --但您可以取消暂存上述文件列表。

于 2016-04-06T20:25:59.950 回答
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>
    
于 2017-02-04T05:29:16.427 回答
2

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

git reset

如果要删除单个文件

git rm <file>
于 2017-10-25T11:03:57.650 回答
1

您可以使用

git reset

撤消最近添加的本地文件

 git reset file_name

撤消对特定文件的更改

于 2019-10-16T09:59:29.820 回答
0

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

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

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

于 2012-08-27T13:06:33.653 回答