我的上一家公司用Github管理代码。
每个人在实现一个新功能的时候都会开一个feature branch,做完就提交pull request,代码审核完之后就merge到develop分支。
这是一组标准动作。但是在实际工作中,我们总是遇到这样一个问题。
不同分支的commit在merge到develop之后会,犬牙交错在一起。
由于某些原因,我们常常需要回滚已经合并到develop的代码。
由于各个feature branch的代码过于水乳交融,有好几次我们发现根本无法准确回退某些代码。
如果有些功能是急需发布的,但是由于混进去了有bug的代码又回退不了,这时候是相当急人的。
这个问题当时困扰了我们很久,最后解决这个问题的是一个小小的Git功能:Squash Merge。
Squash Merge其实很简单,它就是在merge分支的时候把分支上的所有commit合并为一个commit后再merge到目标分支。
用命令行的话就是 git merge --squash
Github里是可以配置pull request只允许使用squash merge的, 在repo的settings -> Merge Button里设置。
用上了squash merge后,每个被合并的分支在develop上就只有一个commit,不管要回退哪一个都很方便。
简单总结是,合并pull request用squash merge,可以让每个合并都只有一个commit,这样各个pull request间就互不干扰了。