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

将原始GitHub存储库中的新更新拉入分叉GitHub存储库,git,github,Git,Github,我在GitHub上分叉了某人的存储库,并希望使用在原始存储库中进行的提交和更新来更新我的版本。这些是在我用叉子叉起我的副本后制作的 如何将在源代码中所做的更改拉入并合并到我的存储库中?您必须将原始存储库(您分叉的存储库)添加为远程存储库 从: 克隆完成后,您的repo将有一个名为“origin”的远程设备,它指向您在GitHub上的fork。 不要让名字迷惑你,这并不是指你最初的回购协议。为了帮助您跟踪该回购,我们将添加另一个名为“上游”的远程: $cd项目\u名称 $git远程添加上游htt

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


如何将在源代码中所做的更改拉入并合并到我的存储库中?

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

从:

克隆完成后,您的repo将有一个名为“
origin
”的远程设备,它指向您在GitHub上的fork。
不要让名字迷惑你,这并不是指你最初的回购协议。为了帮助您跟踪该回购,我们将添加另一个名为“上游”的远程:

$cd项目\u名称
$git远程添加上游https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git
$git取回上游
#然后:(比如“git pull”,即fetch+merge)
$git上游合并/主控
#或者,更好的方法是在获取的分支上重放本地工作
#就像一个“git pull--重基”
$git上游/主基地再基地
还有一个

以下是它的工作原理:


另请参见“

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

从远程分支获取数据后,仍然需要合并提交。我会取代

$ git fetch upstream

$ git pull upstream master
因为git-pull本质上是git-fetch+git-merge

步骤:

  • 在GitHub上打开你的叉子
  • 单击
    拉取请求
  • 单击
    新建拉取请求
    。默认情况下,GitHub会将原始版本与您的fork进行比较,如果您没有进行任何更改,则不应该有任何内容可供比较
  • 单击
    切换基础
    。现在GitHub会将您的fork与原始fork进行比较,您应该会看到所有最新的更改
  • 单击
    创建拉取请求
    进行比较,并为拉取请求指定一个可预测的名称(例如,从原始更新)
  • 单击
    Create pull request
  • 向下滚动并单击
    Merge pull request
    ,最后单击
    Confirm
    Merge。如果您的fork没有任何更改,您将能够自动合并它
  • 使用:

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

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

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

    git merge upstream/master
    
    将更改推送到您的分叉存储库,即原始存储库:

    git push origin master
    

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

    如果您使用的是GitHub桌面应用程序,则在右上角有一个同步按钮。单击它,然后从左上角附近的更新

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


    这里有一些简单的方法。

    如果没有任何损失,您也可以删除您的fork,只需转到设置。。。转到下面的“危险区域”部分,然后单击“删除存储库”。之后,它会要求您输入存储库名称和密码。之后,您只需再次分叉原始存储库。

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

    有关更多详细信息,请参阅


    有关要保留对forked repository所做更改的高级设置,请参阅我对类似问题的回答。

    如果不使用cli,可以在Github网站上完全执行

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

  • 另请参阅,以获得一个很好的摘要。@syedrakib我更喜欢git rebase upstream/master,但我在答案中添加了两种可能性。@PaBLoX如果您已经进行了回购,那么您正在进行回购,在您的分支中:rebase and force a push:不涉及混乱。即使是正在进行的拉取请求也会被正确更新。@PaBLoX您不会造成混乱:您
    git push--force
    ,将GitHub上分支的历史记录替换为您刚刚重新设置基础的本地分支。因为只有你在使用sad分支,所以不涉及任何混乱。我理解。我仍然认为这很难,不平凡,不直观。但奇怪的是,我的更改总是在最上面(最后),而实际上它们是以前做过的。我之前发布的解决方案看起来更好(仍然不平凡)。问题在于,提交散列会发生变化(显然,因为有一个新的父对象),在调用问题时,github内部会产生大量噪音。我仍然感到惊讶的是,在不创建毫无意义的合并提交或对历史记录撒谎的情况下,没有办法保持与上游的更新并管理您自己的fork。如果我知道上游分支对现有文件没有任何更改,该怎么办,但只添加了很少的资源文件-我还需要合并吗?当然,在这种情况下,它只会做一个快速的前进。如何使上游主机覆盖所有本地文件(所以没有合并冲突)在这种情况下,上游主机在代码中处于领先地位,所以我们100%相信它。。。设法做到了this@snh_nl
    git-rebase-upstream-master
    注意,如果您与
    upstream/master
    有足够的分歧,那么这并不是没有冲突的。请参阅(tl;dr:这会将您的本地主机硬重设为上游主机,然后尝试从发散点向前重新合并所有本地提交)可能重复的,或者可能只是相关的:。如果您可能需要同步其他标记,请参阅d
    git push origin master