如何在不合并提交或不使用 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 PR 到
master
(所以在同一个存储库中的 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 桌面中:
从 File > Clone Repository
克隆您的存储库
Fetch origin
,也会自动获取上游
点击 Current Branch
前往 Branches
点击底部的Choose a branch to merge into <branch>
搜索 upstream/<branch>
,然后单击 Merge upstream/<branch> into <branch>
推到原点,瞧!
否则,如果当前分支在分叉之前有提交,那么当然必须创建合并提交或变基并强制推送。对于可能更可取的变基,请执行以下操作:
在 GItHub 桌面中,从菜单转到 Branch
,然后 Rebase Current Branch
搜索 upstream/<branch>
,然后单击 Start Rebase
解决变基发生的任何冲突
强制推送到原点。出于显而易见的原因,您将收到警告。
为了避免 force-pushing 当前分支既领先又落后于上游对应分支时的工作,请创建新的合并提交或:
根据您的所有更改创建一个新分支
如果需要,将原始分支重置为原始状态(在它与原始 repo 分离之前)
执行第一个场景中的步骤并将您的更改合并到您的分支中。
是的,似乎在不创建拉取请求和合并提交的情况下通过 GitHub 网站从原始回购中拉取 目前 是不可能的。
第一个场景的演示 GIF:https://imgur.com/a/8wci2yf
一些 GitHub 与此相关的问题:
正常的 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 PR 到
master
(所以在同一个存储库中的 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 桌面中:
从
File > Clone Repository
克隆您的存储库
Fetch origin
,也会自动获取上游点击
Current Branch
前往 点击底部的
Choose a branch to merge into <branch>
搜索
upstream/<branch>
,然后单击Merge upstream/<branch> into <branch>
推到原点,瞧!
Branches
否则,如果当前分支在分叉之前有提交,那么当然必须创建合并提交或变基并强制推送。对于可能更可取的变基,请执行以下操作:
在 GItHub 桌面中,从菜单转到
Branch
,然后Rebase Current Branch
搜索
upstream/<branch>
,然后单击Start Rebase
解决变基发生的任何冲突
强制推送到原点。出于显而易见的原因,您将收到警告。
为了避免 force-pushing 当前分支既领先又落后于上游对应分支时的工作,请创建新的合并提交或:
根据您的所有更改创建一个新分支
如果需要,将原始分支重置为原始状态(在它与原始 repo 分离之前)
执行第一个场景中的步骤并将您的更改合并到您的分支中。
是的,似乎在不创建拉取请求和合并提交的情况下通过 GitHub 网站从原始回购中拉取 目前 是不可能的。
第一个场景的演示 GIF:https://imgur.com/a/8wci2yf
一些 GitHub 与此相关的问题: