GitFlow,压缩和合并问题

GitFlow, squashing and merging issues

我在我的 git 存储库中使用 GitFlow,所以我有一个 masterdevelop 和(临时)release 分支。

工作流程

  1. 我从 develop 创建了一个新分支(例如 fix/fix-the-bug
  2. 我将修复压缩为有意义的提交
  3. 我将我的 fix/fix-the-bug 分支合并到 develop
  4. 合并足够多的分支后,我从 develop
  5. 创建一个(临时)release/x.y.z 分支
  6. 我在 release/x.y.z 分支中对我的脚本进行版本调整并标记提交
  7. 当我想将 release/x.y.z 合并到 master 时,我遇到了合并冲突。似乎 master 不明白 master
  8. 中已经存在提交
  9. release/x.y.z 分支合并到 develop
  10. 我删除release/x.y.z

有几点需要注意,不知道是否都正确:

问题

我现在想知道:

I squash my commits into one commit when merging into master

当您合并到 master 时,听起来您正在使用 git merge --squash。这不是标准的 git 流程实践;你会做一个正常的合并。

常规合并和压缩合并之间的全部区别在于压缩合并不记录您要合并到的分支上的新提交(即本例中的 master)和源分支上的原始提交;这就是为什么后续合并不理解 master 上的内容已经对应于 develop.

的先前状态

使用常规合并的 "downside" 是 git 的默认输出,例如在记录 master 时,将包括所有个人提交,而不仅仅是一个列表该版本在 master 提交;但您可以使用 --first-parent 选项来解决这个问题。

要将其转化为视觉效果,您可以从一个空白的存储库开始

o <--(master)

在不创建提交的情况下,您启动 develop 分支,然后启动 fix 分支,您可以在该分支上做一些工作

o <--(master)(develop)
 \
  A <--(fix)

你合并到 dev

o <--(master)
|
|- M <--(develop)
\ /
 A <--(fix)

您可能会做更多的修复

o <--(master)
|
|- M - M2 <--(develop)
| / \ /
| |  B <--(fix2)
\ |
 A <--(fix)

现在如果你将 squash 合并到 master,你会得到类似

的东西
o -------- AB <--(master)
|
|- M - M2 <--(develop)
| / \ /
| |  B <--(fix2)
\ |
 A <--(fix)

AB包含AB引入的所有变化,但就git而言,这是巧合;一旦 develop 包含额外的更改,即使更改 "the same" 这一事实也会丢失,并且会导致冲突(正如您所经历的)。

因此,您改为执行常规合并 - 只需省略 --squash 选项,假设您首先使用的是压缩合并:

o ------- AB <--(master)
|        /
|- M - M2 <--(develop)
| / \ /
| |  B <--(fix2)
\ |
 A <--(fix)

这就是 git 合并工作的方式;现在未来的合并尝试将 "know" M2(及其包含的所有内容)已经包含在 master 中,并且只有 M2 之后的更改才会包含在 "their changs" 中合并计算。

这也是 gitflow 想要完成的事情。