如何在Bitbucket上撤销合并?

68

我已经在Bitbucket仓库中创建了一个合并请求(合并到'master'分支),现在需要撤销该合并操作。

我知道你可以在Github网站上做到这一点,但是Bitbucket没有这个功能。我不确定如何在Git中完成这个操作而不会引起混乱。

5个回答

120

您需要先将存储库克隆到本地系统(您可以从Bitbucket存储库的“概述”页面获取SSH或HTTPS格式的存储库URL):

git clone git@bitbucket.org:my/repo.git
-or-
git clone https://my@bitbucket.org/my/repo.git

git checkout master

然后撤销最近的提交。首先使用以下命令列出可用的提交:

git log

...然后选择合并之前的提交:

git reset --hard 72ead1c4c1778c23c277c4f15bbb68f3bb205f54

..其中哈希是合并前提交的哈希(来自日志)。最后,强制将更改内容推送回Bitbucket,覆盖历史记录。

git push -f

如果仓库是共享的,而其它用户已经拉取了你最近的提交并基于此建立,那么他们可能会感到不满。因此,在这种情况下,请确保通知所有人你正在做什么。

正如其他答案中提到的,revert 是另一个选项;它保留你所做的提交,但修改仓库(使用新的提交)以撤消你所做的更改。是否使用 revert 取决于你是否希望你所做的提交信息仍留在仓库历史记录中。

有关在 Git 中撤消更改的详细信息,请参阅 Atlassian 的优秀教程页面


1
关于使用 git revert 撤销合并(使用 -m 选项)的重要提示:git revert --help 表示:撤销合并提交意味着您将永远不会想要合并带来的树更改。因此,后续的合并只会带来之前撤销合并的祖先提交中引入的树更改。这可能是您想要的,也可能不是。 -> 因此,如果需要撤销“revert”合并,则解决方案不是再次合并先前合并(然后撤销),而是撤销撤销提交。 - balu

22

Bitbucket在2017年实现了“还原拉取请求”功能。

要还原拉取请求:

  1. 从拉取请求中,点击右上角的“还原”按钮。 (可选)从还原拉取请求对话框中,更改要创建的新分支的分支名称。
  2. 点击“还原”按钮。 点击“还原”后,Bitbucket会创建一个新的分支。即使您取消拉取请求,还原分支也会留在仓库中。
  3. 打开“创建拉取请求”页面,并将还原分支作为源。添加评审人并进行其他更改后,点击“创建”。

来源:文档

BitBucket Revert pull request


2
我找不到还原选项。我猜这只在Bitbucket Cloud中可用,而不是在Bitbucket Server中。 - carl verbiest
这个回答与问题无关。他在谈论合并,而不是PR。 - Reza ODB
1
通常合并是通过PR进行的,对吧?这个流程会将源代码还原为在执行合并操作之前的状态。 - LWC

6

我建议使用revert命令,因为你正在回滚一个公共仓库。

git revert HEAD
git push -f origin

我喜欢这个概念,除了在推送时我不会使用“-f”。正如你所提到的,分支是公共的,因此如果有人刚提交了其他内容,强制推送将会丢弃它们。普通的推送应该就可以了,如果远程已经有其他更改,推送将被拒绝并给你机会合并新的即将到来的更改。 - L. Holanda

5
撤销某个提交的更改: git revert <commit id>

4

首先,在您的本地机器上,在您合并的分支上(如master)执行以下命令:

git revert -m 1 HEAD

或者:

git revert -m 1 <merge commit hash>

然后将更改推送到 origin。

或者,如果您不能直接推送到 master,请先从 master 创建一个新分支进行还原,然后将其推送,并使用此新分支对 master 创建新的 PR,在 bitbucket 上合并。


1
在这里,您可以找到有关选项“-m 1”的清晰详细信息:https://www.git-tower.com/learn/git/faq/undo-git-merge - Ahmed El-Atab

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接