如何非交互式压缩Git从根提交到指定历史提交的提交范围
一步非交互式完成Git提交压缩的方法
你要的效果可以通过创建压缩提交+直接变基的组合命令一步完成,不需要分两次rebase,也不用交互式编辑:
核心命令组合
# 1. 创建包含A-D所有变更的新根提交,替换引号内的内容为你需要的提交信息 new_root=$(git commit-tree D^{tree} -m "压缩A至D的所有变更") # 2. 将E-F-G变基到新提交之后(假设当前分支是你要修改的分支,比如main) current_branch=$(git rev-parse --abbrev-ref HEAD) git rebase --onto $new_root D $current_branch
如果想合并成一行执行:
current_branch=$(git rev-parse --abbrev-ref HEAD) && new_root=$(git commit-tree D^{tree} -m "压缩A至D的所有变更") && git rebase --onto $new_root D $current_branch
原理说明
git commit-tree D^{tree}会直接复用D提交的文件快照(也就是A到D所有变更的最终状态),快速创建一个新的根提交A',无需逐个合并提交git rebase --onto $new_root D $current_branch的作用是:把D之后的所有提交(E-F-G),以新的压缩提交A'为基准重新应用,完美保留E原本的差异,不会和A-D的变更混淆
这个方法完全是非交互式的,适合处理数百个提交的场景,避免了交互式rebase需要手动编辑大量提交项的麻烦。
内容的提问来源于stack exchange,提问作者Shuman
相关产品推荐
相关产品推荐

