我不喜欢 Git 的一件事是提交的数量。不要误会我的意思,这是一种非常方便的(安全地)存储您的工作的方法,但从长远来看,搜索的粒度太大。
让我在使用从develop分支的功能分支进行开发时描述以下场景。
- Feature1是从开发分支出来的,有 5 个提交
- Feature2是从开发分支出来的,有 3 个提交
- Feature3是从Feature1分支出来的,有 5+2 次提交。
之所以有三个分支,是因为有一个团队在处理存储库。Feature3假设Feature1已经完成,等待合并到开发中。还有其他用例,但这是最简单的示例。
我的目标是在所有功能完成后对开发进行三个提交。
使用 git 合并/拉取
上述场景运行良好。因为本质上这两个命令都将提交移到了开发分支中。当Feature1被合并时,开发引用它是五个提交。当Feature3将被合并时,只有最后两个提交将被合并到develop中。
唯一不利的方面是开发获得了太多的提交。这意味着当合并到master时,所有“噪音”都会移动。因此我的目标没有实现。
使用 git merge 和 squash
当Feature1被合并时,develop得到一个新的提交,它是所有Feature1的聚合。这非常好,因为现在只需一次提交即可跟踪该功能。删除Feature1后,所有中间提交都不再可见,从而使跟踪更容易。这也与一个拉取请求和一个 github 问题等概念相匹配。
当Feature3将被合并时,会出现冲突,问题就开始了。要解决这个问题,您需要将develop合并回feature3。与冲突。这会导致一个新的提交,其中更改了零个文件。现在我们合并壁球Feature3来开发.
我的目标实现了,但牺牲了很多微观管理。
问题/备注
据我了解,这是 git 的现实。我读过的一个建议是创建一个兄弟功能分支来保存压缩的合并提交。将同级分支用于拉取请求,因此强制每个功能使用一个提交。这并不能解决在尝试合并其他分支时产生的冲突,尤其是从其他特性分支继承的那些。
- 可以在同一个分支内做内部壁球吗?我不这么认为,但问也无妨。
- 我错过了什么?
- 这是壁球合并的权衡吗?解决可能零代码更改的冲突?
- 是否值得追求“每个功能一次提交”的概念?
- 如果不是,那么壁球的目的是什么?谁在使用这个?
我已经阅读了 rebase 的替代方案,并在合并后使用 reset 模拟了壁球,但据我所知,没有一个解决提到的合并feature3的开销。