git 合并多次提交记录(commit)

一、应用场景

在开发过程中,对于一个完整的功能可能会先后进行多次提交。这种及提交方式不利于与代码走查时或者后期回顾功能点影响范围。为此,应该将多次提交合并为一次提交。

二、git rebase合并提交

例如当前提交如下:

[root@node2 test]# git log
commit 91bfbb8f599fa0129f28f9c4fd85e9feeca335be
Author: licc <2719540156@qq.com>
Date:   Wed Oct 18 06:20:41 2023 +0000

    功能:提交DockerFile

commit 56f27c0cd2f6e0c4d60b4b36526ea352ad7da5b8
Author: licc <2719540156@qq.com>
Date:   Wed Oct 18 06:16:53 2023 +0000

    功能:提交DockerFile

commit 7dbba7b7b46aa47bb57d109cd6c4dac3f3485a0a
Author: licc <2719540156@qq.com>
Date:   Wed Oct 18 05:28:38 2023 +0000

    功能:提交DockerFile与构建脚本、日志类型输出字符串

commit ae459d7a16e878276e6bb391c16ad4b4d0d23a47
Author: licc <2719540156@qq.com>
Date:   Fri Oct 13 09:09:06 2023 +0000

    功能:增加选项--no-web-service 关闭webService
    

若我想合并前3次提交即从91bfbb8f599fa0129f28f9c4fd85e9feeca335be到7dbba7b7b46aa47bb57d109cd6c4dac3f3485a0a的提交,以下为操作步骤:

1、找到需要合并的提交记录的前一次commit id

这里是ae459d7a16e878276e6bb391c16ad4b4d0d23a47(增加选项–no-web-service 关闭webService);

2、使用git rebase -i <的前一次commit id> 开始合并:
git rebase -i ae459d7a16e878276e6bb391c16ad4b4d0d23a47

# 3表示合并前3次提交
git rebase -i HEAD~3
3、此时弹出交互框,列出了需要合并的所有提交:
pick 7dbba7b 功能:提交DockerFile与构建脚本、日志类型输出字符串
pick 56f27c0 功能:提交DockerFile
pick 91bfbb8 功能:提交DockerFile

# 变基 ae459d7..0d23a47 到 ae459d7(3 个提交)
#
# 命令:
# p, pick <提交> = 使用提交
# r, reword <提交> = 使用提交,但修改提交说明
# e, edit <提交> = 使用提交,进入 shell 以便进行提交修补
# s, squash <提交> = 使用提交,但融合到前一个提交
# f, fixup <提交> = 类似于 "squash",但丢弃提交说明日志
# x, exec <命令> = 使用 shell 运行命令(此行剩余部分)
# b, break = 在此处停止(使用 'git rebase --continue' 继续变基)
# d, drop <提交> = 删除提交
# l, label <label> = 为当前 HEAD 打上标记
# t, reset <label> = 重置 HEAD 到该标记
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# .       创建一个合并提交,并使用原始的合并提交说明(如果没有指定
# .       原始提交,使用注释部分的 oneline 作为提交说明)。使用
# .       -c <提交> 可以编辑提交说明。
#
# 可以对这些行重新排序,将从上至下执行。
#
# 如果您在这里删除一行,对应的提交将会丢失。
#
# 然而,如果您删除全部内容,变基操作将会终止。
#

修改commit之前的单词,第一个commit保留为pick,后续的commit修改为s,

pick 7dbba7b 功能:提交DockerFile与构建脚本、日志类型输出字符串
s 56f27c0 功能:提交DockerFile
s 91bfbb8 功能:提交DockerFile

# 省略

修改完后,保存并退出(交互式框是vi编辑框,保存并退出的方法与vi操作相同)

4、此时会再次弹出交互式对话框,用于设置提交的消息:
# 这是一个 3 个提交的组合。
# 这是第一个提交说明:

功能:提交DockerFile与构建脚本、日志类型输出字符串

# 这是提交说明 #2:

功能:提交DockerFile

# 这是提交说明 #3:

功能:提交DockerFile

# 请为您的变更输入提交说明。以 '#' 开始的行将被忽略,而一个空的提交
# 省略 ......

若需要修改提交消息增应将上面删除然后修改,例如修改如下:


功能:提交DockerFile与构建脚本、日志类型输出字符串

# 请为您的变更输入提交说明。以 '#' 开始的行将被忽略,而一个空的提交
# 省略 ......

修改完后,保存并退出(交互式框是vi编辑框,保存并退出的方法与vi操作相同)

5、此时完成了本地仓库中commit的合并,可以通过git log查看合并后的效果
[root@node2 test]# git log
commit e66a398f3ae8889ec39ffae51cf1ddf773098dac
Author: licc <2719540156@qq.com>
Date:   Wed Oct 18 05:28:38 2023 +0000

    功能:提交DockerFile与构建脚本、日志类型输出字符串

commit ae459d7a16e878276e6bb391c16ad4b4d0d23a47
Author: licc <2719540156@qq.com>
Date:   Fri Oct 13 09:09:06 2023 +0000

    功能:增加选项--no-web-service 关闭webService
    
6、如果之前的提交已经同步到git服务器,可以使用git push -f 强制将本地仓库同步至git服务器(可选)
### 在 IntelliJ IDEA 中将多个 Git 提交合并为一个 在处理多个提交时,可以利用 `git rebase` 和交互式变基功能来实现这一目标。通过这种方式能够有效地整理历史记录,使得分支树更加整洁[^1]。 对于希望在 IntelliJ IDEA 中完成此操作的情况: #### 开始交互式 Rebase 过程 首先,在IDEA中打开终端或者使用VCS菜单下的Git子项找到Rebase命令启动交互式的rebase流程。也可以直接按下快捷键组合Alt+9进入版本控制系统工具窗口,接着选择“Log”标签页查看提交日志,并右击想要开始变基的目标提交(通常是较早的一个),从上下文菜单里选取“Rebase interactively...”。 此时会弹出一个新的编辑器选项卡展示一系列待处理的提交条目列表,默认情况下它们都被标记为pick动作。 ```bash pick abcdefg Commit message of commit A pick 1234567 Another commit message B ... ``` #### 修改提交行为 为了把几个连续的提交压缩成单个提交,需更改除了最顶部之外其他所有相关联提交前缀单词由“pick”变为“squash”。这表示这些提交将会被折叠到上面那个保留下来的提交之中去。 ```bash pick abcdefg This is the new combined commit message. squash 1234567 The changes from this will be merged into above. ... ``` 保存文件并关闭它之后,IDEA 将自动执行相应的操作,包括可能提示解决任何可能出现的冲突。一旦解决了所有的冲突并且完成了整个过程,则最终结果就是只有一个包含了之前多份改动的新提交存在了[^2]。 需要注意的是,当涉及到多人协作开发环境中的公共分支上做此类变更时要格外小心谨慎,因为强行推送到远端可能会给团队成员带来不便甚至数据丢失的风险。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

21岁被迫秃头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值