如何通过Git非交互式合并指定哈希的两个提交及其间所有提交?
合并指定Git提交范围为单个提交(非交互式脚本实现)
前提验证
首先需要确保c1是c2的祖先(符合你给出的分支结构-- c1 ---- c2 ------ HEAD),脚本中可以先做校验:
if ! git merge-base --is-ancestor c1 c2; then echo "错误:c1不是c2的祖先节点,无法合并指定范围的提交" exit 1 fi
脚本实现步骤
以下命令可直接整合到Shell脚本中,全程无交互:
获取关键节点的哈希值
# 获取c1的父提交哈希 C1_PARENT=$(git rev-parse c1^) # 获取c2对应的树对象哈希(保存c2及之前提交的最终文件状态) C2_TREE=$(git rev-parse c2^{tree}) # 记录当前分支名称(后续切回) ORIGINAL_BRANCH=$(git rev-parse --abbrev-ref HEAD)创建合并后的新提交
用git commit-tree直接创建一个新提交,父节点是c1的父提交,文件状态与c2完全一致,提交信息可自定义:# 生成提交信息,包含c1到c2的提交摘要 SQUASH_MSG=$(printf "Squash commits from %s to %s\n\n" "$(git rev-parse --short c1)" "$(git rev-parse --short c2)") SQUASH_MSG+=$(git log --oneline c1..c2 | sed 's/^/ /') # 创建新提交 NEW_COMMIT=$(git commit-tree "$C2_TREE" -p "$C1_PARENT" -m "$SQUASH_MSG")将原分支变基到新提交上
把原分支中c2之后的所有提交,重新应用到新创建的合并提交之后:git checkout "$ORIGINAL_BRANCH" git rebase --onto "$NEW_COMMIT" c2清理临时资源(可选)
如果过程中创建过临时分支,可执行删除:# git branch -D temp-squash
说明
- 这个方法不会修改原有的
c1、c2提交,而是创建一个全新的合并提交,再将后续提交变基到新提交上,完全满足非交互式脚本化的需求。 - 提交信息可以根据需要调整,比如只保留关键描述,或者用更简洁的格式。
内容的提问来源于stack exchange,提问作者user7585848
相关产品推荐
相关产品推荐

