【问题标题】:How to un-commit last un-pushed git commit without losing the changes如何在不丢失更改的情况下取消提交最后一次未推送的 git commit
【发布时间】:2013-11-20 11:43:06
【问题描述】:

有没有办法恢复提交,以便我的本地副本保留在该提交中所做的更改,但它们在我的工作副本中变成未提交的更改?回滚提交会将您带到上一个提交 - 我想保留所做的更改,但我将它们提交到错误的分支。

这还没有被推送,只是提交。

【问题讨论】:

标签: git


【解决方案1】:

有很多方法可以做到这一点,例如:

如果您没有公开推送提交:

git reset HEAD~1 --soft   

就是这样,您的提交更改将在您的工作目录中,而 LAST 提交将从您当前的分支中删除。见git reset man


如果您确实公开推送(在名为“master”的分支上):

git checkout -b MyCommit //save your commit in a separate branch just in case (so you don't have to dig it from reflog in case you screw up :) )

正常还原提交并推送

git checkout master
git revert a8172f36 #hash of the commit you want to destroy
# this introduces a new commit (say, it's hash is 86b48ba) which removes changes, introduced in the commit in question (but those changes are still visible in the history)
git push origin master

现在,如果您想在工作副本中进行本地更改时进行这些更改(“以便您的本地副本保留在该提交中所做的更改”) - 只需使用 --no-commit 选项恢复还原提交:

git revert --no-commit 86b48ba (hash of the revert commit).

我制作了一个小例子:https://github.com/Isantipov/git-revert/commits/master

【讨论】:

  • 非常感谢,在我的情况下,我有两个提交我想取消,并且连续两次运行 'git reset HEAD~1 --soft' 让我到达了我需要的地方。
  • 如果你不使用 CLI,为了更清楚一点,提到的第一个 reset 命令是说“软”重置到头部之前的 1 转,这会保留所有本地更改。对于我在 SourceTree 中的使用,这并不是立即显而易见的。只需确保您正在软重置为上一个版本,而不是您尝试重置的版本
  • 我尝试了“已经推送”的方法,但它对我不起作用,使用 git 2.14.1:它在合并时显示 "Already up to date"
  • @FabioA。 ,我已经用工作版本更新了答案。感谢您注意到这一点!
  • 这不起作用。我跳过了重置和提交,只有 git 恢复并推出......现在可能更改丢失还不确定......幸运的是,我以简单的方式进行了备份,希望它仍然可以工作;)否则可以从那个复制更改.
【解决方案2】:

如果您推送了更改,您可以undo 并在不使用其他分支的情况下将文件移回舞台。

git show HEAD > patch
git revert HEAD
git apply patch

它将创建一个包含最后一个分支更改的补丁文件。然后它恢复更改。最后,将补丁文件应用到工作树。

【讨论】:

  • 你可能也想rm patch
【解决方案3】:

对于案例:“这还没有被推送,只提交了。” - 如果您使用 IntelliJ(或其他 JetBrains IDE)并且您还没有推送更改,您可以执行下一步。

  1. 转到版本控制窗口(Alt + 9/Command + 9)-“日志”选项卡。
  2. 右键单击最后一个提交之前的提交。
  3. 重置当前分支到这里
  4. 选择(!!!)
  5. 按下对话框窗口底部的重置按钮。

完成。

这将“取消提交”您的更改并将您的 git 状态返回到您上次本地提交之前的位置。您所做的任何更改都不会丢失。

【讨论】:

  • 我喜欢学习 JetBrains 的方式,谢谢!顺便说一句,这相当于 Windows 上的 git reset --soft "HEAD^"。 :)
  • 现在当我尝试提交时,它说存储库处于“Detached HEAD”状态。您能否更新您的解决方案以解释如何处理此问题?
【解决方案4】:

2020简单方法:

git reset <commit_hash>

您要保留的最后一次提交的提交哈希。

【讨论】:

    【解决方案5】:

    对我来说,这主要发生在我将更改推送到错误的分支并稍后意识到时。并且大部分时间都在关注作品。

    git revert commit-hash
    git push
    
    git checkout my-other-branch
    git revert revert-commit-hash
    git push
    
    1. 恢复提交
    2. (创建和)结帐其他分支
    3. revert 还原

    【讨论】:

    • 我对此进行了测试。如果您没有推送到远程,您的方法也有效。 $ git revert ... 然后签出其他分支,然后键入 $ git revert (没有推送)。感谢您分享这个简单的方法!
    【解决方案6】:

    请确保在单独的文件夹中运行这些命令之前备份您的更改

    git checkout 分支名称

    在您的分支机构结帐

    git 合并 --abort

    中止合并

    混帐状态

    中止合并后检查代码状态

    git reset --hard origin/branch_name

    这些命令将重置您的更改并将您的代码与 branch_name(分支)代码对齐。

    【讨论】:

      【解决方案7】:

      添加我遵循的步骤,希望对像我这样的初学者有所帮助。

      下图显示了我已经推送到 bitbucket 中远程分支 'A' 的提交。

      从这 5 次提交中,我想保留最后 2 次,但我希望前 3 次提交推送到另一个分支“B”。

      这些是我遵循的步骤:

      内部分支'A':

      1. git revert &lt;commit-hash&gt; 用于 3 个提交中的每一个。例如,d4a3734 是图片中最后一次提交的提交哈希。 (如果您愿意,您可以一次还原多个提交 - 请参阅 How to revert multiple git commits?
      2. git push

      推送后是这样的:-

      现在,我的分支“A”中只有前 2 次提交,这正是我想要的。接下来,结帐到想要的分支。如果是新分支,请使用git checkout -b &lt;branchname&gt;。就我而言,我做了git checkout B

      内部分支'B':

      我只是挑选了我想要分支“B”的提交。就我而言,我做到了:

      git cherry-pick <commit-hash> 
      

      对于我还原的那 3 个提交。

      (再次以git cherry-pick d4a3734 为例,其中 d4a3734 是图片中最后一次提交的提交哈希)

      【讨论】:

        【解决方案8】:

        从 2021 年起面向谷歌同事的新更新。

        如果您是 VSCode 用户,这是撤消上次提交的现代方法。

        1. 转到左侧的源代码管理选项卡(快捷方式:Ctrl + Shift + G G)。
        2. 按圆形更新图标左侧的...。请参阅下面的屏幕截图:
        3. 导航到提交,然后撤消上次提交。这是一个屏幕截图:

        它所做的只是恢复您的存储库,就像您提交之前一样,您的更改保持不变。

        【讨论】:

          猜你喜欢
          • 2021-04-28
          • 2022-01-04
          • 2013-02-26
          • 2011-06-29
          • 2011-01-21
          • 2019-03-27
          • 2011-07-09
          • 1970-01-01
          • 2012-03-25
          相关资源
          最近更新 更多