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

Git Rebase后如何生成新旧提交哈希的映射关系?

生成Git变基前后的提交哈希映射

Git没有原生命令直接输出变基前后的提交哈希对应关系,但可以通过提交内容指纹(树对象哈希)和作者时间戳来实现匹配,具体步骤如下:

1. 导出变基前后的提交元数据

变基前,先导出原分支上待变基提交的关键信息(提交哈希、树哈希、作者时间戳):

# 替换main为变基的目标分支,original-branch为变基前的原分支
git log --pretty=format:"%H %T %at" main..original-branch > original-commits.txt

参数说明:

  • %H:提交的完整哈希
  • %T:提交对应的树对象哈希(代表提交的文件快照,内容完全一致则树哈希相同)
  • %at:作者时间戳(Unix时间格式,精确到秒)

变基完成后,导出新分支的对应信息:

# rebased-branch为变基后的分支(通常和原分支同名)
git log --pretty=format:"%H %T %at" main..rebased-branch > rebased-commits.txt

2. 优先按树哈希匹配(最准确)

树哈希是提交内容的唯一标识,变基时未修改内容的提交,树哈希会完全一致。用以下命令匹配:

join -1 2 -2 2 <(sort -k2 original-commits.txt) <(sort -k2 rebased-commits.txt) | awk '{print "原提交: "$2" → 新提交: "$3}'

该命令会按树哈希排序后合并两个文件,输出内容未修改的提交的哈希映射。

3. 用作者时间戳兜底匹配

如果提交在变基时被修改(比如解决冲突),树哈希会变化,此时可以用作者时间戳匹配(允许微小时间差,比如60秒内):

awk 'NR==FNR {orig_hash[$3]=$1; orig_time[$1]=$3; next} {
    for (h in orig_hash) {
        diff = $3 - orig_time[h];
        if (diff >= -60 && diff <= 60) {
            print "原提交: "h" → 新提交: "$1" (时间戳匹配,时间差: "diff"秒)"
        }
    }
}' original-commits.txt rebased-commits.txt

特殊情况说明

  • 原提交被合并/丢弃:这类提交不会出现在变基后的分支中,不会生成映射
  • 变基时新增的提交:只有新提交哈希,无对应原提交,不会出现在原→新的映射中
  • 时间戳匹配可能存在歧义:如果同一时间有多个提交,可能匹配错误,但这是无内容指纹时的最后可行方案

内容的提问来源于stack exchange,提问作者jamesdlin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 08:50:01