背景
在提交代码前,想避免出现大量的merge,有两种方案:
1.开发完,在commit之前,先pull代码,然后再commit,最后push,但这样只能适用只有一个commit的情况。
2.开发完,在merge到目标分支之前,先用git rebase -i 合并分支,然后再git rebase <目标分支>,
最后再merge到目标分支
这样就不会产出大量的merge信息,但是方案2中,使用rebase导致了提交记录时间乱序问题。
接下来我们来分析方案2这个问题的产生原因以及解决办法。
分析
使用rebase为什么会导致时间乱序问题?
rebase也叫变基,相当于把地基改变了。
如下图:从 master 分支 checkout 出 future分支 进行开发,并产生了D,E,F3个提交,同时远端 master 生成了C,G提交。

接下来我们使用 git rebase master 进行变基。因为现在future的基座是B,变基以后,future基座就变成了G。
提交D,E,F自然被排在G后面了,这样我们开发的代码没有被其他分支污染,还是很独立的。
注意:git pull --rebase origin master 跟 git rebase master 的区别,前者基于远端master,后者基于本地master
就看两者是否一致,若一致,用哪个命令都一样
下图是变基以后的效果:

很明显,如果我们加上提交时间的话,再看看。

看出问题了吗?变基以后的分支G提交时间是18:00,但是D,E,F的时间都是早上9点,这样的时间线合并到master不被吐槽才怪。

解决
一般我们在future完成后,都会选择把所有提交记录合并,这样看起来比较舒适,因为开发的时候会提交一下无意义的提交记录。
解决方案:
1.合并提交记录
git rebase -i <commitId>
例如以下提交记录,只想保留 feat: A新增功能1 提交。

1-1:
git rebase -i df6faba38e196c49da546af5a725cb88e52df4d4

1-2:
按 ‘i’进入编辑模式,需要保留的提交记录前面保留 pick 不变,其他的改成squash;
按 ‘Esc’ 退出编辑,输入 ‘:wq’ 回车保存。

1-3:
按 ‘i’进入编辑模式,删除不要的提交记录;
按 ‘Esc’ 退出编辑,输入 ‘:wq’ 回车保存。

1-4: 合并提交记录之后效果

2.修改CommitDate
2-1:
git commit
效果如下:
时间修改成功,但是commitId 也变了

3.进行变基
3-1:变基
git rebase master
// 可以自行了解一下 git pull --rebase origin <目标分支> 跟 git rebase <目标分支>的区别;
3-2:解决冲突

解决完冲突以后,
git add .
git rebase
按 Esc 退出编辑 输入 :wq 保存
至此,变基完成,可以将future分支merge到master了
merge后效果:

这样时间线就对了。
对应上面的例子,结果如下图:

结束
当然,也许是我学习rebase不到位导致这样的问题,或者还有更优雅的办法来解决。
其实我早发现这个问题了,只是一直没管,直到早几天被同事说了一下,于是就想到这么笨的解决方案。
我也看了大家的文章,都是介绍rebase怎么用,怎么使得提交记录清晰,但没人提到提交时间乱序的问题。
所以写了这篇文章,希望能帮到遇到这个问题的同学。
如果有其他解决方法,也希望大家能指点我一下。