如何解除我在Git中的最后一次提交

ric*_*ard 819 git undo git-reset git-index

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

是吗

git reset --hard HEAD
Run Code Online (Sandbox Code Playgroud)

要么

git reset --hard HEAD^
Run Code Online (Sandbox Code Playgroud)

Cas*_*bel 1303

如果您不完全确定"uncommit"的含义并且不知道是否要使用git reset,请参阅" 恢复到之前的Git提交 ".

如果你想要git reset更好地理解,请参阅" 你能解释一下"git reset"用简单的英语做什么吗? ".


如果你知道你想要使用git reset它,它仍然取决于你的意思"uncommit".如果您要做的就是撤消提交行为,保留其他所有内容,请使用:

git reset --soft HEAD^
Run Code Online (Sandbox Code Playgroud)

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

git reset HEAD^
Run Code Online (Sandbox Code Playgroud)

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

git reset --hard HEAD^
Run Code Online (Sandbox Code Playgroud)

最初的问题也问HEAD^不是HEAD.HEAD指当前提交 - 通常是当前签出分支的提示.这^是一个可以附加到任何提交说明符的表示法,意思是"之前的提交".因此,HEAD^是在当前提交之前的提交,就像master^在主分支的提示之前提交一样.

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

  • @Jefromi:这个问题中的每个答案都是完全错误的 - 强调 - 硬, - 软件,它是"不承认最后提交"的必要条件, - 硬 - 不仅会解除承诺,还会破坏你的提交.我几乎摧毁了一整天的工作,因为我没有重新检查什么 - 硬意味着假设70+的答案不会错.幸运的是,reflog节省了我的一天,但不一定是那样. (44认同)
  • @jameshfisher这是原始问题的答案("这两个中的哪一个是它?")并且在它下面有一个巨大的警告.我正在编辑,但是......如果你看到一个问题从标题看起来像你想要的那样,你只是盲目地运行你在第一个答案中看到的第一个命令,*这将继续发生在你身上*. (13认同)
  • zsh 用户注意事项:使用`git reset 'HEAD^'` (9认同)
  • `get reset --soft HEAD^` 正是我要找的!!!太好了,将更改放入当前工作头的术语是什么?或目录。 (4认同)
  • 如果您唯一的本地提交是第一个提交怎么办? git reset --soft "HEAD^" fatal: 不明确的参数 'HEAD^': 未知修订版或路径不在工作树中。使用“--”将路径与修订版分开,如下所示:“git <command> [<revision>...] -- [<file>...]” (4认同)
  • @EugeneMaksimov `git reset --hard "HEAD^"` 也适用于 Windows (3认同)

Ale*_*x K 297

保持要撤消的提交的更改

git reset --soft HEAD^
Run Code Online (Sandbox Code Playgroud)

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

git reset --hard HEAD^
Run Code Online (Sandbox Code Playgroud)

你也可以说

git reset --soft HEAD~2
Run Code Online (Sandbox Code Playgroud)

回去2次提交.

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

git reset --soft "HEAD^"
git reset --soft "asdf"
Run Code Online (Sandbox Code Playgroud)

  • @VioletGiraffe你可能在windows上,需要做`git reset --soft"HEAD ^"` (20认同)
  • `git reset --soft HEAD ^更多?更多?致命的:模糊的论点'HEAD':未知的修订或路径不在工作树中.使用' - '将路径与修订分开,如下所示:'git <command> [<revision> ...] - [<file> ...]'`到底是什么?为什么什么都不能在`git`中工作?我讨厌它. (11认同)
  • 很好的答案,我做的是在〜/ .gitconfig中创建添加[别名] uncommit = reset --soft HEAD ^ ....然后我可以写git uncommit并且它将软重置最后提交 (5认同)
  • Windows 提示:如果您懒得输入额外的引号,您也可以使用 HEAD~(例如 git reset --soft HEAD~),它与“HEAD^”完全相同:) (3认同)

nfm*_*nfm 287

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

git reset --hard HEAD^ 我们会改变你所做的改变!

  • 这可能是因为您的 CLI 对“^”的解释不同。也许尝试将“HEAD^”放在引号中? (6认同)
  • 当我输入: git reset --soft HEAD^ Git 说我更多?这是什么意思? (4认同)

tge*_*ros 60

小心,reset --hard也将删除您的本地(未提交)修改.

git reset --hard HEAD^
Run Code Online (Sandbox Code Playgroud)

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

git reset --hard "HEAD^"
Run Code Online (Sandbox Code Playgroud)

  • 试过这个,只是在这里失去了几天的工作.请阅读下面的"soft"版本,它将在本地保留您的工作. (22认同)
  • 请注意,这不仅会撤消提交行为,还会丢弃您的更改. (13认同)
  • 就像任何人在不想放弃所做的更改时错误地运行此注释的注释一样,**您的更改没有消失**,它们只是被隐藏了。您可以使用`git reset --hard HEAD @ {1}`撤消该操作,回到原来的位置。(`HEAD @ {1}`的意思大致是“我刚在1次更改之前提交”,在这种情况下,您告诉Git想要删除的提交。键入`git reflog`以查看所有最近的更改。 ) (4认同)
  • 您不必使用msysgit中的Git bash引用克拉. (3认同)
  • 这不会删除未提交的修改,这会删除所有更改的整个提交......幸好我可以使用 Soren 的提示恢复我的更改 (2认同)

dax*_*dax 26

只需注意 - 如果您使用ZSH并查看错误

zsh: no matches found: HEAD^
Run Code Online (Sandbox Code Playgroud)

你需要逃避 ^

git reset --soft HEAD\^
Run Code Online (Sandbox Code Playgroud)


小智 19

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

  • 我刚刚学会了什么,没有破坏任何东西,后来的git重置--soft HEAD~保持rollin'回来没有干预提交.幸运的是,我推送到一个裸存储库并从中恢复.善于学习这些东西的非破坏性,可恢复的方式. (2认同)

小智 14

如果你犯了错误的分支

在错误的分支上:

  1. git log -2给你的最后2所提交的哈希值,可以说$prev$last
  2. git checkout $prev 结帐正确提交
  3. git checkout -b new-feature-branch 为功能创建一个新分支
  4. git cherry-pick $last 根据您的更改修补分支

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


Fil*_*ipe 5

对此要小心。

但是你可以使用rebase命令

git rebase -i HEAD~2
Run Code Online (Sandbox Code Playgroud)

Avi将打开,您所要做的就是删除包含提交的行。还可以阅读正确版本@中显示的说明vi。在此模式下可以执行一些操作。

  • 小心一点是什么意思?是git重置吗?我同意。 (2认同)