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


615

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

如何提取原产地所做的更改并将其合并到我的存储库中?


1
可能重复,或者可能只是相关:在GitHub中的分支之间合并

如果还有其他标签可能需要同步,请git push --force origin --tags在建议的解决方案之后执行!
MediaVince

Answers:


716

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

GitHub fork手册页

叉子

克隆完成后,您的存储库将有一个名为“ origin” 的远程文件,指向您在GitHub上的fork。
不要让名称混淆您,这并不指向您从中派生的原始存储库。为了帮助您跟踪该存储库,我们将添加另一个名为“上游”的远程服务器:

$ cd github-services
$ git remote add upstream git://github.com/pjhyett/github-services.git
$ git fetch upstream

# then: (like "git pull" which is fetch + merge)
$ git merge upstream/master master

# or, better, replay your local work on top of the fetched branch
# like a "git pull --rebase"
$ git rebase upstream/master

您还拥有一个可以促进GitHub操作红宝石

分叉

另请参阅“ Git fork是git clone? ”。


14
另请参见bassistance.de/2010/06/25/git-fu-updating-your-github-fork,以获取不错的摘要。
VonC

2
@syedrakib我更喜欢a git rebase upstream/master,但是我在答案中添加了两种可能性。
VonC

1
@PaBLoX如果你已付出回购,您正在使用您的回购,在您的分支:底垫和强制推:不涉及任何混乱。即使正在进行的拉取请求也将正确更新。
VonC 2014年

2
@PaBLoX不会造成混乱:您git push --force,将您在GitHub上的分支的历史记录替换为您刚刚重新定位的本地分支。由于只有您使用的是悲伤分支,因此不会涉及混乱。
VonC 2014年

2
我明白。我仍然认为这是困难,不平凡和不直观的。奇怪的是,我所做的更改总是放在最前(最后),而实际上是在之前进行的。我之前发布的解决方案看起来更好(还是很重要的)。问题在于提交哈希会发生变化(显然,因为有一个新的父对象),并且在调用问题时会在github内部产生大量噪音。仍然令我感到惊讶的是,没有一种方法可以保持与上游的更新并管理自己的fork,而无需创建无意义的合并提交或关于历史的“谎言”。
Pablo Olmos de Aguilera C.

99

除了VonC的答案,您还可以根据自己的喜好对它进行调整。

从远程分支获取后,您仍然必须合并提交。我会取代

$ git fetch upstream

$ git pull upstream master

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


如果我知道上游分支对现有文件没有任何更改,但是仅添加了很少的资源文件,该怎么办-我仍然需要合并吗?
azec-pdx

4
当然,在这种情况下,它只会做个快速前进
Domness

如何使上游主服务器覆盖所有本地文件(因此没有合并冲突),在这种情况下,上游主服务器在代码中处于领先地位,因此我们信任它100%...设法做到了
snh_nl

1
@snh_nl git rebase upstream master请注意,如果您与保持足够的背离,这并不是没有冲突的upstream/master。请参阅git-scm.com/docs/git-rebase(tl;dr:这会将您的本地主节点硬重置为上游的本地主节点,然后尝试从分歧的角度重新合并所有本地提交)
Cowbert

68

视频显示了如何直接从GitHub更新fork

脚步:

  1. 在GitHub上打开fork。
  2. 点击 Pull Requests
  3. 点击New Pull Request。默认情况下,GitHub会将原始版本与您的fork进行比较,如果您未进行任何更改,则不应有任何可比较的内容。
  4. 点击switching the base。现在,GitHub将把您的fork与原始的进行比较,您应该会看到所有最新的更改。
  5. 单击Create a pull request进行比较,并为您的请求请求分配一个可预测的名称(例如,从原始文件更新)。
  6. 点击Create pull request
  7. 向下滚动并单击Merge pull request,最后Confirm合并。如果您的叉子没有任何变化,您将能够自动合并它。

3
不幸的是,这种不错的图形化方法会在叉中产生额外的噪音,如上面在接受答案的注释中所述。因此,建议使用命令行方法:help.github.com/articles/syncing-a-fork
Jonathan Cross

我找不到switching the base选项
alper

64

采用:

git remote add upstream ORIGINAL_REPOSITORY_URL

这会将您的上游设置为您从中派生的存储库。然后执行以下操作:

git fetch upstream      

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

在您的本地master分支中合并以下数据:

git merge upstream/master

将更改推送到您的派生存储库,即源:

git push origin master

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


如何使上游主服务器覆盖所有本地文件(因此没有合并冲突),在这种情况下,上游主服务器在代码中处于领先地位,因此我们信任它100%...设法做到了
snh_nl

一种方法是简单地删除本地副本,然后进行新的克隆:)
ARK

1

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

如果没有要同步的更改,则它将处于不活动状态。

这是一些屏幕截图,可简化此操作。


1

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


1

如果您想不使用cli进行操作,则可以在Github网站上完全进行操作。

  1. 转到您的fork库。
  2. 点击 New pull request
  3. 确保将fork设置为基础存储库,并将原始(上游)存储库设置为head存储库。通常,您只想同步master分支。
  4. Create new pull request
  5. 选择合并按钮右侧的箭头,并确保选择“变基”而不是“合并”。然后点击按钮。这样,它将不会产生不必要的合并提交。
  6. 做完了

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.