首页 文章

如何更新GitHub分叉存储库?

提问于
浏览
2964

我最近分叉了一个项目并应用了几个修复程序 . 然后我创建了一个拉取请求,然后被接受 .

几天后,另一位撰稿人做出了另一项改变 . 所以我的fork不包含那个改变 .

我怎样才能把这个改变变成我的叉子?当我进行进一步的更改时,是否需要删除并重新创建我的分支?或者是否有更新按钮?

16 回答

  • 4

    截至本答复发布之日,GitHub在Web界面中没有(or shall I say no longer?)此功能 . 但是,您可以要求 support@github.com 为此添加投票 .

    In the meantime, GitHub user bardiharborow has created a tool to do just this: https://upriver.github.io/

    来源在这里:https://github.com/upriver/upriver.github.io

  • 1

    从2014年5月开始,可以直接从GitHub更新分支 . 这仍然适用于2017年9月, BUT 它将导致脏的提交历史 .

    • 在GitHub上打开你的叉子 .

    • 点击Pull Requests .

    • 点击New Pull Request . 默认情况下,GitHub会将原始文件与您的fork进行比较,并且不应该进行任何更改 .

    • 如果看到该链接,请单击切换基础 . 否则,手动将基础分支下拉到您的分叉,并将分叉下移到上游 . 现在GitHub会将你的分叉与原始分析进行比较,你应该看到所有最新的变化 .

    • 创建拉取请求并为拉取请求指定可预测的名称(例如, Update from original ) .

    • 向下滚动到合并拉取请求,但不要点击任何内容 .

    现在您有三个选项,但每个选项都会导致一个不太干净的提交历史记录 .

    • 默认会创建一个丑陋的合并提交 .

    • 如果单击下拉列表并选择"Squash and merge",则所有干预提交将被压缩为一个 . 这通常是你不想要的 .

    • 如果单击Rebase并合并,所有提交将被"with"你,原始PR将链接到您的PR,GitHub将显示 This branch is X commits ahead, Y commits behind <original fork> .

    所以,是的,您可以使用GitHub Web UI保持您的repo更新其上游,但这样做会玷污您的提交历史记录 . 坚持the command line而不是 - 这很容易 .

  • 12

    实际上,可以通过浏览器中上游的任何提交在fork中创建一个分支:

    然后,您可以将该分支提取到本地克隆,并且当您在该提交之上推送编辑时,您不必将所有数据推回到GitHub . 或者使用Web界面更改该分支中的某些内容 .

    它是如何工作的(这是猜测,我不知道GitHub究竟是如何做到的):forks共享对象存储并使用namespaces来分隔用户的引用 . 因此,您可以通过fork访问所有提交,即使它们在分叉时不存在 .

  • 26

    如果您正在使用GitHub for Windows,那么他们现在只需一次单击功能即可更新分支:

    • 在UI中选择存储库 .

    • 单击顶部的"Update from user/branch"按钮 .

  • 31

    很多答案最终都会移动父存储库的fork one commit ahead . 这个答案总结了here找到的步骤 move your fork to the same commit as the parent .

    • 将目录更改为本地存储库 .

    • 如果您不是 git checkout master ,请切换到主分支

    • 将父项添加为远程存储库, git remote add upstream <repo-location>

    • 问题 git fetch upstream

    • 问题 git rebase upstream/master

    • 在此阶段,您通过键入 git status 来检查提交将要合并的内容

    • 问题 git push origin master

    有关这些命令的更多信息,请参阅step 3 .

  • 387

    请按照以下步骤操作 . 我尝试了它们,它帮助了我 .

    Checkout to your branch

    语法:git branch yourDevelopmentBranch示例:git checkout master

    Pull source repository branch for getting the latest code

    语法:git pull https://github.com/tastejs/awesome-app-ideas master示例:git pull https://github.com/ORIGINAL_OWNER/ORIGINAL_REPO.git BRANCH_NAME

  • 84

    这是GitHub关于Syncing a fork的官方文件:

    同步分支设置在同步之前,需要添加指向上游存储库的远程 . 您最初分叉时可能已经这样做了 . 提示:同步fork只会更新存储库的本地副本;它不会在GitHub上更新您的存储库 . $ git remote -v
    #列出当前的遥控器
    来源https://github.com/user/repo.git(fetch)
    来源https://github.com/user/repo.git(推)

    $ git remote add upstream https://github.com/otheruser/repo.git
    #设置一个新的遥控器

    $ git remote -v
    #验证新的远程
    来源https://github.com/user/repo.git(fetch)
    来源https://github.com/user/repo.git(推)
    上游https://github.com/otheruser/repo.git(fetch)
    上游https://github.com/otheruser/repo.git(推)
    同步将存储库与上游同步需要两个步骤:首先必须从远程获取,然后必须将所需的分支合并到您的当地分公司 . 从远程存储库中获取Fetching将引入其分支及其各自的提交 . 它们存储在特殊分支下的本地存储库中 . $ git fetch upstream
    # grab 上游远程的分支机构
    remote:计数对象:75,完成 .
    remote:压缩对象:100%(53/53),完成 .
    远程:总计62(增量27),重复使用44(增量9)
    打开包装对象:100%(62/62),完成 .
    来自https://github.com/otheruser/repo

    • [new branch] master - > upstream / master
      我们现在将上游的主分支存储在本地分支,上游/主$ git分支-va中
      #列出所有本地和远程跟踪分支
      *掌握a422352我的本地提交
      遥控器/原产地/ HEAD - >原产地/主人
      remotes / origin / master a422352我的本地提交
      remotes / upstream / master 5fdff0f一些上游提交
      合并现在我们已经获取了上游存储库,我们希望将其更改合并到我们的本地分支中 . 这将使该分支与上游同步,而不会丢失我们的本地更改 . $ git checkout master
      #查看我们当地的主分支机构
      切换到分支'主'

    $ git merge upstream / master
    #将上游的主人合并到我们自己的主人
    正在更新a422352..5fdff0f
    快进
    自述文件| 9 -------
    README.md | 7
    更改了2个文件,7个插入(),9个删除( - )
    删除模式100644自述文件
    创建模式100644 README.md
    如果您的本地分支没有任何唯一提交,git将执行“快进”:$ git merge upstream / master
    正在更新34e91da..16c56ad
    快进
    README.md | 5 -
    1个文件已更改,3个插入(),2个删除( - )
    提示:如果要在GitHub上更新存储库,请按照此处的说明进行操作

  • 39

    这取决于您的存储库的大小以及您如何分叉它 .

    如果它是一个非常大的存储库,您可能希望以特殊方式管理它(例如丢弃历史记录) . 基本上,您可以获得当前版本和上游版本之间的差异,提交它们然后樱桃回到主人 .

    试试看this one . 它描述了如何处理大型Git存储库以及如何使用最新更改来上游它们 .

  • 8

    如果,像我一样,你应该真的,你可以做到以下几点 .

    从fork的本地克隆中,创建上游远程 . 你只需要这样做一次:

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

    然后,只要您想要了解上游存储库主分支,您需要:

    git checkout master
    git pull upstream master
    

    假设你自己从未对主人做过任何事情,你应该已经完成了 . 现在,您可以将本地主服务器推送到原始远程GitHub fork . 您还可以在现在最新的本地主服务器上重新设置开发分支 .

    因此,在初始上游设置和主检出之后,您只需运行以下命令即可将主设备与上游同步: git pull upstream master .

  • 8

    Android Studio现在已经学会了使用GitHub fork存储库(您甚至不必通过console命令添加“上游”远程存储库) .

    打开菜单VCS→Git

    并注意最后两个弹出菜单项:

    • 重新启动我的GitHub前叉

    • 创建拉取请求

    试试吧 . 我使用第一个来同步我的本地存储库 . 无论如何,在您单击“Rebase my GitHub fork”之后,可以在Android Studio中访问父远程存储库(“上游”)的分支,您将能够轻松地使用它们 .

    (我使用带有“Git集成”和“GitHub”插件的Android Studio 3.0 . )

  • 3

    克隆分叉存储库后,转到克隆所在的目录路径和Git Bash Terminal中的几行 .

    $ cd project-name
    
    $ git remote add upstream https://github.com/user-name/project-name.git
     # Adding the upstream -> the main repo with which you wanna sync
    
    $ git remote -v # you will see the upstream here 
    
    $ git checkout master # see if you are already on master branch
    
    $ git fetch upstream
    

    在那里你很高兴 . 主存储库中的所有更新更改都将推送到您的fork存储库中 .

    “fetch”命令对于在项目中保持最新是必不可少的:只有在执行“git fetch”时,您才会被告知同事推送到远程服务器的更改 .

    您仍然可以访问here以获取进一步的查询

  • 656

    自2013年11月以来,GitHub开启了一个非官方的功能请求,要求他们添加一个非常简单直观的方法来保持本地分支与上游同步:

    https://github.com/isaacs/github/issues/121

    注意:由于功能请求是非官方的,因此建议您联系 support@github.com 以添加对此类功能的支持 . 上面的非官方特征请求可以用作对此实施的兴趣量的证据 .

  • 3

    我用这一行更新了我的分叉回购:

    git pull https://github.com/forkuser/forkedrepo.git branch
    

    如果您不想将另一个远程 endpoints 添加到项目中,请使用此方法,如此处发布的其他解决方案 .

  • 21

    作为这个答案的补充,我一直在寻找一种方法来一次更新来自上游分支的克隆repo(origin)的所有远程分支 . 这就是我做到的 .

    这假设您已经配置了一个指向源存储库的上游远程数据库(来自分支的源)并与之同步 git fetch upstream .

    然后运行:

    for branch in $(git ls-remote --heads upstream|sed 's#^.*refs/heads/##'); do git push origin refs/remotes/upstream/$branch:refs/heads/$branch; done
    

    此命令的第一部分列出了上游远程仓库中的所有磁头,并删除了SHA-1,后跟 refs/heads/ 分支名称前缀 .

    然后,对于每个分支,它将上游远程跟踪分支(本地端的 refs/remotes/upstream/<branch> )的本地副本直接推送到原始远程分支(远程端的 refs/heads/<branch> ) .

    任何这些分支同步命令都可能由于以下两个原因之一而失败:上游分支已被重写,或者您已将该分支上的提交推送到您的分支 . 在第一种情况下,你没有向你的分支上的分支提交任何内容,可以安全地强行推送(添加 -f 开关;即上面命令中的 git push -f ) . 在另一种情况下,这是正常的,因为您的fork分支已经发散,并且您不能指望sync命令在您的提交已合并回上游之前工作 .

  • 3249

    Foreword: 您的fork是"origin",您分叉的存储库是"upstream" .

    让我们假设您已经使用以下命令将叉子克隆到计算机:

    git clone git@github.com:your_name/project_name.git
    cd project_name
    

    If that is given then you need to continue in this order:

    • 将“upstream”添加到克隆的存储库(“origin”):
    git remote add upstream git@github.com:original_author/project_name.git
    
    • 从“上游”获取提交(和分支):
    git fetch upstream
    
    • 切换到fork的“master”分支(“origin”):
    git checkout master
    
    • 存储“主”分支的更改:
    git stash
    
    • 将“上游”的“主”分支中的更改合并到“原点”的“主”分支中:
    git merge upstream/master
    
    • 解决合并冲突(如果有)并提交合并
    git commit -am "Merged from upstream"
    
    • 将更改推送到fork
    git push
    
    • 取回你藏匿的变化(如果有的话)
    git stash pop
    
    • 你做完了!恭喜!

    GitHub还提供了有关此主题的说明:Syncing a fork

  • 4

    在forked存储库的本地克隆中,可以将原始GitHub存储库添加为"remote" . ("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 替换最后一个命令 . 但是,为了进一步提供尽可能干净的拉取请求,可能最好进行rebase .


    如果你已经将你的分支重新命名为 upstream/master ,你可能需要强制推送才能将它推送到GitHub上你自己的分叉存储库 . 你这样做:

    git push -f origin master
    

    您只需要在重新定位后第一次使用 -f .

相关问题