如何将指定日期前的所有Git提交合并为单个Commit?
以下是两种实用的操作方法,以你给出的示例(指定日期2023-04-01,保留2023-05-01的提交abcd,合并更早的所有提交)为例:
方法一:交互式Rebase(推荐,可控性强)
这是Git合并提交的标准方式,能灵活调整提交内容和信息。
先备份分支
操作前务必备份当前分支,防止失误丢失历史:git branch backup-main定位要保留的提交
找到指定日期之后的第一个提交(示例中的abcd),用命令快速获取其ID:git log --after="2023-04-01" --format="%H" -n 1启动交互式Rebase
以要保留的提交的父提交为基准,启动根节点开始的交互式Rebase:git rebase -i --root <保留的提交ID>^示例中就是:
git rebase -i --root abcd^编辑提交列表
弹出的编辑器里,提交会按从旧到新排列(示例中是mnop→ijkl→efgh→abcd)。把需要合并的提交前的pick改成s(保留原提交信息供编辑)或f(直接丢弃原信息,用第一个合并提交的信息):pick mnop My Commit 1 s ijkl My Commit 2 s efgh My Commit 3 pick abcd My Commit 4保存并退出编辑器。
修改合并后的提交信息与日期
Git会再次弹出编辑器,让你编辑合并后的提交信息(改成My Squashed Commit)。保存退出后,如果要将合并提交的日期设为指定的2023-04-01,执行:git commit --amend --date="2023-04-01" -m "My Squashed Commit"完成合并
若没有冲突,Rebase会自动完成;若有冲突,解决冲突后执行git rebase --continue即可。
方法二:Reset + Cherry-pick(操作更简洁)
适合不需要精细调整提交信息的场景。
备份分支
git branch backup-main定位要保留的提交ID
同样用之前的命令获取abcd的ID。重置到保留提交的父节点
把所有待合并的提交修改合并到暂存区:git reset --soft abcd^创建合并提交并指定日期
git commit --date="2023-04-01" -m "My Squashed Commit"还原保留的提交
把之前保留的abcd提交cherry-pick回来:git cherry-pick abcd有冲突的话,解决后执行
git cherry-pick --continue。
注意事项
- 如果分支已推送到远程仓库,合并后需要强制推送(
git push -f),但这会覆盖远程历史,务必和团队成员沟通确认后再操作。 - 操作前确保工作区无未提交的修改,避免冲突。
内容的提问来源于stack exchange,提问作者DilLip_Chowdary

