如何从分叉的github存储库合并非主分支上的更改?

时间:2010-01-06 17:37:21

标签: git github fork git-branch

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

但是,我不清楚如何跟踪您分叉的原始仓库中的非主分支机构。例如,当我最初分叉bitprophet's fabric repository时,它包含以下分支:

  • 0.9
  • 0.9-doc-rewrite(不再存在)
  • 路径 - 和 - #24(不再存在)

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

3 个答案:

答案 0 :(得分:24)

场景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:合并现有非主分支中的更改

为了使上游/ 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 checkout相比,Git fork之间的一个主要区别在于,除非你这样做,否则你的fork永远不会使用master repo保持最新状态。幸运的是,有一个简单的工具可以帮助您实现这一目标。你的fork是单独的,并且与Git中的master相同,所以如果你想跟踪对master的更改,你可以在forked repo中创建一个跟踪分支,并在你想要提交的东西时将这些更改合并到fork的master分支中。   我强烈推荐使用'GitHub'gem,这是一个可以安装的工具,可以帮助您轻松跟踪与您相关的任何其他存储库中的更改。有关安装和使用,请参阅本页底部的README文本:   http://github.com/defunkt/github-gem/tree/master

  

忽略Github Fork队列这很邪恶! fork队列是维护者的工具,他们喜欢从贡献者中选择单个提交但不希望在整个分支中合并。如果你使用fork队列,你会破坏你的fork(它可以修复,但是看错了)。 github上的许多新手觉得他们应该对fork队列做一些事情,因为那里有很多可能相互矛盾的变化,他们不知道保持一个人的叉子最新的假设方式是什么。阅读保持你的分叉是最新的,找出来!

Django的Github工作流程

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

不同的初始分叉配置

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

  • 保持存储库同步,以便每个存储库都包含完整的“官方”存储库
  • 允许开发人员提取官方更新
  • 鼓励在主人以外的分支机构工作

答案 1 :(得分:3)

基本上,你有3个远程Git repo ton考虑:

  • local:您工作站上当前的git repo。
  • 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

清除本地仓库中的分支(原因不再存在,因为你刚删除它们)

在原点和上游都存在的分支也需要同步(在将工作推送到源之前,将本地分支重新设置在上游分支之上,这对于向上游提供非常简单的拉取请求是一种好方法: bitprophet只有快进合并才能包括你的工作)

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

答案 2 :(得分:2)

我在看到如何干净地接受已接受的答案中的方案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