【问题标题】:How do you merge changes on non-master branches from a forked github repository?如何合并来自分叉 github 存储库的非主分支上的更改?
【发布时间】:2011-01-02 03:54:29
【问题描述】:

在以下两个 StackOverflow 问题中,接受的答案描述了在您分叉存储库、修改原始存储库、然后您想要合并对主存储库所做的更改的情况下,如何合并来自分叉存储库的更改分支回你的分叉仓库。

但是,我不清楚您如何在您分叉的原始存储库中的非主分支上保持最新状态。例如,当我最初 fork bitprophet's fabric repository 时,它包含以下分支:

  • 主人
  • 0.9
  • 0.9-doc-rewrite(不再存在)
  • path-and-#24(不再存在)

最后两个分支不再存在,现在有一个新分支flexible-task-declarations。我已经获取、合并和推送了我的 master 分支,因此 master、origin/master 和 upstream/master 都具有相同的 SHA1 哈希并指向相同的 git 快照。但是,我不确定如何删除不再存在的分支并更新新分支,以便我的 fork 是最新的。我是否需要跟踪每个上游分支,然后单独获取、合并和推送每个分支,还是有更好的方法?

【问题讨论】:

    标签: git github fork git-branch


    【解决方案1】:

    场景一:删除不再存在的分支

    要删除不再存在的分支,我按照 StackOverflow 问题How do I delete a Git branch both locally and in Github? 的答案中的说明发出以下命令:

    $ git push origin :0.9-doc-rewrite
    $ git push origin :path-and-#24
    

    场景 2:合并现有非 master 分支中的更改

    为了更新 upstream/0.9 分支,我执行了以下操作:

    $ git checkout --track origin/0.9
    $ git fetch upstream
    $ git merge upstream/0.9
    $ git push
    

    场景 3:跟踪新的非主分支

    不确定这是最好的处理方式,但这是我所做的:

    $ git branch flexible-task-declarations upstream/flexible-task-declarations
    Branch flexible-task-declarations set up to track remote branch flexible-task-declarations from upstream.
    $ git checkout flexible-task-declarations
    $ git push origin flexible-task-declarations
    

    确认所有分支都在同一个提交:

    $ git branch -av
    

    这将显示所有分支(本地和远程)并显示最近的提交消息和 SHA1 哈希。

    网络研究可能揭示处理场景 3 的更好方法

    与简单的 Git 克隆或 SVN 签出相比,Git 分叉之间的主要区别在于,除非您这样做,否则您的分叉将永远不会与主存储库保持同步。幸运的是,有一个简单的工具可以帮助您做到这一点。你的 fork 是独立的,并且在 Git 术语中等同于 master,所以如果你想跟踪 master 的更改,你可以在你的 fork repo 中创建一个跟踪分支,并在你想要提交某些内容时将这些更改合并到你的 fork 的 master 分支中。 我强烈推荐“GitHub”gem,它是一个可以安装的工具,可帮助您轻松跟踪与您相关的任何其他存储库中的更改。有关安装和使用,请参阅本页底部的 README 文本: http://github.com/defunkt/github-gem/tree/master

    忽略 Github 分叉队列这是邪恶的!对于喜欢从贡献者那里挑选单个提交但不希望合并到整个分支中的维护者来说,fork 队列是一个工具。如果你玩弄 fork 队列,你会损坏你的 fork(虽然它可以被修复,请阅读出错了)。 github 上的许多新手觉得他们应该对 fork 队列做点什么,因为那里有很多可能相互冲突的更改,而且他们不知道保持 fork 最新的假定方法是什么。阅读让你的叉子保持最新并找出答案!

    Django 的 Github 工作流程

    Django 项目有关于如何Collaborate on Github 的说明,它使用似乎是处理分叉和拉入上游更改的标准方法。

    不同的初始分叉配置

    Long Nguyen 在 Michael Hartl 的博客上题为 Setting up your Git repositories for open source projects at GitHub 的客座文章描述了一种有趣的方法来设置您已分叉的 Github 存储库。根据文章,此方法的目标是:

    • 使存储库保持同步,以便每个存储库都包含完整的“官方”存储库
    • 允许开发者获取官方更新
    • 鼓励在 master 以外的分支上工作

    【讨论】:

      【解决方案2】:

      基本上,您需要考虑 3 个远程 Git 存储库:

      • 本地:您当前在工作站上的 git 存储库。
      • origin:这是你的分叉版面料:cumulusware
      • 上游:bitprophet / fabric,所有其他分叉回购的来源

      您可以将上游作为远程仓库添加到本地。

       git remote add upstream http://github.com/bitprophet/fabric.git
      

      查看远程分支

       git branch -r 
      

      并推送(删除)在原点存在但在上游不再存在的那些

       git push origin :anOldBranch
      

      然后

       git remote prune origin
      

      清除本地 repo 上的分支(原点不再存在,因为您刚刚删除了它们)

      同时存在于源站和上游的分支也需要同步(在将您的工作推送到源站之前,将本地分支重新设置在上游分支的基础上,这可能是向上游发出非常简单的拉取请求的好方法: bitprophet 只能进行快进合并以包含您的工作)

      我不知道您是否可以有一个更简单的进程/命令/脚本来同步两个远程存储库。

      【讨论】:

        【解决方案3】:

        我在寻找如何在接受的答案中干净地执行场景 3 时遇到了这个答案。经过一番挖掘,使用 git 1.8 您可以执行以下操作:

        git fetch upstream                      ;make sure you have all the upstream changes
        git checkout --no-track upstream/0.9    ;grab the new branch but don't track it
        git branch --set-upstream-to=origin/0.9 ;set the upstream repository to your origin
        git push                                ;push your new branch up to origin
        

        【讨论】:

          猜你喜欢
          • 2011-05-19
          • 2013-04-18
          • 2013-03-16
          • 1970-01-01
          • 2017-04-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-08
          相关资源
          最近更新 更多