ChatGPT解决这个技术问题 Extra ChatGPT

将原始 GitHub 存储库中的新更新拉入分叉的 GitHub 存储库

我在 GitHub 上分叉了某人的存储库,并希望使用在原始存储库中进行的提交和更新来更新我的版本。这些是在我分叉我的副本之后制作的。

如何提取在源中所做的更改并将它们合并到我的存储库中?

可能重复,或者可能只是相关:Merging between forks in GitHub
如果您可能想要同步其他标签,请在建议的解决方案之后执行 git push --force origin --tags
很老但仍然:这个问题还不清楚,不知道@why 是在询问通过 GitHub Web UI 将更改从主存储库拉入 fork,还是通过本地 git 命令行拉入更改。
@chrisinmtown 也不确定,但最后,您(当时)必须使用本地存储库,从上游获取,推送到原点(您的分叉),正如我在下面的 2010 年回答中提到的那样。最终结果是使用原始存储库所做的更改更新了“我的存储库”。如今,您可以通过 github.com 本身的 pull-request 来实现。

V
VonC

您必须将原始存储库(您分叉的存储库)添加为远程。

GitHub documentation on forking a repository

https://i.stack.imgur.com/ztqaV.jpg

克隆完成后,您的 repo 将有一个名为“origin”的远程指向您在 GitHub 上的 fork。不要让这个名字混淆你,这并不指向你分叉的原始仓库。为了帮助您跟踪该仓库,我们将添加另一个名为“upstream”的远程: $ cd PROJECT_NAME $ git remote add upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git $ git fetch upstream # then: (like pull" 即 fetch + merge) $ git merge upstream/master master # 或者,更好的是,在获取的分支之上重放你的本地工作

还有一个 command-line tool (gh) which can facilitate the operations above

这是它如何工作的视觉效果:

https://i.stack.imgur.com/cEJjT.png

另请参阅“Are Git forks actually Git clones?”。


另请参阅 bassistance.de/2010/06/25/git-fu-updating-your-github-fork 以获得很好的总结。
@syedrakib 我更喜欢git rebase upstream/master,但我在答案中添加了两种可能性。
@PaBLoX 如果您已经分叉了一个仓库,那么您正在您的分支中处理您的仓库:变基并强制推送:不涉及任何混乱。即使是正在进行的拉取请求也会被正确更新。
@PaBLoX 您不会造成混乱:您git push --force,将您在 GitHub 上的分支历史记录替换为您刚刚重新建立的本地分支。由于只有你在使用悲伤的分支,因此不会涉及任何混乱。
我明白。我仍然认为这很难,不平凡且不直观。仍然奇怪的是,我的更改总是在最前面(最后),而实际上它们是之前进行的。我之前发布的解决方案看起来更好(仍然很重要)。问题是提交哈希发生了变化(显然,因为有一个新的父级)并且在调用问题时会在 github 内部产生很多噪音。仍然让我感到惊讶的是,没有办法在不创建毫无意义的合并提交或对历史“撒谎”的情况下保持与上游的更新并管理自己的分支。
B
Boris Däppen

除了 VonC 的答案之外,您还可以根据自己的喜好进一步调整它。

从远程分支获取后,您仍然需要合并提交。我会替换

$ git fetch upstream

$ git pull upstream master

因为 git pull 本质上是 git fetch + git merge。


如果我知道上游分支对现有文件没有任何更改,但只添加了几个资源文件怎么办 - 我还需要合并吗?
在这种情况下,它肯定会快进
如何让上游主机覆盖所有本地文件(所以没有合并冲突)上游主机在这种情况下领先于代码,所以我们100%相信它......已经设法做到这一点
@snh_nl git rebase upstream master 请注意,如果您与 upstream/master 有足够的分歧,这并不是没有冲突的。请参阅 git-scm.com/docs/git-rebase(tl;dr:这会将您的本地 master 硬重置为上游的 master,然后尝试从分歧点重新合并所有本地提交)
H
Hussain

利用:

git remote add upstream ORIGINAL_REPOSITORY_URL

这会将您的上游设置为您从中分叉的存储库。然后这样做:

git fetch upstream      

这将从原始存储库中获取包括 master 在内的所有分支。

在本地 master 分支中合并这些数据:

git merge upstream/master

将更改推送到您的分叉存储库,即到源:

git push origin master

瞧!您已完成原始存储库的同步。


如何让上游主机覆盖所有本地文件(所以没有合并冲突)上游主机在这种情况下领先于代码,所以我们100%相信它......已经设法做到这一点
C
Cody Gray

video 显示 how to update a fork directly from GitHub

脚步:

在 GitHub 上打开你的 fork。单击拉取请求。单击新的拉取请求。默认情况下,GitHub 会将原始版本与您的 fork 进行比较,如果您未进行任何更改,则不应有任何可比较的内容。点击切换底座。现在 GitHub 会将您的 fork 与原始版本进行比较,您应该会看到所有最新的更改。单击为此比较创建拉取请求并为您的拉取请求分配一个可预测的名称(例如,从原始更新)。单击创建拉取请求。向下滚动并单击合并拉取请求,最后单击确认合并。如果您的 fork 没有任何更改,您将能够自动合并它。


不幸的是,正如上面在接受答案的评论中提到的那样,这种漂亮的图形方法会在您的分叉中产生额外的噪音。因此推荐使用命令行方法:help.github.com/articles/syncing-a-fork
我找不到 switching the base 选项
2020 年 9 月的 Github Web UI 有一个“比较和拉取请求”按钮(以前有单独的按钮)。现在它有一个我必须使用的“跨分支比较”链接。因此,可以完成从 master 到 fork 的更新的提取和合并(即拉取)操作,但不能通过这些指令完成。即使这是一个快进,它也使历史变得混乱。
V
Vlad L.

如果你想在没有 cli 的情况下完成,你可以在 Github 网站上完全完成。

转到您的 fork 存储库。单击新的拉取请求。确保将您的 fork 设置为基本存储库,并将原始(上游)存储库设置为头存储库。通常,您只想同步主分支。创建一个新的拉取请求。选择合并按钮右侧的箭头,并确保选择变基而不是合并。然后单击按钮。这样,就不会产生不必要的合并提交。完毕。


P
Peter Mortensen

如果您使用的是 GitHub 桌面应用程序,右上角有一个同步按钮。点击它,然后点击左上角附近的 Update from <original repo>

如果没有要同步的更改,这将处于非活动状态。

这里有 some screenshots 可以简化此操作。


C
Chan

如果没有什么可丢失的,您也可以删除您的分叉,只需转到设置...转到下面的危险区域部分,然后单击删除存储库。之后它将要求您输入存储库名称和密码。之后,您只需再次分叉原始文件。


S
Saurabh P Bhandari

要自动将您的分叉存储库与父存储库同步,您可以使用 GitHub 上的 Pull App

有关详细信息,请参阅 Readme

对于要保留对分叉存储库所做更改的高级设置,请参阅我对类似问题 here 的回答。