代码审阅中一个重要功能是对两个 commit 进行 diff 并展示到页面中,这篇文章将尝试总结其实现过程。
想要展示 diff,首先需要将 Git 提供的 diff 格式解析成结构化数据(比如:JSON)。
一个基本的 Git Diff 格式如下:
diff --git a/f1 b/f1
index 6f8a38c..449b072 100644
--- a/f1
+++ b/f1
@@ -1,7 +1,7 @@
1
2
3
-a
+b
5
6
7
第一行是 Git Diff 的 header,进行比较的是 a 版本的 f1(变动前)和 b 版本的 f1(变动后)。
第二行是两个版本的 hash 值以及文件模式(100644 表示是文本文件)。
第三、四行表示进行比较的两个文件, --- 表示变动前的版本, +++ 表示变动后的版本。
第五行是一个 thunk header(可能会有多个),提供变动的”上下文“(context), -1,7表示接下来展示变动前文件第一至第七行, +1,7 表示接下来展示变动后文件第一至第七行。
接下来的几行就是具体的变动内容。它将两个文件的上下文合并显示在一起,每一行前面是一个标志位, ''(空)表示无变化(是一个上下文行)、 - 表示变动前文件删除的行、 + 表示变动后文件新增的行。可以看出此次变动,文件 f1 的第 4 行内容从 a 变为了 b。
在第一行 header 之后有可能包含如下的几种扩展 header:
old mode <mode>
new mode <mode>
deleted file mode <mode>
new file mode <mode>
copy from <path>
copy to <path>
rename from <path>
rename to <path>
similarity index <number>
dissimilarity index <number>
index <hash>..<hash> <mode>
新增、删除、复制、重命名文件的 Git Diff 格式有些不同,解析时需要特别注意。
新增:
diff --git a/file b/file
new file mode 100644
index 0000000..53bffd7
--- /dev/null
+++ b/file
删除:
diff --git a/file b/file
deleted file mode 100644
index 53bffd7..0000000
--- a/file
+++声明:所有来源为“聚合数据”的内容信息,未经本网许可,不得转载!如对内容有异议或投诉,请与我们联系。邮箱:marketing@think-land.com
代码审阅中一个重要功能是对两个 commit 进行 diff 并展示到页面中,这篇文章将尝试总结其实现过程。
想要展示 diff,首先需要将 Git 提供的 diff 格式解析成结构化数据(比如:JSON)。
一个基本的 Git Diff 格式如下:
diff --git a/f1 b/f1
index 6f8a38c..449b072 100644
--- a/f1
+++ b/f1
@@ -1,7 +1,7 @@
1
2
3
-a
+b
5
6
7
第一行是 Git Diff 的 header,进行比较的是 a 版本的 f1(变动前)和 b 版本的 f1(变动后)。
第二行是两个版本的 hash 值以及文件模式(100644 表示是文本文件)。
第三、四行表示进行比较的两个文件, --- 表示变动前的版本, +++ 表示变动后的版本。
第五行是一个 thunk header(可能会有多个),提供变动的”上下文“(context), -1,7表示接下来展示变动前文件第一至第七行, +1,7 表示接下来展示变动后文件第一至第七行。
接下来的几行就是具体的变动内容。它将两个文件的上下文合并显示在一起,每一行前面是一个标志位, ''(空)表示无变化(是一个上下文行)、 - 表示变动前文件删除的行、 + 表示变动后文件新增的行。可以看出此次变动,文件 f1 的第 4 行内容从 a 变为了 b。
在第一行 header 之后有可能包含如下的几种扩展 header:
old mode <mode>
new mode <mode>
deleted file mode <mode>
new file mode <mode>
copy from <path>
copy to <path>
rename from <path>
rename to <path>
similarity index <number>
dissimilarity index <number>
index <hash>..<hash> <mode>
新增、删除、复制、重命名文件的 Git Diff 格式有些不同,解析时需要特别注意。
新增:
diff --git a/file b/file
new file mode 100644
index 0000000..53bffd7
--- /dev/null
+++ b/file
删除:
diff --git a/file b/file
deleted file mode 100644
index 53bffd7..0000000
--- a/file
+++声明:所有来源为“聚合数据”的内容信息,未经本网许可,不得转载!如对内容有异议或投诉,请与我们联系。邮箱:marketing@think-land.com