如何在不合并提交或不使用 CLI 的情况下使 GitHub 分支保持最新状态?

How to keep a GitHub fork up to date without a merge commit or using CLI?

正常的 GitHub 为 repo 做贡献的流程是创建一个上游的分支,克隆一个你进行更改的本地副本,然后推送回你的分支,然后创建一个 PR 来拥有您的更改已合并到上游。

但是如果在那之后上游发生变化,你如何在不创建合并提交的情况下更新你的分支(也不使用 git CLI)?

我已经知道如何以创建合并提交或依赖于 git 命令行界面的方式执行此操作。这个问题专门针对仅使用 GitHub.com 网站或 GitHub 桌面应用程序(无 CLI)。

由于这是一个非常常见的工作流程,因此似乎应该有一些简单的方法可以使用 GitHub GUI 来完成。

重申一下:任何使用 CLI 或创建合并提交(例如 this way)的答案都不会回答这个问题,因为我正在明确寻找非 CLI 解决方案。

更新 注意:基于 Non-CLI 的方法可能会有所帮助: Is there a way to make GitHub Desktop rebase a branch against master?

这里唯一的关键是做一个变基,所以上面的答案应该有所帮助。


CLI方式(更简单易用git,默认应该更全面)

您应该采取一些做法来避免这种情况。

  • 不要在你的分支中的 master 分支上工作。
$ git clone <your fork>
$ git checkout -b feature_branch

您可以在 feature_branch 中工作,然后提出合并请求。

  • 一旦您的更改合并到上游主服务器中,您就可以从上游拉取到您的来源。由于上游的 master 会将您的提交整齐地放在它上面,因此不会有合并提交。
$ git checkout master
$ git pull upstream master
$ git push origin master
  • 在这种情况下,维护者与您的 fork 中的 master 发生了分歧,也就是说,它不再是线性的,您需要拉取它的新副本。这应该不是问题,因为您的更改已经在上游。

  • 如果在你做 PR 的时候 upstream 的 master 进步了,那么你可以 rebase 到你 feature_branch.

$ git checkout master
$ git pull upstream master
$ git push origin master
$ git checkout feature_branch
$ git rebase master

详细参考请参考此文档:Fork and pull request workflow

without a merge commit or using CLI?

不直接与 GitHub web UI 单独使用,因为它会涉及 变基 你的 PR 分支在 upstream/master

简而言之:没有。
但简而言之...也许,如果您真的想尝试一下。

通过 GitHub 网络 UI 变基实际上是可能的,since Sept. 2016,...

  • 如果你是原repo的维护者,想集成一个PR分支
  • 如果重播提交的 none 引入了冲突

(这不同于 GitHub Desktop, which, since June 5th 2019 does support rebasing. But that is a frontend to Git CLI, like other tools provide. For example GitKraken and interactive rebase

所以一个复杂的解决方法是:

  • 获取,然后将 upstream/master 推送到您自己的分支的 master 分支(CLI 操作,但更多内容见下文)
  • change the base branch of your current PRmaster(所以在同一个存储库中的 PR:你自己的分支),前提是你还没有推送到 master.
    含义:您的复刻中的 master 代表更新后的 upstream/master,其中 upstream 是您分叉的原始存储库。
  • 由于您是该存储库(您的分支)的所有者,GitHub 可以向您显示您是否可以将所述分支重新设置为 PR 的基本分支(master),但仅如果没有冲突。
  • 最后,再次将基本分支更改为 <originalRepo>/master(这是您的 PR 的预期目标)

第一步通常是通过命令行完成的,但是...可能有一个技巧可以通过 Web UI 来完成(更新您的分支中的上游主控):参见“Quick Tip: Sync a Fork with the Original via GitHub’s Web UI" by Bruno Skvorc

简而言之,涉及:

  • creating a new branch 来自您当前的 master(在您分叉原始存储库时将位于 upstream/master

  • 使用该新分支进行 PR 并且 <originalRepo/master>
  • 在 创建 PR
  • 之前进行基础转换

也就是人为强制upstream/master刷新的步骤

您可以使用“合并拉取请求”按钮(以及之后的“确认合并”)创建并合并它:合并将是微不足道的:没有合并提交。

最终结果是:您自己的 master 分支(在您的分支中)更新为 upstream/master(原始存储库的 master 分支)!

然后你可以继续我上面描述的步骤,将你当前 PR 的基础更改为你自己的(现在刷新)master 分支,看看你是否可以 rebase 它!

考虑到以下因素,GitHub 桌面 since version 1.0.7 这是可行的:

  • 如果当前分支在上游(fork 的原始 repo)之前没有任何提交,则可以在不创建新合并提交的情况下拉取新提交

    在 GitHub 桌面中:

    1. File > Clone Repository

    2. 克隆您的存储库
    3. Fetch origin,也会自动获取上游

    4. 点击 Current Branch

    5. 前往 Branches
    6. 点击底部的Choose a branch to merge into <branch>

    7. 搜索 upstream/<branch>,然后单击 Merge upstream/<branch> into <branch>

    8. 推到原点,瞧!

  • 否则,如果当前分支在分叉之前有提交,那么当然必须创建合并提交或变基并强制推送。对于可能更可取的变基,请执行以下操作:

    1. 在 GItHub 桌面中,从菜单转到 Branch,然后 Rebase Current Branch

    2. 搜索 upstream/<branch>,然后单击 Start Rebase

    3. 解决变基发生的任何冲突

    4. 强制推送到原点。出于显而易见的原因,您将收到警告。

为了避免 force-pushing 当前分支既领先又落后于上游对应分支时的工作,请创建新的合并提交或:

  • 根据您的所有更改创建一个新分支

  • 如果需要,将原始分支重置为原始状态(在它与原始 repo 分离之前)

  • 执行第一个场景中的步骤并将您的更改合并到您的分支中。

是的,似乎在不创建拉取请求和合并提交的情况下通过 GitHub 网站从原始回购中拉取 目前 是不可能的。


第一个场景的演示 GIF:https://imgur.com/a/8wci2yf

一些 GitHub 与此相关的问题: