交互式git rebase压缩提交记录,合并提交记录

前言

交互式git reabse可以编辑某个提交点之后的提交记录.包括删除,修改,合并等.

本文安装git图形工具SourceTree. 以图形界面方式能更好地查看commit节点情况

本文中说到”压缩提交”和”合并提交”是同一个意思

⚠️注意

最好不要在主分支(例如:master)使用交互式rebase操作提交记录.

因为交互式rebase操作会令参与操作的提交节点之后的所有提交节点的提交id(commit-hash)会发生变化.

方式1: 使用命令压缩提交

1
git rebase -i [commit-hash]

动画例子: git rebase -i i8fe5 管理i8fe5 之后的提交节点

案例

SourceTree打开项目可以看到, 分支上有6个提交记录, v1 — v6

目标: 压缩v1之后的提交到v2, 即: 合并(v3, v4, v5, v6) —> v2

1. 找出基点提交id(commit-hash).

基点: 变基rebase参考点, 参考点可以理解为”地基”.只作为参照,不参与操作

案例中v1就是基点, 所以要找到v1的提交id

基点

通过SourceTreegit log, 找到v1的提交id

v1提交id为: b6919c7

v1提交id

2. 执行交互式git rebase命令

找到v1的提交id(b6919c7)后, 可以执行命令管理v1之后的提交节点

1
git rebase -i b6919c7 

执行命令后显示

其中pick, squash, fixup这3个操作与压缩提交有关

  • pick: 使用提交
  • squash : 将提交融合到前一个提交中;
  • fixup: 将提交融合到前一个提交中,不保留该提交的日志消息;
1
2
3
4
5
6
p, pick <commit> = use commit
r, reword <commit> = use commit, but edit the commit message
e, edit <commit> = use commit, but stop for amending
s, squash <commit> = use commit, but meld into previous commit
f, fixup <commit> = like "squash", but discard this commit's log message
x, exec <command> = run command (the rest of the line) using shell

3. 修改git rebase的交互文本压缩提交

压缩(v3,v4,v5,v6) —> v2 ,

1
2
3
4
5
pick d9ca07c v2
f 3f83f0a v3
f ab92fa4 v4
f abcde39 v5
f 0034515 v6

  • f, fixup: 将提交融合到前一个提交中,不保留该提交的日志消息;
  • pick: 使用提交

确认编辑完成后, “:wq”保存退出

4. 效果

(v3, v4, v5, v6) 合并到 v2

合并后

图中的v2是一个全新的提交节点, 提交id和之前的v2是不同的. 只是提交信息和之前的v2相同而已

方式2: 使用图形界面压缩提交

图形界面软件: SourceTree

依次操作

按钮“用此前的squash” 可以理解为讲选择的提交记v6录合并到上一个提交记录v5

之后依次把v3,v4,v5,v6合并

确定操作,点击”确认”.

压缩提交的时候,SourceTree会自动生成默认的提交消息.

(可选)如果需要修改提交信息

⚠️注意: 使用交互式rebase修改提交消息(commit message), 会改变当前和之后所有提交节点的提交id
所以, 主分支(例如:master)也最好不要使用这个操作

参考:


交互式git rebase压缩提交记录,合并提交记录
https://blog.9001001.xyz/posts/5126db6466c6/
作者
夏日雪糕
发布于
2023年8月24日
许可协议