Git 合并功能分支而不从公共祖先分支回来?
假设我有一个非常简单的分支情况,像这样,有一个开发分支和一个生产分支,在过去的某个时候,有一个共同的祖先叫做common:Git 合并功能分支而不从公共祖先分支回来?,git,github,version-control,merge,Git,Github,Version Control,Merge,假设我有一个非常简单的分支情况,像这样,有一个开发分支和一个生产分支,在过去的某个时候,有一个共同的祖先叫做common: D1---D2---D3---D4---F1'---F2' [feature, dev] / ...---COMMON \ P1---P2---P3---P4 [production] D1---D2---D3---D4---F1
D1---D2---D3---D4---F1'---F2' [feature, dev]
/
...---COMMON
\
P1---P2---P3---P4 [production]
D1---D2---D3---D4---F1'---F2' [feature, dev]
/
...---COMMON
\
P1---P2---P3---P4 [production]
现在,是时候制作一个新功能了。我们希望该功能现在就在开发中,一个月后就可以投入生产。简单的做法是将功能从common分支,然后在需要时将其合并到开发和生产中:
D1---D2---D3---D4---F1'---F2' [feature, dev]
/
...---COMMON
\
P1---P2---P3---P4 [production]
D1---D2---D3---D4---F1'---F2' [feature, dev]
/
...---COMMON
\
P1---P2---P3---P4 [production]
但这一次,我不想这么做。我不想这样做,因为自从common之后,开发人员和生产人员都发生了很大的变化,所以在common之外开发这个特性将是一件非常痛苦的事情
D1---D2---D3---D4---F1'---F2' [feature, dev]
/
...---COMMON
\
P1---P2---P3---P4 [production]
我真正想做的是,在树的后面的某个点上开发它,就像这样,只是为了我自己的幸福,这样当我制作这个功能时,dev的所有新更新都可以出现:
D1---D2---D3---D4---F1'---F2' [feature, dev]
/
...---COMMON
\
P1---P2---P3---P4 [production]
D1---D2---D3---D4---F1'---F2' [feature, dev]
/
...---COMMON
\
P1---P2---P3---P4 [production]
现在,这当然可以用于将功能合并到dev中,但是当我将此功能合并到生产中时,它将从dev中带来一大堆我不想要的东西
D1---D2---D3---D4---F1'---F2' [feature, dev]
/
...---COMMON
\
P1---P2---P3---P4 [production]
一种解决方案是合并开发和生产。但我真的不想这么做。我需要关于dev的资料,但这些资料不在生产中,可能需要很长时间
D1---D2---D3---D4---F1'---F2' [feature, dev]
/
...---COMMON
\
P1---P2---P3---P4 [production]
诚然,我想要的东西只有在逻辑上是可能的,只要该特性不干扰开发或生产中可能发生冲突的任何东西。但事实并非如此。它将与两者兼容,并且我对dev所做的更改,因为common甚至与该功能无关。我只是想让他们在我做特写的时候出现。我不想每次想测试任何东西时都要不断地将该特性合并到dev中
D1---D2---D3---D4---F1'---F2' [feature, dev]
/
...---COMMON
\
P1---P2---P3---P4 [production]
它将与两者兼容,并且我对dev
所做的更改,因为common甚至与功能不相关
D1---D2---D3---D4---F1'---F2' [feature, dev]
/
...---COMMON
\
P1---P2---P3---P4 [production]
这意味着您可以从dev
开始,然后,当您想在prod
中合并feature
时,您可以在prod
上重新设置feature
的基础
D1---D2---D3---D4---F1'---F2' [feature, dev]
/
...---COMMON
\
P1---P2---P3---P4 [production]
这样,您将只在prod
上提交功能提交,这可以合并功能
(快进合并)假设您的功能
分支从开发
分支的某个点引入2次提交:
F1---F2 [feature]
/
D1---D2---D3---D4 [dev]
/
...---COMMON
\
P1---P2---P3---P4 [production]
D1---D2---D3---D4---F1'---F2' [feature, dev]
/
...---COMMON
\
P1---P2---P3---P4 [production]
如果你的目的是
D1---D2---D3---D4---F1'---F2' [feature, dev]
/
...---COMMON
\
P1---P2---P3---P4 [production]
将该功能集成到dev
分支中
将功能集成到生产
分支中
将dev
分支合并到production
分支中
根据您希望历史记录显示的内容,完成此操作的方法不止一种。假设您希望最小化非快进合并的数量,请从以下几点开始:
git rebase dev feature
git checkout dev
git merge feature
D1---D2---D3---D4---F1'---F2' [feature, dev]
/
...---COMMON
\
P1---P2---P3---P4 [production]
你会有
D1---D2---D3---D4---F1'---F2' [feature, dev]
/
...---COMMON
\
P1---P2---P3---P4 [production]
然后,如果您想在production
分支中使用该功能,但还不想合并dev
分支,请执行以下操作:
D1---D2---D3---D4---F1'---F2' [feature, dev]
/
...---COMMON
\
P1---P2---P3---P4 [production]
git rebase --onto production <Commit ID of D4> feature
git checkout production
git merge feature
最后,您可以将dev
分支与以下内容集成:
D1---D2---D3---D4---F1'---F2' [feature, dev]
/
...---COMMON
\
P1---P2---P3---P4 [production]
git rebase production dev
git checkout production
git merge dev
您将有:
D1---D2---D3---D4---F1'---F2' [feature, dev]
/
...---COMMON
\
P1---P2---P3---P4 [production]
...---COMMON---P1---P2---P3---P4---F1''---F2''---D1'---D2'---D3'---D4'
| |
[feature] [production, dev]
当然,如果您有冲突,您需要相应地合并它们。请参阅,以避免两次提交具有相同的作者、日期和消息
D1---D2---D3---D4---F1'---F2' [feature, dev]
/
...---COMMON
\
P1---P2---P3---P4 [production]