当前位置: 首页 > 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 下载与安装全指南
  • 公元1057年:千年龙虎榜到底有多厉害?
  • 习近平《在庆祝中华全国总工会成立100周年暨全国劳动模范和先进工作者表彰大会上的讲话》单行本出版
  • 潘功胜:将下调个人住房公积金贷款利率0.25个百分点
  • 短剧剧组在贵州拍戏突遇极端天气,演员背部、手臂被冰雹砸伤
  • 甘肃省政府原党组成员、副省长杨子兴被提起公诉
  • 视频丨054B型护卫舰钦州舰南海实战化训练