撤消由 bitbucket 拉取请求创建的 git 合并

Undo a git merge created by a bitbucket pull request

我知道 git 中有很多关于撤消合并的信息,但我似乎找不到关于如何在我的特定情况下执行此操作的任何共识。

有人通过 bitbucket 中的拉取请求将我们的 develop 分支合并到我们的 master 分支。这只是今天发生的,所以这是在 master 分支上完成的最后一件事(我们不必担心合并提交之上的其他提交)。

Note: We host bitbucket ourselves, so we have an older version of bitbucket. There is no revert pull request option.

根据我的阅读,在 git 中基本上有两种处理方法:

  1. git reset --hard *<SHA of commit before the merge>*

    • 这将删除合并提交,就好像它从未发生过一样。
    • 我到处都读到 "it's bad practice to rewrite history" 或 "never do this on a publicly shared repo" 但他们从来没有真正解释为什么不这样做。这似乎会解决问题,并且从现在起 6 个月后,当我们真正想要重做从 developmaster
    • 的合并时,它不会成为问题
    • 如果这是最好的方法,我们也这样做了,那么 bitbucket 中的拉取请求会怎样?那个 pull request 仍然存在于 bitbucket 中,但是我们正在删除它创建的合并提交,所以这会以任何方式弄乱 bitbucket 吗?
  2. git revert -m 1 *<SHA of the merge commit>*

    • 这将创建一个新的提交,撤消合并所做的更改
    • 这很好,除非我们确实打算在以后(下一个版本)将 develop 合并到 master 中,根据我读到的内容,我们必须记住在执行此操作之前还原我们的还原提交,因为否则当我们将 develop 合并到 master 时,我们今天还原的更改将不包括在内。我真的不想让这成为一个问题 6 个月后,没有人记得这个恢复。

TL;DR: 我对做 git revert 犹豫不决,因为它可能会导致 6 个月后我们确实想再次进行此合并的问题.我也对做 git reset 犹豫不决,因为每个人似乎都警告不要这样做,这可能会导致 bitbucket 上的拉取请求出现问题。

你可以做任何一个。确实没有决定性的技术原因可以决定您要做什么。

  1. 特殊情况下更新非转发即可。给每个人解释一下,询问拉错主的队伍,帮助他们恢复。

  2. 您可以转发 development 分支以还原提交,然后 revert the revert,从而返回其内容。

PS 对于案例 2:

对于原始案例

* 73d5415 (HEAD -> master) master3
| * e660100 (development) development3
| * 0356d3a development2
| * 6cefad0 development1
|/  
* 209d967 master2
* dc25505 master1

您将 development 合并到 master,并将其还原。

* 7a4f94a (HEAD -> master) Revert "Merge branch 'development'"
*   75e1e34 Merge branch 'development'
|\  
| * e660100 (development) development3
| * 0356d3a development2
| * 6cefad0 development1
* | 73d5415 master3
|/  
* 209d967 master2
* dc25505 master1

现在要修复它,你应该这样做

$ git checkout development
$ git merge --ff-only master
$ git revert 7a4f94a (the "Revert" commit)

结果:

e7b511a (HEAD -> development) Revert "Revert "Merge branch 'development'""
* 7a4f94a (master) Revert "Merge branch 'development'"
*   75e1e34 Merge branch 'development'
|\  
| * e660100 development3
| * 0356d3a development2
| * 6cefad0 development1
* | 73d5415 master3
|/  
* 209d967 master2
* dc25505 master1

e7b511a 包含你以前不在 master 里的所有开发,以后可以合并到 master 里。尽管所有这些都表示为单个提交,但有一个缺点,所以如果你想责怪某些东西,它需要在 e660100.

中再调用一次

[由于我还没有获得足够的声誉,我不能对你的问题发表评论,所以添加我的评论作为答案]

我知道恢复到 master 的旧散列的唯一方法(不显示合并提交然后提交的逆转)是 force-push。有关示例和选项,请参阅 git force-push

这是一个有争议的答案,因为有很多人反对它。但是当你使用bitbucket时,force-push是可以控制的,即为你的操作启用它并为你的主人禁用force-push

注意:bitbucket 最新的插件,如 rebasesquash 使用 --force-with-lease