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

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"

http://www.xdnf.cn/news/835.html

相关文章:

  • Floyd算法求解最短路径问题——从零开始的图论讲解(3)
  • ubuntu 22.04 安装和配置 mysql 8.0,设置开机启动
  • 11-DevOps-Jenkins Pipeline流水线作业
  • [SpringMVC]请求响应参数传递
  • 机器学习 Day13 Boosting集成学习方法: Adaboosting和GBDT
  • AOSP Android14 Launcher3——远程窗口动画关键类SurfaceControl详解
  • VR制作攻略:如何制作VR
  • 在kali中安装AntSword(蚁剑)
  • 【HDFS入门】深入解析DistCp:Hadoop分布式拷贝工具的原理与实践
  • Android Studio打开xml布局文件内存会快速增加如何设置
  • Spark-SQL与Hive
  • 【数字图像处理】彩色图像处理(1)
  • spark和Hadoop的区别与联系
  • Lucky配置反向代理+Https安全访问AxureCloud服务(解决证书续签问题)
  • LLamaFactory微调效果与vllm部署效果不一致如何解决
  • Docker概念详解
  • Docker 基本概念与安装指南
  • 在 Android 中实现通话录音
  • Discuz!与DeepSeek结合:打造智能论坛,提升用户体验与运营效率
  • 华为认证是什么?
  • 【C++软件实战问题排查经验分享】UI界面卡顿 | CPU占用高 | GDI对象泄漏 | 线程堵塞 系列问题排查总结
  • [预备知识]2. PyTorch基本操作
  • [Qt]双击事件导致的问题
  • Kafka 如何理解Kafka的高可用
  • AI对话高效输入指令攻略(三):使用大忌——“AI味”
  • IDEA打不开、打开报错
  • idea远程debug调试
  • eBay自动化定价陷阱调查:价格战背后的利润黑洞与破局之道
  • redis队列 和 秒杀应用
  • 音视频学习(三十五):aud