我如何更新GitHub分叉库?

我最近分了一个项目并应用了几个修补程序。 然后我创建了一个接受请求。

几天后,另一个贡献者又做了一次改变。 所以我的叉子不包含这种变化。

我怎样才能将这种变化带入我的叉子? 当我进一步做出贡献时,是否需要删除并重新创建我的分支? 还是有更新按钮?


在分叉存储库的本地克隆中,可以将原始GitHub存储库添加为“远程”。 (“Remotes”就像存储库的URL的昵称 - 例如, origin是一个)。然后,您可以从该上游存储库中获取所有分支,并重新分配工作以继续使用上游版本。 就可能看起来像这样的命令而言:

# Add the remote, call it "upstream":

git remote add upstream https://github.com/whoever/whatever.git

# Fetch all the branches of that remote into remote-tracking branches,
# such as upstream/master:

git fetch upstream

# Make sure that you're on your master branch:

git checkout master

# Rewrite your master branch so that any commits of yours that
# aren't already in upstream/master are replayed on top of that
# other branch:

git rebase upstream/master

如果你不想重写主分支的历史记录(例如,因为其他人可能已经克隆了它),那么你应该用git merge upstream/master替换上一个命令。 但是,为了进一步提出尽可能干净的请求,最好重新绑定。


如果您已将分支重新分配到upstream/master ,则可能需要强制推送以将其推送到GitHub上的自有分支存储库。 你可以这样做:

git push -f origin master

您只需在重新组装之后首次使用-f


从2014年5月开始,可以直接从GitHub更新分支。 这仍然适用于2017年9月, 它会导致肮脏的承诺历史。

  • 在GitHub上打开你的fork。
  • 点击Pull Requests。
  • 点击New Pull Request。 默认情况下,GitHub会将原始文件与您的分叉进行比较,如果您未做任何更改,则不应该有任何比较。
  • 如果看到该链接,请点击切换基地。 否则,请手动将基叉分配到您的分叉,并将分叉头移到上游。 现在GitHub会将您的分支与原始分支进行比较,并且您应该看到所有最新的更改。 在这里输入图像描述
  • 创建拉取请求并为您的拉取请求分配一个可预测的名称(例如, Update from original )。
  • 向下滚动到合并请求,但不要点击任何东西。
  • 现在你有三个选项,但每个选项都会导致一个不太干净的提交历史记录。

  • 默认会创建一个丑陋的合并提交。
  • 如果你点击下拉菜单并选择“壁球和合并”,所有中间提交将被压缩成一个。 这通常是你不想要的东西。
  • 如果你点击Rebase并合并,所有提交将与你“进行”,原始PR将链接到你的PR,并且GitHub将显示This branch is X commits ahead, Y commits behind <original fork>
  • 所以是的,你可以使用GitHub网络用户界面让你的repo更新上游,但这样做会玷污你的提交历史。 坚持使用命令行 - 这很简单。


    这里是GitHub关于同步分叉的官方文档:

    同步叉子

    安装程序

    在可以同步之前,您需要添加指向上游存储库的远程设备。 当你最初分叉时,你可能已经这样做了。

    提示:同步叉只会更新存储库的本地副本; 它不会在GitHub上更新您的存储库。

    $ git remote -v
    # List the current remotes
    origin  https://github.com/user/repo.git (fetch)
    origin  https://github.com/user/repo.git (push)
    
    $ git remote add upstream https://github.com/otheruser/repo.git
    # Set a new remote
    
    $ git remote -v
    # Verify new remote
    origin    https://github.com/user/repo.git (fetch)
    origin    https://github.com/user/repo.git (push)
    upstream  https://github.com/otheruser/repo.git (fetch)
    upstream  https://github.com/otheruser/repo.git (push)
    

    同步

    有两个步骤需要将存储库与上游同步:首先,您必须从远程获取,然后您必须将所需的分支合并到本地分支。

    从远程存储库获取将引入其分支机构及其各自的提交。 这些存储在特殊分支下的本地存储库中。

    $ git fetch upstream
    # Grab the upstream remote's branches
    remote: Counting objects: 75, done.
    remote: Compressing objects: 100% (53/53), done.
    remote: Total 62 (delta 27), reused 44 (delta 9)
    Unpacking objects: 100% (62/62), done.
    From https://github.com/otheruser/repo
     * [new branch]      master     -> upstream/master
    

    我们现在将上游的主分支存储在本地分支中,上游/主分支

    $ git branch -va
    # List all local and remote-tracking branches
    * master                  a422352 My local commit
      remotes/origin/HEAD     -> origin/master
      remotes/origin/master   a422352 My local commit
      remotes/upstream/master 5fdff0f Some upstream commit
    

    合并

    现在我们已经获取了上游存储库,我们想要将其更改合并到本地分支中。 这将使该分支与上游同步,而不会丢失本地更改。

    $ git checkout master
    # Check out our local master branch
    Switched to branch 'master'
    
    $ git merge upstream/master
    # Merge upstream's master into our own
    Updating a422352..5fdff0f
    Fast-forward
     README                    |    9 -------
     README.md                 |    7 ++++++
     2 files changed, 7 insertions(+), 9 deletions(-)
     delete mode 100644 README
     create mode 100644 README.md
    

    如果你的本地分支没有任何独特的提交,git会改为执行“快进”:

    $ git merge upstream/master
    Updating 34e91da..16c56ad
    Fast-forward
     README.md                 |    5 +++--
     1 file changed, 3 insertions(+), 2 deletions(-)
    

    提示:如果要在GitHub上更新存储库,请按照此处的说明进行操作

    链接地址: http://www.djcxy.com/p/381.html

    上一篇: How do I update a GitHub forked repository?

    下一篇: What is the difference between call and apply?