1189

如何取消提交我在 git 中的最后一次提交?

是吗

git reset --hard HEAD

或者

git reset --hard HEAD^

?

4

8 回答 8

1875

如果您不完全确定“取消提交”是什么意思并且不知道是否要使用git reset,请参阅“恢复到以前的 Git 提交”。

如果您想git reset更好地理解,请参阅“您能用简单的英语解释一下“git reset”的作用吗? ”。


如果您知道要使用git reset,这仍然取决于“取消提交”的含义。如果您只想撤消提交的行为,保持其他所有内容不变,请使用:

git reset --soft HEAD^

如果您想撤消提交行为和您上演的所有内容,但保持工作树(您的文件)完好无损:

git reset HEAD^

如果您真的想完全撤消它,丢弃所有未提交的更改,将所有内容重置为上一次提交(如原始问题所问):

git reset --hard HEAD^

原来的问题也问它HEAD^不是HEADHEAD指当前提交 - 通常是当前签出分支的尖端。这^是一个可以附加到任何提交说明符的符号,意思是“之前的提交”。所以,HEAD^是当前提交之前的提交,就像master^主分支尖端之前的提交一样。

这是git-rev-parse 文档的一部分,描述了指定提交的所有方法(^只是众多方法中的一种)。

于 2010-05-17T00:52:18.233 回答
565

git reset --soft HEAD^将修改后的更改保留在您的工作树中。

git reset --hard HEAD^ 将丢弃您所做的更改!

于 2010-05-16T22:29:42.220 回答
360

要保留要撤消的提交中的更改

git reset --soft HEAD^

从要撤消的提交中销毁更改

git reset --hard HEAD^

你也可以说

git reset --soft HEAD~2

返回 2 个提交。

编辑:正如 charsi 所提到的,如果您在 Windows 上,则需要将 HEAD 或提交哈希放在引号中。

git reset --soft "HEAD^"
git reset --soft "asdf"
于 2012-11-20T19:12:12.510 回答
114

当心 ! reset --hard也会删除您的本地(未提交)修改。

git reset --hard HEAD^

注意:如果你在 Windows 上,你需要引用 HEAD^ 所以

git reset --hard "HEAD^"

如果您想在不放弃工作的情况下恢复提交,请使用--soft标志而不是 --hard

git reset --soft HEAD^
于 2010-05-16T22:28:42.707 回答
39

请注意 - 如果您使用的是 ZSH 并看到错误

zsh: no matches found: HEAD^

你需要逃避^

git reset --soft HEAD\^
于 2013-09-12T12:54:24.957 回答
32

如果你提交到错误的分支

在错误的分支上:

  1. git log -2给你最后一次提交的哈希值,假设$prev$last
  2. git checkout $prev签出正确的提交
  3. git checkout -b new-feature-branch为该功能创建一个新分支
  4. git cherry-pick $last用您的更改修补分支

然后,您可以按照上面建议的方法之一从第一个分支中删除您的提交。

于 2015-01-24T01:26:55.590 回答
20

如果您尚未推送更改,请使用git reset --soft [Hash for one commit]回滚到特定提交。--soft告诉 git 保持回滚的更改(即,将文件标记为已修改)。--hard告诉 git 删除正在回滚的更改。

于 2014-10-22T21:07:30.913 回答
4

小心点。

但是你可以使用 rebase 命令

git rebase -i HEAD~2

Avi将打开,您所要做的就是删除带有提交的行。还可以阅读正确版本 @ 中显示的说明vi。在此模式下可以执行几件事。

于 2014-08-12T14:44:29.487 回答