我们使用GitFlow来管理我们的软件存储库:http://nvie.com/posts/a-successful-git-branching-model/
我有一种情况,我不知道如何处理这个分支模型.
在几个星期的时间里,我做了大约十几个提交到一个feature分支(分支develop).为了减轻合并的负担develop,我在这两周的过程中将变化合并develop到我的feature分支中3次.该feature分公司完成且其变动合并回develop.
然而,事实证明,在大约一个月前release分支的分支上也需要此功能develop.有没有办法合并来自旧分支的更改,但省略了develop我合并到其中3次的更改?
您的回购必须看起来像这样:
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,你可以随时获取你的功能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)
你能做的是
查看 release
git checkout release
Run Code Online (Sandbox Code Playgroud)获取提交A和提示之间的所有非合并提交修订的列表feature; 在这种情况下,那将是提交B,C,D,E,G,I和J.命令
git rev-list --no-merges A..feature
Run Code Online (Sandbox Code Playgroud)
应该为你做到这一点.
传递该修订列表,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)稳定release分支.
release击中master,你也应该合并它develop,你应该重新站起来.