16

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

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

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

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

4

3 回答 3

24

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

要删除不再存在的分支,我按照 StackOverflow 问题的答案中的说明如何在本地和 Github 中删除 Git 分支?通过发出以下命令:

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

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

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

Django 的 Github 工作流程

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

不同的初始分叉配置

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

  • 使存储库保持同步,以便每个存储库都包含完整的“官方”存储库
  • 允许开发者获取官方更新
  • 鼓励在 master 以外的分支上工作
于 2010-01-06T19:02:05.097 回答
3

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

  • 本地:您当前在工作站上的 git 存储库。
  • 来源:这是您的分叉版本的面料: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 只会进行快进合并以包含您的工作)

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

于 2010-01-06T18:58:30.757 回答
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
于 2013-12-19T00:18:33.527 回答