【发布时间】:2016-05-04 19:27:44
【问题描述】:
我创建了一个合并(到“主”分支),现在位于 Bitbucket 存储库中。长话短说:我需要撤消该合并。
我知道您可以在 Github 站点上执行此操作,但 Bitbucket 没有该功能。我不清楚如何用 Git 做到这一点而不会造成混乱。
【问题讨论】:
我创建了一个合并(到“主”分支),现在位于 Bitbucket 存储库中。长话短说:我需要撤消该合并。
我知道您可以在 Github 站点上执行此操作,但 Bitbucket 没有该功能。我不清楚如何用 Git 做到这一点而不会造成混乱。
【问题讨论】:
您需要先在本地系统上克隆存储库(您可以从 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
如果 repo 是共享的,并且它的其他用户已经提取了您最近的提交并在其上构建,他们自然会不高兴。因此,在这种情况下,请务必通知所有人您正在做什么。
revert,正如其他答案中提到的,是另一种选择;它会保留您所做的提交,但会进一步修改存储库(使用新提交),从而撤消您所做的更改。是否要使用 revert 取决于您是否希望提交中的信息保留在 repo 历史记录中。
有关在 git 中撤消更改的更多详细信息,请参阅good tutorial page by Atlassian。
【讨论】:
git revert 撤消合并的重要说明(使用-m 选项):git revert --help 说:恢复合并提交声明您将永远 想要合并带来的树变化。因此,以后的合并只会引入由提交引入的树更改,这些提交是先前恢复的合并的非祖先。这可能是也可能不是您想要的。 -> 所以如果reverting 合并需要撤消,解决方案不是再次合并先前合并(然后恢复)的分支,而是恢复恢复提交。
2017 年在 Bitbucket 中实现了“恢复拉取请求”功能。
要恢复拉取请求:
来源:the docs。
【讨论】:
我建议改为使用revert,因为您正在恢复公共回购。
git revert HEAD
git push -f origin
【讨论】:
-f。正如您所提到的,分支是公开的,所以如果有人刚刚提交了其他内容,强制推送将丢弃它们。定期推送应该可以完成这项工作,如果远程中已经有其他更改,推送将被拒绝,并让您有机会合并新的即将发生的更改。
撤消提交的更改:
git revert <commit id>
【讨论】:
首先,在您的本地机器上,在您合并到的分支上(例如master):
git revert -m 1 HEAD
或:
git revert -m 1 <merge commit hash>
然后推送到原点。
或者,如果您不能直接推送到 master,请在还原之前先从 master 创建一个新分支,然后将这个新分支推送到 master 并创建一个新 PR,并在 bitbucket 上合并。
【讨论】: