修复使用git rebase导致提交记录时间线乱序问题

2,365 阅读3分钟

背景

在提交代码前,想避免出现大量的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提交。

rebaset1.png

接下来我们使用 git rebase master 进行变基。因为现在future的基座是B,变基以后,future基座就变成了G。
提交D,E,F自然被排在G后面了,这样我们开发的代码没有被其他分支污染,还是很独立的。

注意:git pull --rebase origin master 跟 git rebase master 的区别,前者基于远端master,后者基于本地master
就看两者是否一致,若一致,用哪个命令都一样

下图是变基以后的效果:

Snipaste_2022-12-19_11-28-46.png

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

Snipaste_2022-12-19_11-35-39.png

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

Snipaste_2022-12-19_11-41-23.png

解决

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

微信图片_20221219134352.jpg

    1-1:
        git rebase -i df6faba38e196c49da546af5a725cb88e52df4d4
    

Snipaste_2022-12-19_13-46-29.png

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

Snipaste_2022-12-19_13-50-15.png

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

Snipaste_2022-12-19_13-52-19.png

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

Snipaste_2022-12-19_13-53-55.png

2.修改CommitDate
    2-1:
        git commit --amend --no-edit --date 'Mon Dec 19 19:00:00 2022 +0800'
        --amend 是在最后一个提交上追加提交信息,追加提交后,commitId会改变
        --date  是想修改的时间,按上面格式填写
        效果如下:
            时间修改成功,但是commitId 也变了
            

微信图片_20221219140536.jpg

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

Snipaste_2022-12-19_14-09-24.png

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

Snipaste_2022-12-19_14-18-11.png

这样时间线就对了。

对应上面的例子,结果如下图:

Snipaste_2022-12-19_14-32-49.png

结束

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