是否可以取消git中最后一次分阶段(未提交)的更改?假设当前分支中有很多文件,有些是暂存的,有些没有。在某些时候,一些愚蠢的程序员不小心执行了:
git add -- .
...代替:
git checkout -- .
这个程序员现在可以用一些神奇的git命令取消他最后的更改吗?还是他应该在实验之前就做出承诺?
是否可以取消git中最后一次分阶段(未提交)的更改?假设当前分支中有很多文件,有些是暂存的,有些没有。在某些时候,一些愚蠢的程序员不小心执行了:
git add -- .
...代替:
git checkout -- .
这个程序员现在可以用一些神奇的git命令取消他最后的更改吗?还是他应该在实验之前就做出承诺?
您可以使用git reset
. 这将“取消暂存”您在上次提交后添加的所有文件。
如果您只想取消暂存某些文件,请使用git reset -- <file 1> <file 2> <file n>
.
也可以通过使用取消暂存文件中的一些更改git reset -p
。
您无法撤消最新的git add,但您可以撤消add
自上次提交以来的所有 s。git reset
没有提交参数会重置索引(取消分阶段更改):
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
(请参阅文档)
在日期 git 提示:
use "git rm --cached <file>..." to unstage
如果文件不在仓库中。它取消暂存文件,将它们保存在那里。use "git reset HEAD <file>..." to unstage
如果文件在 repo 中,并且您将它们添加为已修改。它保持文件原样,并取消暂存它们。据我所知,您无法撤消该操作,git add --
但您可以取消暂存上述文件列表。
从索引中删除文件,但保留它的版本并在工作副本中保留未提交的更改:
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>
您可以使用
git reset
撤消最近添加的本地文件
git reset file_name
撤消对特定文件的更改
根据难度的大小和规模,您可以创建一个临时(临时)分支并在那里提交当前工作。
然后切换到并签出您的原始分支,并从草稿提交中选择适当的文件。
至少您将拥有当前和以前状态的永久记录(直到您删除该临时分支)。