【问题标题】:How to uncommit my last commit in Git [duplicate]如何取消提交我在 Git 中的最后一次提交 [重复]
【发布时间】:2011-02-20 04:53:56
【问题描述】:

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

是吗

git reset --hard HEAD

git reset --hard HEAD^

?

【问题讨论】:

标签: git undo git-reset git-index


【解决方案1】:

如果您不完全确定“取消提交”是什么意思并且不知道是否要使用 git reset,请参阅“Revert to a previous Git commit”。

如果您想更好地理解git reset,请参阅“Can you explain what "git reset" does in plain English?”。


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

git reset --soft HEAD^

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

git reset HEAD^

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

git reset --hard HEAD^

最初的问题还问它是HEAD^ 而不是HEADHEAD 指的是当前提交 - 通常是当前签出分支的尖端。 ^ 是一个可以附加到 any 提交说明符的符号,表示“之前的提交”。所以,HEAD^ 是当前提交之前的提交,就像 master^ 是 master 分支尖端之前的提交一样。

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

【讨论】:

  • @Jefromi:这个问题中的每个答案都完全错误地强调--hard,--soft,对于“取消提交最后一次提交”是必要的,--hard 不仅不会取消提交但也会破坏你的承诺。我几乎毁掉了一整天的工作,因为我没有重新检查 --hard 的含义,假设 70+ 答案不会错。幸运的是,reflog 挽救了我的一天,但它不必是那样的。
  • @jameshfisher 这是对原始问题的回答(“这两个是哪一个?”),下面有一个巨大的警告。我正在编辑,但是...如果您看到一个从标题看起来像您想要的问题,并且您只是盲目地运行您在第一个答案中看到的第一个命令,这将继续发生在您身上.
  • get reset --soft HEAD^ 是我要找的!!!太好了,将更改放入当前工作头的术语是什么?或目录。
  • zsh 用户注意事项:使用git reset 'HEAD^'
  • 如果您唯一的本地提交是第一次提交怎么办?git reset --soft "HEAD^" 致命:不明确的参数 'HEAD^':未知修订或路径不在工作树中。使用 '--' 将路径与修订分开,如下所示:'git [...] -- [...]'
【解决方案2】:

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

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

【讨论】:

  • 当我输入: git reset --soft HEAD^ Git 说我更多?这是什么意思?
  • @FernandoPie 你找到答案了吗?
  • 哥们,我不记得了,但是有什么问题?
  • 这可能是因为您的 CLI 对“^”的解释不同。也许尝试将“HEAD^”放在引号中?
【解决方案3】:

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

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"

【讨论】:

  • git reset --soft HEAD^ More? More? fatal: ambiguous argument 'HEAD ': unknown revision or path not in the working tree. Use '--' to separate paths from revisions, like this: 'git <command> [<revision>...] -- [<file>...]' 什么鬼?为什么在git 中什么都不起作用?我讨厌它。
  • @VioletGiraffe 你可能在windows上需要做git reset --soft "HEAD^"
  • 很好的答案,我所做的是在 ~/.gitconfig 添加 [alias] uncommit = reset --soft HEAD^ .... 然后我可以只写 git uncommit 它将最后软重置提交
  • Windows 提示:如果您懒得输入额外的引号,您也可以使用 HEAD~(例如 git reset --soft HEAD~),它与 "HEAD^" 完全相同: )
【解决方案4】:

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

git reset --hard HEAD^

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

git reset --hard "HEAD^"

如果你想恢复提交放弃工作,使用--soft标志而不是--hard

git reset --soft HEAD^

【讨论】:

  • 您不必使用来自 msysgit 的 Git bash 引用克拉。
  • 试过这个,只是在这里失去了几天的工作。请阅读下面的soft 版本,它将在本地保留您的工作。
  • 请注意,这不仅会撤消提交行为,还会丢弃您的更改。
  • 就像对于那些在不想放弃更改时错误地运行此命令的人的注释一样,您的更改并没有消失,它们只是隐。您可以使用git reset --hard HEAD@{1} 撤消此操作以返回到您刚才所在的位置。 (HEAD@{1} 大致表示“我刚刚在 1 次更改前的提交”,在这种情况下,您告诉 Git 您想要摆脱的提交。输入 git reflog 以查看所有最近的更改。)
  • 这不会删除未提交的修改,这会删除所有更改的整个提交...谢天谢地,我可以使用 Soren 的提示恢复我的更改
【解决方案5】:

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

zsh: no matches found: HEAD^

你需要转义^

git reset --soft HEAD\^

【讨论】:

    【解决方案6】:

    如果你提交到错误的分支

    在错误的分支上:

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

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

    【讨论】:

    • 推送到origin是否有效?
    • 这对我有用。谢谢!
    【解决方案7】:

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

    【讨论】:

    • 我刚刚学到并没有破坏任何东西,随后的 git reset --soft HEAD~ 在没有干预提交的情况下不断回滚。幸运的是,我推送到一个裸存储库并从中恢复。很高兴以非破坏性、可恢复的方式学习这些东西。
    【解决方案8】:

    要小心。

    但是你可以使用 rebase 命令

    git rebase -i HEAD~2
    

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

    【讨论】:

    • 小心点是什么?是 git 重置吗?我同意。
    • 变基命令。你可以用它来销毁提交历史。
    • 这并没有删除提交。它删除了更改。我只想删除提交,以便可以将提交添加到另一个分支。
    猜你喜欢
    • 1970-01-01
    • 2016-09-22
    • 2012-03-25
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 2016-10-24
    相关资源
    最近更新 更多