【问题标题】:Merge pull request to a different branch than default, in Github在 Github 中将拉取请求合并到与默认不同的分支
【发布时间】:2012-02-03 21:42:32
【问题描述】:

一个拉取请求进入我托管在 Github 上的存储库。默认合并到master 分支。

我有什么办法可以更改合并到哪个分支?

【问题讨论】:

    标签: git github pull-request


    【解决方案1】:

    As of 15.08.2016 GitHub 允许通过 GUI 更改拉取请求的目标分支。点击标题旁边的Edit,然后从下拉列表中选择分支。

    您现在可以更改打开的拉取请求的基本分支。创建拉取请求后,您可以修改基础分支,以便将拉取请求中的更改与不同的分支进行比较。通过更改原始拉取请求的基础分支而不是打开具有正确基础分支的新分支,您将能够保留有价值的工作和讨论。

    【讨论】:

    • 此功能似乎不再存在(截至 2018-02-15),是吗?在最近的拉取请求中,目标分支在浅蓝色背景上以与源存储库/分支相同的蓝色字体显示,不再是按钮。
    • 啊!确实如此!首先需要单击“编辑”(从上面的屏幕截图中并不明显)。我忽略了这一点。对不起。
    • @cgogolin 感谢您指出这一点——我也很困惑,直到我阅读了您的评论并点击了“编辑”按钮。
    • Github warns 表示“当您更改拉取请求的基本分支时,一些提交可能会从时间线中删除。”和“来自旧基础分支的一些提交可能会从时间线中删除。”知道这意味着什么吗?
    • 但是你仍然不能创建一个 new 分支来合并。
    【解决方案2】:

    提交者可以在他们发出拉取请求时更改它,但是一旦他们发出它你就不能改变它。

    另一方面,您可以手动合并他们的分支并推送,我通常会为目标错误的拉取请求执行此操作。

    您可能会发现hub gem 有助于处理拉取请求的组件。

    那个gem封装了手动过程,也就是:

    1. Add a remote 用于您当地结账的分叉。
    2. 获取那个遥控器。
    3. git checkout ${target_branch} && git merge ${remote}/${branch}
    4. git push origin ...

    【讨论】:

    • 如果我手动合并push,Github会意识到pull request已经有效完成了吗?关于如何从远程单独的 repo(fork)合并的任何指针?
    • 我不确定,但不是直接 - 因为更改没有合并到目标分支,所以拉取请求没有按定义完成。您需要手动关闭它。至于指针,请参阅编辑后的评论。
    • 我建议使用@GuillermoMansilla 在他的回答中提到的git merge --no-ff ...
    • “一旦发布,您将无法更改” - 2016 年 8 月不再是这种情况!请参阅下面@maliayas 的答案:stackoverflow.com/a/38985999/12484
    • 我今天(2017 年 3 月 3 日)遵循了这个程序。我将 pull request 下载到另一个分支并对其进行了一些额外的修复,然后合并到 master。一旦拉取请求的提交最终在 master 中,GitHub 会自动关闭拉取请求。
    【解决方案3】:

    使用其他答案提到的集线器 gem 的替代方法是 use the command line to merge locally pull requests,它允许您这样做:

    $ git fetch origin
    $ git checkout *target_branch*
    $ git merge pr/XXX
    $ git push origin *target_branch*
    

    只有在您首先将以下行添加到您的 .git/config 文件时,上述命令才能直接工作:

    fetch = +refs/pull/*/head:refs/remotes/symbolic_name_origin_or_upstream/pr/*
    

    这样做是允许您下载 ALL 拉取请求。由于大型存储库可能不希望这样做,GitHub 修改了说明以使用 git fetch origin pull/ID/head:BRANCHNAME 语法,这样可以避免修改配置文件并且只下载单个拉取请求。

    【讨论】:

      【解决方案4】:

      虽然您不能更改现有的拉取请求,因为它不是您的,但如果相关的源存储库仍然存在,您可以轻松创建一个新的拉取请求 - 是的,即使它是其他人的。

      转到提交者的存储库,然后使用相同的提交在他/她的存储库中创建一个新的拉取请求,但请确保您正确设置了正确的目标分支。

      然后返回您自己的存储库并接受新的拉取请求。瞧!

      【讨论】:

      • 如果他们更改了存储库,这是否有效?如何确保它是“相同的提交”?
      • @ragerdl - 如果您正在使用“每个分支的功能”模型进行开发,那么您可以创建一个带有针对上游分支的分支的 PR,并且它应该包含相同的提交。
      • 直接在 GitHub 上执行此操作的唯一方法,无需访问本地存储库。
      【解决方案5】:

      Daniel Pittman 的解决方案没有任何问题,但我会将这些合并视为“没有快进”,即,将第 3 步更改为:

      git checkout ${target_branch} && git merge --no-ff ${remote}/${branch}
      

      通过使用--no-ff,历史将更容易阅读。它会清楚地表明$n 提交来自$branch,如果您需要恢复在该分支中完成的某些事情,它也会让您的生活更轻松。

      也回答 eoinoc 的问题并提供额外提示:

      完成合并后,你的 git cli 会提示你写一条消息,通常会出现一条通用消息,说类似

      将远程跟踪分支“用户/他们的分支”合并到您的分支中

      确保编辑该消息并包含对拉取请求编号的引用。那是: (假设拉取请求编号为 123)

      将远程跟踪分支“用户/他们的分支”合并到您的分支中

      refs #123 解决任何问题...

      因此,下次您访问您的 github 问题/拉取请求页面并检查该特定拉取请求时,您将看到您的消息,其中包含提交您进行合并的链接的链接。

      这是我的意思的截图。

      【讨论】:

        【解决方案6】:

        为此,请转到存储库的主页,单击分支,然后将默认分支从 master 更改为其他分支,在我的情况下为“dev”。

        之后,每当有人创建拉取请求时,merge 按钮会自动将该请求合并到“dev”而不是 master。

        【讨论】:

          猜你喜欢
          • 2016-06-20
          • 2020-02-12
          • 2021-10-03
          • 2022-12-09
          • 2023-02-23
          • 1970-01-01
          • 2015-03-31
          • 1970-01-01
          • 2017-03-15
          相关资源
          最近更新 更多