将原始GitHub存储库中的新更新提取到分叉的GitHub存储库中

why*_*why 587 git github

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

如何引入在原点中所做的更改并将它们合并到我的存储库中?

Von*_*onC 681

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

GitHub fork手册页:

叉子

一旦克隆完成,你的repo将有一个名为" origin" 的遥控器指向你在GitHub上的分叉.
不要让这个名字混淆你,这并不是指你分叉的原始回购.为了帮助您跟踪该回购,我们将添加另一个名为"upstream"的远程:

$ 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
Run Code Online (Sandbox Code Playgroud)

你还有一个红宝石宝石,可以促进那些GitHub操作.

岔

另请参阅" Git fork是git clone? ".

  • 另见http://bassistance.de/2010/06/25/git-fu-updating-your-github-fork/以获得一个很好的总结. (14认同)
  • @syedrakib我更喜欢`git rebase upstream/master`,但我在答案中添加了两种可能性. (2认同)
  • @PaBLoX你不会造成混乱:你`git push --force`,用你刚才重新定位的本地分支替换GitHub分支的历史记录.因为只有你使用悲伤的分支,所以不涉及任何混乱. (2认同)
  • 我明白.我仍然认为这很难,很重要而且不直观.仍然奇怪的是,我的变化总是在最后(最后),而实际上它们是在之前制作的.我之前发布的解决方案看起来更好(仍然非常重要).问题是提交散列更改(显然,因为有一个新的父级)并在调用问题时在github中生成大量噪声.令我感到惊讶的是,没有办法保持上游更新并管理自己的分支,而不会创建无意义的合并提交或"谎言"历史记录. (2认同)

n00*_*hie 99

除了VonC的答案,你可以根据自己的喜好进一步调整它.

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

$ git fetch upstream
Run Code Online (Sandbox Code Playgroud)

$ git pull upstream master
Run Code Online (Sandbox Code Playgroud)

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

  • 当然,在这种情况下,它只会做一个快进 (4认同)

Dmi*_*lov 63

视频演示了如何直接从GitHub更新分支

脚步:

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

  • 不幸的是,这个漂亮的图形方法会在您的分支中产生额外的噪音,如上面在接受的答案的评论中所述.因此,建议使用命令行方法:https://help.github.com/articles/syncing-a-fork/ (2认同)

Raj*_*Raj 57

使用:

git remote add upstream ORIGINAL_REPOSITORY_URL
Run Code Online (Sandbox Code Playgroud)

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

git fetch upstream      
Run Code Online (Sandbox Code Playgroud)

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

在本地主分支中合并此数据:

git merge upstream/master
Run Code Online (Sandbox Code Playgroud)

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

git push origin master
Run Code Online (Sandbox Code Playgroud)

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


cak*_*aww 6

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

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