Git undo推送合并并删除其历史记录

时间:2018-01-16 17:30:25

标签: git git-merge

我做了一个意外的合并来掌握并推动它,现在master拥有了dev的所有提交。我想从master恢复提交并删除其历史记录而不更改dev。我怎么能这样做?

3 个答案:

答案 0 :(得分:2)

可以使用以下内容删除最后一次提交:git reset --hard HEAD^

有时可能会出现这样的情况:当您需要从&#34;中间删除提交时?分支机构。这里是救援互动基础:git rebase -i <commit>^。您只需要删除不需要的提交(它应该出现在列表的顶部)。

如果您撤消的更改在远程中可用,则应使用强制推送从git push --force移除它们。

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

我建议您阅读Git Branching - Rebasing。第四章&#34; Rebase的危险&#34;正在解释为什么重写公共历史不是一个好主意。

答案 1 :(得分:1)

您可以使用reflog找出合并前指向的位置,并使用reset命令将其重置为该值。提交不会被删除,因为仍然在开发中,但是主人不会拥有它们。如果你真的想要删除它们,也就是重置dev,你可能会这样做,而且孤儿提交最终会被垃圾收集。

这是一个例子,但不要仅仅使用它作为配方,而是阅读更多关于Git以及Git如何工作(git结构)和在其他地方实践(其他分支/其他repos),当你有信心回到这个并尝试。

Recovering lost commits

答案 2 :(得分:1)

$ git revert -m 1 <merge-commit-hash>
  1. git revert 将确保创建一个新的提交来恢复不需要的合并的影响。这与 git reset 形成对比,在那里我们有效地从历史中“删除”一个提交。这也是为什么 git revert 在您已经推送到远程的情况下是更好的解决方案的原因。

  2. -m 1 选项告诉 Git 我们要保留合并的父端(即我们合并到的分支)。

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

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