我用的是 GitFlow 在我的 git 仓库中,所以我有一个 master
, develop
和(临时) release
分公司。
工作流程
develop
(例如 fix/fix-the-bug
)fix/fix-the-bug
分为 develop
release/x.y.z
枝 develop
release/x.y.z
分支并标记该提交release/x.y.z
变成 master
,我得到合并冲突。好像是 master
不明白提交已经存在于 master
release/x.y.z
分支被并入 develop
release/x.y.z
有几件事要注意,不知道是否都正确。
master
表示版本号,但不知道如果我把提交的内容压扁,这样做是否正确。疑问
我现在想知道,
合并到主分支时,我将我的提交压缩成一个提交。
听起来你用的是 git merge --squash
当你合并到 master
. 这不是gitflow的标准做法,你只需要做一个普通的合并。
普通合并和压扁合并的区别在于,压扁合并并不记录合并到的分支上的新提交与源分支上的原始提交之间的关系。master
和源分支上的原始提交之间的关系;这就是为什么后续的合并并不理解在 master
已经对应于以前的状态 develop
.
使用常规合并的 "缺点 "是,当记录时,git的默认输出是 master
例如,将包括所有的individaul提交,而不仅仅是发布在 master
; 但你可以通过使用 --first-parent
选项。
为了将其可视化,你需要从一个空白的repo开始
o <--(master)
在没有创建提交的情况下,您可以启动 develop
枝,然后是 fix
所属部门
o <--(master)(develop)
\
A <--(fix)
你合并到开发
o <--(master)
|
|- M <--(develop)
\ /
A <--(fix)
你可能会做更多的修复
o <--(master)
|
|- M - M2 <--(develop)
| / \ /
| | B <--(fix2)
\ |
A <--(fix)
现在,如果你将合并压制到主控,你会得到这样的东西。
o -------- AB <--(master)
|
|- M - M2 <--(develop)
| / \ /
| | B <--(fix2)
\ |
A <--(fix)
和 AB
包含了所有的变化 A
和 B
介绍,但就git而言,那是巧合;而一旦 develop
含有额外的改动,即使是 "相同 "的改动也会丢失,并导致冲突(如你所经历的)。
所以,你应该做一个常规的合并--只需省掉 --squash
选项,假设您一开始就使用了 squash merges。
o ------- AB <--(master)
| /
|- M - M2 <--(develop)
| / \ /
| | B <--(fix2)
\ |
A <--(fix)
这就是git对合并的工作方式;现在,未来的合并尝试将 "知道" M2
(以及它所包含的一切)已经包含在 master
而只有在 M2
将作为 "他们的changs "包含在合并计算中。
这也是 gitflow 的意图。