查看差异文件
要导出Git仓库中某两次提交之间的文件差异,必须要先知道有哪些文件发生了差异。git diff
指令能很方便的协助我们完成这样的操作。
本次课题中所使用到的git diff
指令的用法是git diff COMMIT_ID_1 COMMIT_DI_2
,其中的COMMIT_ID_X
就是通过git log
指令查看到的提交ID。一般情况下,commit_id
取前六位就可以了。
以下就是我随便在一个仓库执行以上指令的结果截图:
显然,改指令是可以列出两次提交的具体结果,但是我们只需要那些文件发生改动,并不需要如此具体到行的结果。
经过查阅相关资料,发现
--name-only
参数可以使得git diff
的结果非常简练。打包
仔细观察git diff --name-only
指令的执行结果,这不正是这些文件在根目录中的相对地址嘛?结合xargs
指令可以非常快速地将差异文件给打包了。我比较习惯用tar
指令进行压缩。
本次执行的指令如下
git diff --name-only 7f1caef cc011f5 | xargs tar -zcvf /d/a.tar.gz
查看D盘目录,确实生成了a.tar.gz
文件,里面的目录结构和项目的结构保持一致,并且只包含差异文件,如下图所示。
注意点
- 执行本打包指令的时候,一定要在项目的根目录中执行,以为不论是在项目目录中的哪个位置,
git diff
指令输出的文件路径都是相对于项目根目录的,在非项目根目录下执行xargs tar
的时候会提示找不到文件; -
xargs tar
指令所打包的文件和当前所在的分支有关。如本次例子中,当前所在分支为master分支的最新提交,那么打包输出的文件版本就是master分支的最新提交版本;
快捷用法
以上的COMMIT_ID_X
其实可以用HEAD[1]来代替,比如HEAD
表示当前提交,HEAD^
表示上一次提交,HEAD^^
表示上上次提交,所以我们输出当前和上次提交的差异就可以写成这样git diff --name-only HEAD^ HEAD
。其中可以省略后面的HEAD
,因为指令会默认拿HEAD^
和当前提交作比对;
还有一种写法:HEAD~0
表示当前提交,HEAD~1
表示上一次提交,HEAD~2
表示上上次提交,以此类推。
-
关于Git中的HEAD定义,《Git版本控制管理中》是这样描述的:「HEAD始终指向当前分支的最近提交。当切换分支时,HEAD会更新为指向新分支的最新提交」。 ↩