我一直在反复考虑,无法确定哪种工作流程更好。我应该优先选择将合并到主分支的分支压缩吗?还是只是将它们合并。
我倾向于使用合并-压缩,并一直保持一致。
合并-压缩的优点:
- 更清晰的历史记录。
- 更容易使用二分查找。
有没有任何理由我不应该使用合并-压缩,而改用普通的合并呢?
我一直在反复考虑,无法确定哪种工作流程更好。我应该优先选择将合并到主分支的分支压缩吗?还是只是将它们合并。
我倾向于使用合并-压缩,并一直保持一致。
合并-压缩的优点:
有没有任何理由我不应该使用合并-压缩,而改用普通的合并呢?
这要看情况。
压缩合并会丢失信息,是否需要压缩取决于这些信息是否重要。对于在未来六个月或六年后试图弄清楚为什么一行代码是这样的人来说,这些信息是否重要就很重要了。这取决于分支中有什么、更改的数量、更改的大小以及日志消息的好坏。
一个简单的经验法则?考虑压缩的结果,并问自己“如果我在主分支上编码,我会提交这个吗?”如果答案是肯定的,那么diff和日志结合起来将允许未来的人弄清楚为什么一行代码发生了变化,那么就压缩合并。
如果答案是否定的,这不是一个可以接受的提交到主分支的提交,更改太多或者太多交织的更改,那么就不要压缩它。合并它,也许在考虑分支内的任何提交是否可以一起压缩之后再合并它。
至于压缩合并是否“更干净”、“更容易二分”...我觉得这只是表面上的。如果你把书架上所有书的页面拿出来,缝成一个巨大的封面,那么这样做就“更干净”了,因为现在你只需要担心一本书。如果它们是一堆各自独立的小说,那么这并没有什么帮助。如果它们是年度会议报告,最好将它们绑在一起。
从某种意义上说,压缩合并更容易二分,因为你不太可能有一个提交会破坏构建,但是如果你的二分落在一个巨大的更改块上,你仍然必须解决大量可能导致问题的情况,这使得二分者的工作更加困难。
使用相同的标准来决定是否压缩合并,就像你用于提交到主分支一样,你会做得很好。
git merge --squash
创建一个父提交,因此不显示与正在合并的父提交的连接。-A---------C <-- `git merge --squash`
\
*--*--B
git merge --no-ff
(不快进)来强制进行合并提交。此提交将具有两个父级。优点在于保持树的清晰,同时仍然具有详细的提交历史记录(如果需要)。-A---------C <-- `git merge --no-ff`
\ /
*--*--B
两个 C
提交是相同的,如果要保留 B
,请选择后者。