你怎样才能撤消最后的git add?

是否有可能取消最后阶段(未提交)在git中的变化? 假设当前分支有很多文件,有些是上演的,有些则不是。 在某些时候,一些愚蠢的程序员不小心执行了:

git add -- . 

…代替:

 git checkout -- . 

这个程序员现在可以用一些神奇的git命令取消最后的变化吗? 还是应该先做实验呢?

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

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

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

你不能撤销最新的 git add,但你可以撤消自上次提交以来的所有add 。 没有提交参数的git reset会重置索引(unstages staged changes):

 git reset 

所以真正的答案

这个程序员现在可以用一些神奇的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 reset (请参阅文档 )

在dategit提示:

  1. 如果文件不在repo中, use "git rm --cached <file>..." to unstage 。 它将文件保留在那里。
  2. 如果文件在repo中, use "git reset HEAD <file>..." to unstage存储,并且你正在修改它们。 它保持文件原样,并将它们分开。

据我所知,你不能撤消git add --但你可以取消上面提到的文件列表。

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

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

至less你将有一个永久logging的当前和以前的状态工作(直到你删除该分支)。

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

     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> 

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

 git reset 

如果你想删除一个单独的文件

 git rm <file>