当前位置: 首页 > news >正文

git比较不同分支的不同提交文件差异

背景:只想比较某2个分支的某2次提交的差异,不需要带上父提交。

以commitA为基准,用commitB去比较差异

直接上代码:

#!/bin/bashcommitA=d347dad9f25fb17db89eadcec7ea0f1bacbf7d29
commitB=a6cc0c1a863b5c56d5f48bff396e4cd6966e8aaa# 临时文件
a_files=$(mktemp)
b_files=$(mktemp)
common_files=$(mktemp)
deleted_files=$(mktemp)
added_files=$(mktemp)
all_files=$(mktemp)# 获取提交文件
git show --name-only --pretty="" "$commitA" > "$a_files"
git show --name-only --pretty="" "$commitB" > "$b_files"# 判断关系
comm -12 <(sort "$a_files") <(sort "$b_files") > "$common_files"
comm -23 <(sort "$a_files") <(sort "$b_files") > "$deleted_files"
comm -13 <(sort "$a_files") <(sort "$b_files") > "$added_files"# 状态归一化
while read -r file; doif [[ -n "$file" ]]; then# 统计行数变化stats=$(git diff --numstat "$commitA" "$commitB" -- "$file")added=$(echo "$stats" | awk '{print $1}')removed=$(echo "$stats" | awk '{print $2}')echo "MODIFIED $file +$added -$removed" >> "$all_files"fi
done < "$common_files"while read -r file; doif [[ -n "$file" ]]; thenecho "DELETED  $file" >> "$all_files"fi
done < "$deleted_files"while read -r file; doif [[ -n "$file" ]]; thenecho "ADDED    $file" >> "$all_files"fi
done < "$added_files"echo "📁 文件差异目录树结构(以 $commitA 为基础,对比 $commitB)"
echodeclare -A printed_dirsprint_tree() {local status="$1"local file="$2"local meta="$3"IFS='/' read -ra parts <<< "$file"local indent=""local current_path=""for ((i = 0; i < ${#parts[@]} - 1; i++)); docurrent_path+="${parts[i]}/"indent+="│   "if [[ -z "${printed_dirs[$current_path]}" ]]; thenecho "${indent%│   }├── ${parts[i]}"printed_dirs[$current_path]=1fidonelocal fname="${parts[-1]}"case "$status" inMODIFIED)echo "${indent}├── $fname (MODIFIED $meta)"
#      git diff "$commitA" "$commitB" -- "$file";;DELETED)echo "${indent}├── $fname (DELETED)";;ADDED)echo "${indent}├── $fname (ADDED)"
#      git diff "$commitA" "$commitB" -- "$file";;esac
}# 输出树
while read -r line; dostatus=$(echo "$line" | awk '{print $1}')file=$(echo "$line" | awk '{print $2}')meta=$(echo "$line" | cut -d' ' -f3-)print_tree "$status" "$file" "$meta"
done < "$all_files"# 清理
rm "$a_files" "$b_files" "$common_files" "$deleted_files" "$added_files" "$all_files"

相关文章:

  • Linux-网络基础
  • mindspeed-rl使用注意事项
  • 【ESP32】【微信小程序】MQTT物联网智能家居案例
  • Nginx下搭建rtmp流媒体服务 并使用HLS或者OBS测试
  • 相机标定(输出相机内参和畸变参数)
  • 前端实现数据导出成excel
  • RIP动态路由(三层交换机+单臂路由)
  • 【Markdown】【HTML】在Markdown中实现康奈尔笔记模式(右侧留白)
  • 百度暑期实习岗位超3000个,AI相关岗位占比87%,近屿智能携AIGC课程加速人才输出
  • ASP.NET Core 分层项目中EFCore的使用
  • 完美解决Microsoft Edge浏览器无法同步/一直在同步中/更新失败等问题
  • 神经网络直接逆控制:神经网络与控制的结合入门级结合
  • 【C#】.net core 6.0调用MVC API接口时,提示Unsupported Media Type,状态码415
  • 穿透数据迷雾:PR 曲线与 ROC 曲线的深度剖析+面试常见问题及解析
  • spring security +kotlin 实现oauth2.0 认证
  • 加油站小程序实战教程12显示会员信息
  • 【Django】设置让局域网内的人访问
  • 忽略 CS8616 警告在 Visual Studio 2022 中【C# 8.0 】
  • Halcon应用:相机标定之应用
  • AI助理iOS开发:Copilot for Xcode 下载与安装全指南
  • 世界史圆桌|16-18世纪的跨太平洋贸易
  • 艺术开卷|近现代中国古代书画东渡日本的历史图景
  • 上海崇明“人鸟争食”何解?检察机关推动各方寻找最优解
  • 新华社经济随笔:把握不确定性中的确定性
  • 天文学家、民盟江苏省委会原常务副主委任江平逝世
  • 当瓷器传入欧洲,看女性视角下的中国风