Git合并多个提交

205 阅读2分钟

1 使用场景

有时候开发一个功能,提交了多次,那么就会产生很多git commit信息。在一个开发比较频繁的仓库,这种提交方式会使得主干分支提交记录会看起来比较混乱。为了解决这种问题,我们可以通过合并提交,使git提交记录看起来更加简洁

2 合并命令

2.1 合并命令 : git rebase

git rebase可以用来改写历史。使用参数 -i,可以进入一个交互式页面。后面跟commit id,这个commit id需要注意,不是要修改的提交记录的commit id,而是要修改记录的父commit id。假设当前有三个提交记录,提交顺序依次是A-B-C,如果想要合并B、C的提交记录,那么commit id就是A。

git rebase -i <commit ID>

2.2 交互界面

进入交互界面可以看到,提交记录依次从上到下展示(提交记录越早越靠前展示)。每条记录分三个部分,分别是操作命令(如:pick)、commit id(如:bc0b8e0),提交信息(如:rebase3:add1) Snipaste_2023-12-09_18-09-26.png

2.3 操作命令

进入交互界面后,下面有注释,告诉了我们每个命令的作用,这里简单解释下

  • p, pick:保留这个commit,不做任何处理,也是默认的命令
  • r, reword:保留这个commit,但是修改提交信息
  • e, edit:保留这个commit,但是rebase时会暂停
  • s, squash:保留这个commit,但是会和上一个commit命令合并
  • f, fixup:和squash相同,但是不会保存当前commit提交信息
  • x, exec:执行其他shell命令
  • b, break:删除该commit
# Commands:
# 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 [-C | -c] <commit> = like "squash" but keep only the previous
#                    commit's log message, unless -C is used, in which case
#                    keep only this commit's message; -c is same as -C but
#                    opens the editor
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')

需要注意以下场景

  • 删除某个 commit 行,则该 commit 会丢失掉
  • 删除所有的 commit 行,则 rebase 会被终止掉
  • 可以对 commits 进行排序,git 会从上到下进行合并。

合并提交这里使用squash 或者 fix即可

3 使用示例

3.1 目标

合并最近三个提交

3.2 查看git提交历史

使用命令git log --oneline,找到父commit id:7f5ddad Snipaste_2023-12-09_18-23-40.png

3.3 进入交互界面

使用命令:git rebase -i 7f5ddad,将最下面两个提交记录的命令改为s,如下图所示,然后按ESC键退出编辑界面,输入wq保存退出

Snipaste_2023-12-09_18-29-29.png 进入下面这个页面后,继续输入wq保存退出 Snipaste_2023-12-09_18-32-19.png 修改成功

Snipaste_2023-12-09_18-34-05.png

使用命令git log --oneline,可以看到已经修改成功 Snipaste_2023-12-09_18-35-01.png