vlambda博客
学习文章列表

【第2359期】Git 小技巧 - 产生从零开始的 git diff 报告

前言

4b825dc642cb6eb9a060e54bf8d69288fbee4904,一串罕见的数字。今日前端早读课文章由@黑暗执行者授权分享。

@黑暗执行者,为微软MVP,撰写技术博客迄今逾十七年。

正文从这开始~~

这是我自己常遇到的问题 - 写了案雏型,用git init 就地建立Git Repository,在第一次Commit 动态雏型版本,后续陆续修改加入新的Commit。

专案第一次上线用git的差异产出比较列表,却发现我无法列举所有专案档案。原因是产生git的差异时需提供承诺-1提交-2两个参数,进而「产生提交-2与提交-1由于第一个承诺已经包含了专案雏型的原始档次,被一开始就已经存在的东西,无法当成「不同的」输出。

用实际例子来说明比较清楚。如果我有专案,先写好一个.txt及两个.txt,然后git init建立Repository,将两个档案加入Repository成为首发提交。再添加3.txt ,建立第二个承诺:

echo 1 > one.txt
echo 2 > two.txt
git init
git add . && git commit -m "init commit"
echo 3 > three.txt
git add . && git commit -m "add three.txt"

这个master提交上只有两个Commit我可用(下图[1]),第一个commit = 64fd5f9,第二个Commit = ac8929d(使用HEAD代表),git diff 64fd5f9 HEAD最多只能得到Commit ac8929d加入的三.txt(下图[2]):

要怎么产生包含one.txt、two.txt、three.txt三个档案的git diff报告呢?

这里神奇地介绍了一个Commit Id - 4b825dc642cb6eb9a060e54bf8d69288fbee4904,代表什么档案都没有的虚无,状态git diff 4b825dc642cb6eb9a060e54bf8d69288fbee4904 HEAD只要用它就知道Commit Id - ,便能盘古开天以来的所有档案,包含一个、两个。txt、三.txt:

【第2359期】Git 小技巧 - 产生从零开始的 git diff 报告

Commit Id 4b825dc642cb6eb9a060e54bf8d69288fbee4904 相当于全空的目录结构(Tree),因此自拟将得出比较对象的所有项目。

若记不住也正常,使用指令git hash-object -t tree /dev/null可现场产生:

【第2359期】Git 小技巧 - 产生从零开始的 git diff 报告

这样就输出了第一个Commit的git diff内容啰~

参考资料

Git 与空提交的差异 Git 中的空树

为你推荐






欢迎自荐投稿,前端早读课等你来。