是否可以取消 git 中的最后一次(未提交)更改?假设当前分支中有很多文件,有些是暂存的,有些则没有。在某些时候,一些愚蠢的程序员意外地执行了:
git add -- .
...而不是:
git checkout -- .
这位程序员现在可以通过一些神奇的 git 命令取消他的最后一次更改吗?或者他应该在首先尝试之前做出承诺吗?
答案 0 :(得分:288)
您可以使用git reset
。这将“取消”您上次提交后添加的所有文件。
如果您只想取消暂停某些文件,请使用git reset -- <file 1> <file 2> <file n>
。
还可以使用git reset -p
取消暂存文件中的某些更改。
答案 1 :(得分:38)
您无法撤消最新 git add,但您可以撤消自上次提交以来的所有add
。没有commit参数的git reset
重置索引(unstages staged changes):
git reset
答案 2 :(得分: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);
}
。
答案 3 :(得分:5)
您可以使用git reset
(请参阅docs)
答案 4 :(得分:3)
日期git提示:
use "git rm --cached <file>..." to unstage
如果文件不在回购邮件中。它会将文件保留在那里以保存它们。use "git reset HEAD <file>..." to unstage
如果文件在repo中,并且您将其添加为已修改。它保存文件,并取消它们。据我所知,您无法撤消git add --
,但您可以取消上面提到的文件列表。
答案 5 :(得分: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>
答案 6 :(得分:2)
如果您想从git for
删除所有添加的文件git reset
如果您想删除单个文件
git rm <file>
答案 7 :(得分:1)
您可以使用
git reset
撤消最近添加的本地文件
git reset file_name
撤消对特定文件的更改
答案 8 :(得分:0)
根据难度的大小和规模,您可以创建一个临时(临时)分支并在那里提交当前的工作。
然后切换到并检出原始分支,并从临时提交中选择适当的文件。
至少你会有一个永久记录当前和以前的状态(直到你删除该临时分支)。