Git 多次提交记录优化显示

Catalogue
  1. 1. 查看提交记录
  2. 2. 选取要合并的commit
  3. 3. 合并commit
  4. 4. 强制提交

写这篇文章的目的, 是为了记录下如何解决Git多次提交记录聚合展示的方法。因为一个功能点的开发包括开发,测试等多个环节, 难免就会导致提交很多次commit, 而为了提交记录看起来更清晰, 且和功能点更好对应, 把这些相同目的的commit合并为一个就显得比较有意义了。当然, 也顺便治一下自己的强迫症。

查看提交记录

1
git log --pretty=oneline

选取要合并的commit

执行完上面的命令, 我们看到以下的提交记录:

1
2
3
4
fea1d93fa84e112c2b7314db66b5a66a962e2166 fix: 修复模块xxxbug: bbb
98f2a41ea1bd6c0d5843f49480fd7d371f106b13 fix: 修复模块xxxbug: aaa
7ab4333e2e26b9109cb580bff88de4b0373976b3 feat: 新增功能模块xxx
57654061b4a3808e04f5a4f6300b78c94048be23 fix: 线上接口超时bug修复

假设我们是想 fea1d93f、98f2a41e、7ab4333e 这3个commit, 作为新的模块xxx的提交记录。此处, 我们选取57654061作为聚合点(该commit之前的都需要被合并)。

合并commit

执行以下命令:

1
git rebase -i 57654061

此处的commit 57654061 为 7ab4333e 的前一次提交。

执行完上述命令后, 会出现以下一个commit列表, 我们需要从中选取要保留的commit:

1
2
3
4
5
pick 7ab4333e feat: 新增功能模块xxx
pick 98f2a41e fix: 修复模块xxxbug: aaa
pick fea1d93f fix: 修复模块xxxbug: bbb

# ...

编辑为下面所示, 将选取commit以外的行前面的pick改为squash or s, 然后输入: wq 保存退出。

1
2
3
4
5
pick 7ab4333e feat: 新增功能模块xxx
s 98f2a41e fix: 修复模块xxxbug: aaa
s fea1d93f fix: 修复模块xxxbug: bbb

# ...

若无冲突 or 冲突已 fix, 会出现一个commit message的编辑页面, 修改commit message, 然后输入: wq 保存退出。

1
2
3
4
feat: 新增功能模块xxx

# 修复模块xxxbug: aaa
# 修复模块xxxbug: bbb

若存在冲突, 则需要解决, 保留最新的记录, 输入命令:

1
2
git add .
git rebase --continue

若想放弃此次commit合并, 输入命令:

1
git rebase --abort

强制提交

commit massage 修改完成后, 提交commit, 输入git push -f or git push --force即可。

注意:

  1. 上述操作的前提是在非master分支, 建议开发新feature的时候在非master分支, 最终上线才合并到master
  2. 如果是master分支, 即便有master分支的提交权限, 也是不允许直接强制提交的(Gitlab), 需要去Git Repository的设置中(Protected Branches)开启