如何在本地提交后再次取消文件?

已执行以下命令

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

我如何删除我的本地提交现在和取消foo.java?

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

364535 次浏览

使用:

git reset HEAD^

这做一个“混合”重置默认情况下,这将做什么你要求;将foo.java放入unstaging,删除最近的提交。

git reset --soft就是这样:它类似于git reset --hard,但不涉及文件。

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并一次提交两个更改。

对我来说,下面的方法更具可读性(因此更可取):

git reset HEAD~1

而不是1,可以有任意数量的提交你想取消。

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

git reset HEAD~

“重置”是在本地撤销更改的方法。提交时,首先选择要包含在"git添加"中的更改——这被称为"staging "。一旦这些变化被执行,你就可以“git提交”它们。

要从暂存或提交中退出,需要“重置”HEAD。在分支中,HEAD是一个指向最近提交的git变量。因此,如果你已经登台但还没有提交,你“git重置.”通过将更改从舞台上删除,这将备份到当前的HEAD。它是“git重置-混合头~0”的缩写。

如果您已经提交了,那么HEAD已经前进了,所以您需要备份到以前的提交。这里你的“重置头~ 1”或“重置头^ 1”或“重置头~”或“重置头^”——都引用HEAD - 1。

哪个符号更好,~还是^?把~波浪号看作单流——当每次提交都有一个单一的父元素,它只是一系列顺序的变化,然后你可以使用波浪号往回引用流,如HEAD~1, HEAD~2, HEAD~3,用于父元素,祖父母元素,曾祖父元素等等(技术上来说,它在早期代中查找第一个父元素)。

当有merge时,提交有多个父节点。这就是^插入符号起作用的时候——你可以记住,因为它显示了分支连接在一起。使用插入号,HEAD^1将是单个提交的第一个父节点,HEAD^2将是第二个父节点——例如,父节点和母节点。

因此,如果你只是在单亲提交上返回一跳,那么HEAD~和HEAD^是等价的,你可以使用其中任何一个。

此外,重置可以是——软——混合——努力。软重置只是退出提交——它重置HEAD,但不会检出之前提交的文件,因此工作目录中的所有更改都被保留。并且——软重置甚至不会清除舞台(也称为指数),所以所有被舞台的文件仍然会在舞台上。

——混合重置(默认值)也不会检出先前提交的文件,因此所有更改都被保留,但阶段被清除。这就是为什么简单的“git重置”会被清除出舞台。

——努力重置会重置HEAD,并清除舞台,但它也会检出之前提交的所有文件,因此它会覆盖任何更改。

如果你已经将提交推到远程存储库,那么重置就不能很好地工作。你可以在本地重置,但是当你试图推到远程时,git会看到你的本地HEAD在远程分支的HEAD后面,并且会拒绝推。你也许可以强迫推,但git真的不喜欢这么做。

或者,你可以你的更改,如果你想保留它们,看看之前的提交,取消隐藏的更改,阶段它们,创建一个新的提交,然后推送。

假设你想要取消n次提交的更改,

其中提交哈希如下:

  • h1
  • h2……
  • 接下来的
  • hn + 1

执行以下命令 git reset hn < / p >

现在HEAD是hn+1。从h1到hn的更改将是不分段的。