如何获取Git中单个文件所有代码修改的日期?
问题
使用git diff toto.txt可查看上次提交以来toto.txt的所有代码变更,但我想获取该文件所有代码修改的具体日期。例如:初始文件内容为aa、bb、cc;第1天修改为aa、bbdd、cc;第2天修改为aazz、bbdd、cc,希望得到带日期的变更列表:aa -> aazz(第2天)、bb -> bbdd(第1天)。尝试git blame toto.txt|grep '0000000 (Not'可查看未提交内容,但显示的是执行命令的日期而非实际修改日期,请问如何实现需求?
解决方案
1. 查看已提交行的最后修改日期
对于已提交到仓库的内容,git blame是最直接的工具,它会显示文件每一行最后一次修改的提交信息,包含具体日期:
- 基础命令:
输出每行开头格式类似git blame toto.txtabc1234 (John Doe 2024-05-20 10:30:00 +0800 1) aa,其中的日期就是该行最后一次修改的提交日期。 - 自定义日期格式:
想要更简洁或符合习惯的日期格式,可添加--date参数:# 显示YYYY-MM-DD格式 git blame --date=short toto.txt # 显示本地时间完整格式 git blame --date=local toto.txt
2. 追溯某一行的完整修改历史
如果需要查看某一行的所有变更记录(比如从aa到aazz的修改过程),可以用git log结合行范围或内容定位:
- 通过行号追溯:
# 查看第1行的所有修改提交及日期 git log -L 1,1:toto.txt - 通过内容追溯(匹配包含指定内容的行):
输出会列出每一次修改该内容的提交记录,包括提交日期、作者和具体diff内容,从中可提取出对应修改的日期。# 查看包含"aa"或"aazz"的行的修改历史 git log -L :aa:toto.txt
3. 处理未提交的改动(工作区/暂存区)
Git不会记录工作区未提交内容的逐行修改日期,它只跟踪提交时间,而非本地文件的编辑时间:
- 查看文件整体最后修改时间:
但这是文件整体的最后修改时间,无法区分不同行的修改时间。# 显示YYYY-MM-DD HH:MM格式的文件最后修改时间 ls -l --time-style="+%Y-%m-%d %H:%M" toto.txt - 暂存区改动:用
git diff --cached可查看变更,但同样无法获取逐行修改日期,只能后续提交时让Git记录提交日期。
4. 生成带日期的变更列表(进阶脚本)
如果想要自动生成aa -> aazz(2024-05-21)这类格式,可以写简单脚本结合git log和diff分析:
- 执行
git log --reverse -p -- toto.txt获取文件所有提交diff,按时间正序排列。 - 解析每个diff块中的行变更和对应提交日期,整理成目标格式。
内容的提问来源于stack exchange,提问作者jean-luc
相关产品推荐
相关产品推荐

