如何在进行本地提交后再次取消暂存我的文件?

时间:2011-07-13 17:05:01

标签: git

我已完成以下命令

git add <foo.java>
git commit -m "add the foo java"

如何立即删除我的本地提交并使foo.java处于未暂停状态?

如果我输入git reset --hard,我发现它会将我的修改foo.java还原为原始的。

7 个答案:

答案 0 :(得分:339)

git reset --soft HEAD~1应该做你想做的事。在此之后,您将在索引中进行第一次更改(使用git diff --cached可见),并且您的最新更改不会暂存。 git status将如下所示:

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   foo.java
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   foo.java
#

然后,您可以执行git add foo.java并立即提交两项更改。

答案 1 :(得分:60)

使用:

git reset HEAD^

默认情况下执行“混合”重置,这会按照您的要求执行;把foo.java放在unstaged中,删除最近的提交。

答案 2 :(得分:35)

git reset --soft就是为了这个:它就像git reset --hard,但不会触及文件。

答案 3 :(得分:33)

对我来说,以下内容始终更具可读性(因此更可取):

git reset HEAD~1

而不是1,可能会有任意数量的提交想要取消暂存。

答案 4 :(得分:6)

用于取消上次提交中的所有文件 -

git reset HEAD~

答案 5 :(得分:0)

“重置”是在本地撤消更改的方法。提交时,首先选择要包含在“ git add ”中的更改,这称为“登台”。一旦进行了更改,就可以“ git commit ”。

要退出登台或提交,请“重置” HEAD。在分支上,HEAD是指向最近提交的git变量。因此,如果您已上演但尚未提交,则可以“ git reset HEAD ”。通过将更改从舞台上备份到当前HEAD。它是“ git reset --mixed HEAD〜0 ”的简写。

如果您已经提交,则HEAD已经提前,因此您需要备份到上一次提交。在这里,您“ 重置HEAD〜1 ”或“ 重置HEAD ^ 1 ”或“ 重置HEAD〜”或“ 重置HEAD ^ ”-所有参考HEAD减一。

〜或^是哪个更好的符号?将〜波浪号视为单个流 -当每个提交具有单个父级并且顺序上只是一系列更改时,则可以使用波浪号将备份流引用为HEAD〜 1,HEAD〜2,HEAD〜3,用于父母,祖父母,曾祖父母等(从技术上讲,它是在较早的一代中找到第一个父母)。

合并时,提交中有多个父级。那是^插入符开始起作用的时候-您可以记住,因为它显示分支汇聚在一起。使用插入符号,HEAD ^ 1将是单个提交的第一个父级,而HEAD ^ 2将是单个提交的第二个父级,例如,母亲和父亲。

因此,如果您只是在单亲提交中返回一跳,则HEAD〜和HEAD ^是等效的-您可以使用任一。

此外,重置可以是-soft -mixed -hard 。软重置只会撤消提交,它会重置HEAD,但不会从较早的提交中签出文件,因此会保留工作目录中的所有更改。而且-soft 重置甚至都无法清除阶段(也称为 index ),因此所有已暂存的文件仍将处于暂存状态。

一个-mixed 重置(默认设置)也不会从较早的提交中检出文件,因此保留了所有更改,但清除了该阶段。这就是为什么简单的“ git reset HEAD ”将清除舞台的原因。

-hard 重置会重置HEAD,并清除阶段,但它还会从较早的提交中检出所有文件,因此会覆盖所有更改。

如果您已将提交推送到远程存储库,则重置效果不佳。您可以在本地重置,但是当您尝试推送到远程时,git会看到您的本地HEAD在远程分支的HEAD后面,并且会拒绝推送。您也许可以强制执行推送,但是git确实不喜欢这样做。

或者,如果您想保留更改,可以存储签出较早的提交,取消存储更改,暂存它们,创建新的提交,然后将其推送。

答案 6 :(得分:0)

让我们说您要取消更改直至n次提交,

提交哈希如下:

  • h1
  • h2 ...
  • hn
  • hn + 1

然后运行以下命令:
git reset hn

现在,HEAD将位于hn + 1。从h1到hn的更改将是无阶段的。