使用 git squash 保持干净的主分支,及相应的调试方法

1. 通过 git squash 合并分支

有的项目要求一个 commit 必须包含完整的功能,但在开发时通常会提交很多细粒度的 commit,比如 add test clean code 等。这种情况下可以使用 git squash 将多个 commit 压缩,得到干净的主分支。

1
2
3
4
5
6
7
8
git merge --squash tmp
git commit -m "squash tmp"

# In the following graph, G is c--d--e--f--g squashed together

X-------------G stable
/
a---b---c---d---e---f---g tmp

2. 调试被 squash 后的代码

squash 的优点是可以得到简洁的 commit 记录,但缺失详细的 commit 记录会对后面 debug 造成一些影响。

比如,使用FastDDS后,我一直在调试一个无法重连的bug,通过 log 可以定位到这个 bug 是在一次 2000 行的 commit 引入的。如果现在开始读这两千行代码肯定会浪费很多时间。

现在要借助 github,在 pull request 页面可以找到详细的 23 个 commit 记录,并定位到引入 bug 的 commit:

为了防止这个 commit 不完整,我们需要手动下载引入 bug 的代码,和引入 bug 之前的代码,分别做一次回归测试。(手动下载代码的原因是,这些 commit ID 不在 git repo 里,无法 checkout)

在 master 里改完 bug 以后,为了防止引入新 bug,别忘了跑回归测试。