社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Git

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

前端早读课 • 3 年前 • 515 次点击  

前言

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:

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

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

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

参考资料

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

关于本文
作者:@黑暗执行者
原文:https://blog.darkthread.net/blog/git-diff-from-zero/

为你推荐


【第2148期】Figma + Gitlab CI 一键交付 SVG 多色图标库


【第2339期】Javascript是如何工作的:如何在 V8 引擎中书写最优代码的 5 条小技巧


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


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/118089
 
515 次点击