你怎样才能撤消最后的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提示:
- 如果文件不在repo中,
use "git rm --cached <file>..." to unstage
。 它将文件保留在那里。 - 如果文件在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>