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

Sep*_*ram 185 git

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

git add -- .
Run Code Online (Sandbox Code Playgroud)

...代替:

git checkout -- .
Run Code Online (Sandbox Code Playgroud)

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

tha*_*era 290

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

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

此外,还可以通过使用来取消暂存文件中的某些更改git reset -p.

  • 多么悲伤.我想毕竟我的承诺做法有些不对劲.接受这个答案,因为你提到`-p`开关.谢谢!:) (3认同)

kni*_*ttl 39

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

git reset
Run Code Online (Sandbox Code Playgroud)

  • "你无法撤消_latest_ git add":哇,这是令人惊讶的,也可能是痛苦的.这有明确的来源吗?此外,它有一个很好的理由吗?谢谢! (2认同)

sta*_*anm 15

所以真正的答案

这个程序员现在可以通过一些神奇的git命令取消他的最后一次更改吗?

实际上是:不,你不能只是最后一次git add.

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

初始档案:

void foo() {

}

main() {
    foo();
}
Run Code Online (Sandbox Code Playgroud)

首先改变后跟git add:

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

main() {
    foo(1337);
}
Run Code Online (Sandbox Code Playgroud)

第二次改变后跟git add:

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

main() {
    foo(1337, "h4x0r");
}
Run Code Online (Sandbox Code Playgroud)

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

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

main() {
    foo(1337);
}
Run Code Online (Sandbox Code Playgroud)

更多.

  • 我很高兴,因为作为一个新的 git 用户,这是一个非常重要的区别,它突出了我的朋友所描述的“具有良好的签入卫生”......我的个人经历 - 它被描述为“拼车”(糟糕!)。 (2认同)

dav*_*ids 5

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