使用Git将所有更改从开发中的功能分支合并到发布分支

Jef*_*amb 3 git git-flow

我们使用GitFlow来管理我们的软件存储库:http://nvie.com/posts/a-successful-git-branching-model/

我有一种情况,我不知道如何处理这个分支模型.

在几个星期的时间里,我做了大约十几个提交到一个feature分支(分支develop).为了减轻合并的负担develop,我在这两周的过程中将变化合并develop到我的feature分支中3次.该feature分公司完成且其变动合并回develop.

然而,事实证明,在大约一个月前release分支的分支上也需要此功能develop.有没有办法合并来自旧分支的更改,但省略了develop我合并到其中3次的更改?

jub*_*0bs 6

根据Git Flow模型,你错过了火车

您的回购必须看起来像这样:

o - o - o - o - o - o [master]
 \
  \       o - o - o - o - o [release]
   \     / 
    o - o - o - o - o - o - o - o - o - o - o [develop]
                 \       \       \         /
                  o - o - o - o - o - o - o [feature]
Run Code Online (Sandbox Code Playgroud)

但是,如果你和你的团队确实遵循Git Flow模型,我会给你带来坏消息:船已经航行了.更具体地说,将feature分支(现在也在分支develop)中的功能合并到分支中为时已晚release.这是Git Flow不允许的.

如果您查看主要nvie.com图的以下部分,您将看到,一旦创建了发布分支,就不允许从中接收任何内容develop,更不用说任何功能分支了.发布分支的唯一目的是稳定/合并到实际发布,即合并到master.

在此输入图像描述

如果你真的坚持Git Flow模型,你应该

  • 放弃当前的release分支并创建一个新的分支develop,
  • 或冻结所有工作release,然后将其develop重新粘贴到恢复工作之前,
  • 或者等待下一个版本将新功能合并到一个版本中.

如果你没有坚持Git Flow就好了......

如果你愿意在这个问题上反对Git Flow,你可以随时获取你的功能release而不会从最近的事情中污染它develop.以下方法的缺点是您的历史将有点混乱,并将包含"重复提交"; 但是如果您真的坚持将feature分支中的功能合并到当前/主动版本中,我认为您没有太多选择.

为方便起见,我们假设你的repo看起来如下(我用字母标记了一些提交):

o - o - o - o - o - o [master]
 \
  \       o - o - o - o - o [release]
   \     / 
    o - A - B - C - o - o - o - o - o - o - o [develop]
                 \       \       \         /
                  D - E - F - G - H - I - J [feature]
Run Code Online (Sandbox Code Playgroud)

你能做的是

  1. 查看 release

    git checkout release
    
    Run Code Online (Sandbox Code Playgroud)
  2. 获取提交A和提示之间的所有非合并提交修订的列表feature; 在这种情况下,那将是提交B,C,D,E,G,I和J.命令

    git rev-list --no-merges A..feature
    
    Run Code Online (Sandbox Code Playgroud)

    应该为你做到这一点.

  3. 传递该修订列表,cherry-pick以便应用这些提交引入的更改release:

    git cherry-pick `git rev-list --no-merges A..feature`
    
    Run Code Online (Sandbox Code Playgroud)

    你最终会得到这样的东西:

    o - o - o - o - o - o [master]
     \
      \         o - o - o - o - o - B'- C'- D'- E'- G'- I'- J' [HEAD=release]
       \       /                                            
        \     /                                             
         o - A - B - C - o - o - o - o - o - o - o [develop]
                      \       \       \         /         
                       D - E - F - G - H - I - J [feature]
    
    Run Code Online (Sandbox Code Playgroud)
  4. 稳定release分支.

  5. 一旦release击中master,你也应该合并它develop,你应该重新站起来.