GitFlow,压缩和合并问题
GitFlow, squashing and merging issues
我在我的 git 存储库中使用 GitFlow,所以我有一个 master
、develop
和(临时)release
分支。
工作流程
- 我从
develop
创建了一个新分支(例如 fix/fix-the-bug
)
- 我将修复压缩为有意义的提交
- 我将我的
fix/fix-the-bug
分支合并到 develop
- 合并足够多的分支后,我从
develop
创建一个(临时)release/x.y.z
分支
- 我在
release/x.y.z
分支中对我的脚本进行版本调整并标记提交
- 当我想将
release/x.y.z
合并到 master
时,我遇到了合并冲突。似乎 master
不明白 master
中已经存在提交
release/x.y.z
分支合并到 develop
- 我删除
release/x.y.z
有几点需要注意,不知道是否都正确:
- 我在合并到 master 时将我的提交压缩为一个提交
master
上应该有一个 git 标记指示版本号,但不确定如果我压缩提交是否能正常工作。
问题
我现在想知道:
- 我该如何修复我的存储库,因为我认为我不应该遇到这些冲突。
- 欢迎就工作流程提出任何进一步的建议(例如,在哪一部分我可以最好地执行壁球)。
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
包含A
和B
引入的所有变化,但就git而言,这是巧合;一旦 develop
包含额外的更改,即使更改 "the same" 这一事实也会丢失,并且会导致冲突(正如您所经历的)。
因此,您改为执行常规合并 - 只需省略 --squash
选项,假设您首先使用的是压缩合并:
o ------- AB <--(master)
| /
|- M - M2 <--(develop)
| / \ /
| | B <--(fix2)
\ |
A <--(fix)
这就是 git 合并工作的方式;现在未来的合并尝试将 "know" M2
(及其包含的所有内容)已经包含在 master
中,并且只有 M2
之后的更改才会包含在 "their changs" 中合并计算。
这也是 gitflow 想要完成的事情。
我在我的 git 存储库中使用 GitFlow,所以我有一个 master
、develop
和(临时)release
分支。
工作流程
- 我从
develop
创建了一个新分支(例如fix/fix-the-bug
) - 我将修复压缩为有意义的提交
- 我将我的
fix/fix-the-bug
分支合并到develop
- 合并足够多的分支后,我从
develop
创建一个(临时) - 我在
release/x.y.z
分支中对我的脚本进行版本调整并标记提交 - 当我想将
release/x.y.z
合并到master
时,我遇到了合并冲突。似乎master
不明白master
中已经存在提交
release/x.y.z
分支合并到develop
- 我删除
release/x.y.z
release/x.y.z
分支
有几点需要注意,不知道是否都正确:
- 我在合并到 master 时将我的提交压缩为一个提交
master
上应该有一个 git 标记指示版本号,但不确定如果我压缩提交是否能正常工作。
问题
我现在想知道:
- 我该如何修复我的存储库,因为我认为我不应该遇到这些冲突。
- 欢迎就工作流程提出任何进一步的建议(例如,在哪一部分我可以最好地执行壁球)。
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
包含A
和B
引入的所有变化,但就git而言,这是巧合;一旦 develop
包含额外的更改,即使更改 "the same" 这一事实也会丢失,并且会导致冲突(正如您所经历的)。
因此,您改为执行常规合并 - 只需省略 --squash
选项,假设您首先使用的是压缩合并:
o ------- AB <--(master)
| /
|- M - M2 <--(develop)
| / \ /
| | B <--(fix2)
\ |
A <--(fix)
这就是 git 合并工作的方式;现在未来的合并尝试将 "know" M2
(及其包含的所有内容)已经包含在 master
中,并且只有 M2
之后的更改才会包含在 "their changs" 中合并计算。
这也是 gitflow 想要完成的事情。