代码之家  ›  专栏  ›  技术社区  ›  Shubham Chaudhary

Git撤消推式合并并删除其历史记录

  •  0
  • Shubham Chaudhary  · 技术社区  · 6 年前

    我意外地合并到master并推送了它,现在master拥有了dev的所有提交。我想还原master的提交并删除其历史记录,而不更改dev。我该怎么做?

    3 回复  |  直到 6 年前
        1
  •  4
  •   Vitali    6 年前

    可以通过以下操作删除最后一次提交: git reset --hard HEAD^ .

    有时可能会出现需要从分支的“中间”删除提交的情况。下面是救援互动基地: git rebase -i <commit>^ . 您只需要删除一个不需要的提交(它应该出现在列表的顶部)。

    如果您撤消的更改在remote中可用,则还应使用强制推送从远程中删除这些更改: git push --force .

    然而,重写已与某人共享的分支的历史记录并不是撤消更改的好方法。相反,考虑使用 git revert <commit> . 在这种情况下,这是更可靠和正确的方法。

    我建议阅读 Git Branching - Rebasing . “再基地的危险”一章解释了为什么重写公共历史不是一个好主意。

        2
  •  1
  •   jchevali    6 年前

    您可以使用 reflog 要找出合并前master指向的位置,请使用 reset 命令将其重置为该值。提交不会被删除,因为dev中仍有提交,但master中不会有提交。如果您真的想删除这些,也就是说,也要重置dev,那么您可以这样做,孤立提交最终将被垃圾收集。

    这里有一个例子,但不要仅仅把它当作一个菜谱,相反,请阅读更多关于Git的内容以及Git的工作原理(Git结构)和在其他地方的实践(其他分支机构/其他回购),当您有信心时,请回到这一点并尝试。

    Recovering lost commits

        3
  •  1
  •   Farhad    3 年前
    $ git revert -m 1 <merge-commit-hash>
    
    1. git revert将确保创建一个新的提交来恢复不需要的合并的效果。这与git reset相反,在git reset中,我们有效地从历史记录中“删除”了提交。这也是为什么git revert在您已经推到远程的情况下是一个更好的解决方案的原因。

    2. 这个 -m 1选项告诉Git我们希望保留合并的父端(这是我们合并到的分支)。

    3. 最后,还要确保提供正确的提交哈希:对于上面的git重置示例,我们必须在合并之前提供提交;然而,在使用git revert时,我们必须指定实际合并提交的哈希。

    https://www.git-tower.com/learn/git/faq/undo-git-merge/