从 GitHub.com 上的受保护分支恢复合并提交

Posted

技术标签:

【中文标题】从 GitHub.com 上的受保护分支恢复合并提交【英文标题】:Revert a merge commit from a protected branch on GitHub.com 【发布时间】:2017-07-21 18:57:51 【问题描述】:

我们在 GitHub 上保护了我们的开发分支,这样下游的任何人都不能直接推送他们的提交。提交需要经过特定的功能分支并通过拉取请求合并。

出现了这样一种情况,即功能分支被合并到开发分支中(经过适当的审查和更改),我们需要稍后恢复它(可能是由于需求的更改)。如果我尝试在下游恢复合并提交,它将不允许我推送,因为分支受到保护。我记得当我们合并分支时 GitHub 提供了恢复按钮。但不知何故,我现在无法看到(或找到)按钮。我们需要恢复提交的优先级,因此我们暂时从开发分支中删除了保护并推送了恢复提交(最丑陋的黑客攻击)。

还有其他更好的选择来从受保护的分支恢复提交吗?也许我遗漏或误解了一些 GitHub 功能。

还有一个场景是,如果我在合并后从 GitHub 中删除了分支,那我将如何恢复它呢?

【问题讨论】:

您是否尝试过使用git revert 并从下游分支发出新的拉取请求? git revert 应该在上游 HEAD 之前创建一个新提交 @rink.attendant.6:我没有尝试过,但它看起来绝对是源自下游的优雅解决方案之一。看起来也很简单,我在想这些东西! GitHub上有解决方案吗?我可以使用它,因为人们点击按钮比记住和编写命令更可取。 【参考方案1】:

最简单的选择是执行以下操作

git revert -m 1 "last_commit_id"

【讨论】:

【参考方案2】:

在 GitHub 上恢复

您无需在 GitHub 上恢复(取消删除)分支来恢复由拉取请求产生的合并提交。例如:

不可恢复的拉取请求

有时不会出现还原按钮。来自reverting a pull request 上的 GitHub 帮助:

注意:如果出现以下情况,您可能需要使用 Git 手动还原单个提交:

还原拉取请求会导致合并冲突 原始拉取请求最初并未在 GitHub 上合并(例如,在命令行上使用快进合并)

我花了一段时间才找到一个例子,但是如果头分支没有使用 GitHub 上的绿色大按钮合并到基础分支中,那么它就无法在 GitHub 上恢复:

git revert

在命令行本地,您可以使用git revert 命令恢复更改。

这将适用于您的受保护分支和下游分支。 git revert 在当前 HEAD 之前创建一个新的提交,因此您不需要强制推送,如果来自下游分支,您可以手动为还原的更改创建拉取请求。

恢复合并提交比恢复单父提交稍微复杂一些,所以我建议查看this question 了解更多信息,因为这是我以前从未做过的事情。

如果人们不习惯使用命令行,我认为SourceTree 在上下文菜单中有一个项目可以恢复提交,但我不知道它如何处理合并提交。其他 GUI 应用程序中可能有类似的选项。

希望这会有所帮助!

【讨论】:

即使我在下游跟踪分支中恢复提交并尝试推送到受保护的分支,它仍然不允许,因为受保护的分支不允许从下游推送任何新的提交。一种方法是从下游跟踪分支创建一个新分支,还原更改,推送新分支并将其合并到受保护分支 很好的答案 - 链接到恢复合并提交的答案 - 我需要的版本。

以上是关于从 GitHub.com 上的受保护分支恢复合并提交的主要内容,如果未能解决你的问题,请参考以下文章

从分支 B 合并时,在分支 A 上恢复的提交不存在

如何从 github 上的 master 分支安装 pip 模块? [复制]

如何使用DOWNstream For Electron获取离线内容的受保护播放?

如何恢复从一个分支合并的所有提交

git:如何从远程分支获取并合并到本地分支?

从错误分支恢复合并后无法从另一个远程拉取