从develop分支选择性地合并更改到master分支

6
我正在使用git-flow来维护我的分支,因此我有主分支和开发分支。
开发分支比主分支领先几个提交(约50-100个)。
但是有一些需要提前从开发分支选择性地将功能带到主分支上。
我应该怎么做?应该使用cherry-pick吗?如果在最终合并回主分支之前再次将开发分支rebase到主分支上会发生什么?

5
请注意,在git-flow模型中,“master”分支是发布分支,只应包含来自“develop”的合并提交。遵循这个模型,保持“master”分支符合要求是很好的做法。 - CharlesB
好的,谢谢建议。但我们需要尽快将功能引入生产环境,而这些功能分散在开发分支中。我想我必须使用cherry-pick,并修复/删除任何不应存在的更改。看起来历史记录在此期间会变得混乱。 - Nora Olsen
develop分支重新定位到master不是git flow的一部分,该模型规定develop分支应该被非快进式合并到master分支。如果您与其他开发人员在develop分支上进行协作,那么如果您重新定位共享的develop分支,可能会给他们带来麻烦,因为他们需要将自己的工作与重新定位后的分支同步。 - user456814
我们面临相同的问题 - 生产版本存在问题,而这个问题在开发版本中已经被修复了。那不就是遵循热修复流程(https://datasift.github.io/gitflow/GitFlowHotfixBranch.png)的情况下,仅需在该图表中将红色(热修复)版本与(黄色)开发版本之间的箭头反转,然后使用 cherry-pick 将提交获取到热修复分支中吗? - Dave Elton
4个回答

3
你考虑过创建另一个开发分支,专门用于集成这些特定的功能,然后使用rebase -i删除你不想要的提交或将你想要的提交cherry-pick到该分支中吗?
看起来,甚至可以使用git flow的发布分支来完成这一点,但如果这样做,你必须选择交互式rebase /删除方法。虽然这不是版本发布的预期方式,但至少可以保持主分支的清洁。
有关在发布时删除更改的过程,在http://dymitruk.com/blog/2012/02/05/branch-per-feature/文档中有很好的说明,具体在"取出特性比放入特性更有力量"一节中。如果你的功能没有从同一个提交开始(如果你遵循git-flow,则可能不是),那么你可能会遇到困难。但你可以尝试做到最好。
示例:交互式rebase
$ git checkout -b reduced_functionality_branch develop
$ git rebase -i sha1-for-previous-release-point
...remove the stuff you don't want...

此时,reduced_functionality_branch 中应该只包含您想要发布的提交。


1
你可以使用 "git cherry-pick"。请注意,由于您选择性地提交了提交,源分支上的提交必须是完整的。您可能也会遇到一些合并冲突。

1
在这种情况下,挑选应该可以正常工作。当您进行变基时,看起来好像已经提交了挑选的更改,而其他工作还没有提交,但这就是任何变基所得到的结果。
正如CharlesB所说,将挑选的更改合并到主分支中不完全符合git-flow模型。但它与之相差不远,而且这是解决您特定问题的一种简单方法。

我尝试在 cherry-pick 后将主分支合并回开发分支,但似乎这些更改在顶部?看起来我会有双重提交,因为 cherry-pick 是新的提交?而且历史记录也会变得混乱。 - Nora Olsen
你的意思是将合并回develop会产生冲突吗? - CharlesB
1
没有冲突,但是由于挑选的提交是新提交,所以它们在顶部。因此,在将主分支合并回开发分支后,我在开发分支的历史记录中看到了重复的提交。 - Nora Olsen
@Nora,你能发布一下你运行的命令和结果吗?否则讨论起来会很混乱。谢谢。 - naomi

0

在开发和主分支中使用.gitattributes,并放置以下代码

<file which is branch specific> merge=ours

运行以下命令

git config --global merge.ours.driver true

下次合并分支时,您所有的东西都会被合并,除了<分支特定的文件>


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