Git subtree 要不要使用 –squash 参数
这篇讲的是,作者在使用 Git subtree 管理多层代码包含关系时,遇到了一个持续困扰的冲突问题,并深入分析了 --squash 参数背后的机制与应对策略。 作者从实际项目(Gregarius 管理 MagpieRSS,后者又管理 Snoopy)出发,指出使用 subtree 的 --squash 参数虽然能让主项目提交历史更清爽,却会在后续更新(subtree pull)时,反复引发需要手动解决的冲突。反之,不用 --squash 虽然更新顺畅,但子项目的历史会“污染”主项目。 文章清晰地剖析了根因:--squash 会合并并消除子项目的历史提交,导致下次合并时 Git 找不到共同的父提交,从而无法自动处理冲突。作者引用并评估了 StackOverflow 上的一种平衡方案:在一个专用分支上进行不带 --squash 的更新以保留历史、避免冲突,然后在合并到主分支时使用 `git merge --squash` 将其压缩为一个简洁的提交。 文章最后总结了两种典型的使用场景:如果只是单向接收子项目更新,任选一种方式均可;如果是拆分大项目(如 Symfony2),则建议避免 squash,主项目主导开发再 split 出子项目发布。作者的实践表明,专用分支方案虽然略增复杂度,但能有效兼顾提交历史的整洁与更新的顺畅。