You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 02:45:23