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

如何获取Git两个标签间含中间标签的变更文件列表?

解决Git获取两个标签间含中间标签的变更文件列表问题

我来帮你解决这个问题,你遇到的核心问题是对Git diff和rev-list的用法理解有点偏差,咱们一步步来理清楚:

为什么之前的方法不对?

  1. git diff tags/v1.0.0 tags/v1.5.0 --name-only的问题:这个命令是直接对比v1.0.0和v1.5.0两个快照的差异,相当于把这两个版本当作两个独立的文件集合来对比,不会展示中间任何提交或标签的变更过程,只是最终的差异结果。
  2. git rev-list+~count的问题:git rev-list tags/v1.5.0 ^tags/v1.0.0 --count得到的是v1.0.0之后到v1.5.0的提交总数,但tags/v1.5.0~count是从v1.5.0往回数count个父提交。如果你的分支存在合并(比如多人协作的分支),这个回溯路径不一定能精准指向v1.0.0,自然会得到错误的差异数据。

正确的解决方法

方法1:获取区间内所有变更过的文件(去重汇总)

如果你想要的是从v1.0.0到v1.5.0(包括所有中间标签和提交)中所有变更过的文件列表(去重),可以用git log来遍历所有提交并提取文件名:

git log tags/v1.0.0..tags/v1.5.0 --name-only --format=format: | sort -u
  • tags/v1.0.0..tags/v1.5.0:指定要遍历的提交区间(v1.0.0之后到v1.5.0的所有提交)
  • --name-only:只显示每个提交中变更的文件
  • --format=format::清空提交信息的输出格式,只保留文件名
  • sort -u:对文件名排序并去重,避免同一个文件多次变更重复显示

方法2:分块展示每个中间标签的变更文件

如果你想逐个查看每个中间标签与前一个标签之间的变更文件,可以先按版本顺序列出区间内的所有标签,再循环对比相邻标签:

第一步:获取排序后的标签列表(从旧到新)

git tag --list "v*" --sort=v:refname | awk '/v1\.0\.0/{flag=1} flag; /v1\.5\.0/{exit}'

这个命令会筛选出从v1.0.0到v1.5.0的所有标签,并按版本号升序排列。

第二步:用脚本循环对比相邻标签

创建一个简单的bash脚本(比如tag-diff.sh):

#!/bin/bash
# 获取v1.0.0到v1.5.0之间的所有标签(按顺序)
tags=($(git tag --list "v*" --sort=v:refname | awk '/v1\.0\.0/{flag=1} flag; /v1\.5\.0/{exit}'))

# 循环对比每一对相邻标签
for ((i=0; i<${#tags[@]}-1; i++)); do
    echo "=== 变更文件:${tags[i]} → ${tags[i+1]} ==="
    git diff ${tags[i]} ${tags[i+1]} --name-only
    echo ""
done

给脚本添加执行权限并运行:

chmod +x tag-diff.sh
./tag-diff.sh

这样就能清晰看到每个中间标签到下一个标签的具体变更文件,完全覆盖你需要的中间标签差异。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:01:02