如何从 GitHub 上 fork 的非主分支合并更改?

17

以下两个StackOverflow问题中,被接受的答案介绍了如何在以下情况下合并来自衍生存储库的更改:当您fork一个存储库,原始存储库被修改,然后您想将对主分支所做的更改合并回到您的forked存储库中。

然而,我不清楚如何保持与原始存储库中非主分支的同步。例如,当我最初forkbitprophet的fabric存储库时,它包含以下分支:

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

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

3个回答

24

情境1:删除不存在的分支

为了删除不再存在的分支,我按照StackOverflow问题如何同时在本地和Github上删除Git分支?中回答中的说明,执行了以下命令:

$ 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

场景三:跟踪新的非主干分支

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

$ 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将永远不会与主repo保持更新。幸运的是,有一个简单的工具可以帮助你做到这一点。从Git术语上讲,您的Fork在功能上与master相等,因此如果您想跟踪对主库所做的更改,则可以在您的Forked repo中创建一个跟踪分支,并在您希望提交某些内容时将这些更改合并到您的Fork主分支中。我强烈推荐使用‘GitHub’ gem这是一个工具,你可以安装它来帮助你轻松地跟踪任何与你相关的其他存储库中的更改。请参见本页底部的README文本以获取安装和用法说明:http://github.com/defunkt/github-gem/tree/master

忽略Github Fork队列 它很邪恶!Fork队列是维护者用来从贡献者中选择单个提交但不希望合并整个分支的工具。如果您玩弄Fork队列,您将破坏您的Fork(尽管它可以修复,请阅读Something went wrong)。许多新手在Github上都觉得他们应该对Fork队列做些什么,因为其中有很多可能冲突的更改,他们不知道如何保持Fork最新的方式是什么。请阅读“Keeping your fork up to date”并找出!

Django的Github工作流程

Django项目有关于如何在Github上协作的说明,该方法似乎是处理fork和合并上游更改的标准方式。

不同的初始Fork配置

Long Nguyen在Michael Hartl的博客上的客座文章设置您的Git存储库以供在GitHub上进行开源项目描述了一种有趣的方法来设置您分叉的Github存储库。根据文章的目标:

  • 保持存储库同步,以便每

3

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

  • local:你当前工作站上的Git存储库。
  • origin:这是你fork的fabric版本:cumulusware
  • upstream: bitprophet / fabric,是所有其他forked repo的起源。

你可以将upstream添加为本地的远程存储库。

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

查看远程分支

 git branch -r 

并将原始版本中存在但已不再存在于上游的内容进行推送(删除)

 git push origin :anOldBranch

然后
 git remote prune origin

清除本地仓库中的分支(这些分支已经不存在于origin,因为您刚刚删除了它们)
同时,需要同步那些在origin和upstream都存在的分支(在将您的工作推送到origin之前,在upstream上重新基于本地分支可以轻松地向upstream发起拉取请求:bitprophet只需进行快进合并即可包含您的工作)
我不知道是否有更简单的过程/命令/脚本来同步两个远程仓库。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接