Git应用实践(二)

时间:2023-03-09 03:25:54
Git应用实践(二)

[时间:2017-08] [状态:Open]

[关键词:Git,git diff, git apply, git format-patch, git am, git log]

0-背景

上次总结Git用法已经很久了。经过一段时间的Git命令行和图形界面的使用,我发现有些命令和功能还是需要了解下,要不在真正需要的的时候会很尴尬。比如:

  • 生成git专用的标准patch
  • 生成并合并patch
  • git log的常用参数:显示修改的文件列表,显示diff等等

撰写本文的目的很简单,就是为了后续使用可以参考下。

git diffgit apply

经常使用的git diff命令如下:

git diff > 123.diff // 将当前目录下的所有修改导出到diff文件中

git diff --cached > 456.diff // 将当前目录下所有暂存的修改导出到diff文件中

git diff libavformat/hls.c >f789.diff // 将特定文件中的修改导出到diff

git diff // 显示两个提交之间的diff

git diff是类似于linux下的diff工具,可用于非git环境下。对于其生成的diff或patch文件,可以通过git apply合并到git仓库下,即应用该patch,但并不创建提交信息,也就是说使用git applay之后,需要额外的手动完成commit的操作。比如下面命令将123.diff合并到当前目录下:

git apply 123.diff

注意,git apply是一个事务性操作的命令,只有成功和失败两种情况。在实际打补丁之前,建议使用git apply --check检查下当前分支下的状态。

git format-patchgit am

git format-patch生成的是git专用的patch,通常用于以电子邮件的形式进行提交。该命令的用法如下:

// 两个节点之间的所有提交
git format-patch <commit-A> <commit-B> // 从节点A开始的n个提交
git format-patch -n <commit-A> // 提取修改中R1和R2的所有提交,并通过git am合并到当前分支上
git format-patch -k --stdout R1..R2 | git am -3 -k // 提取所有位于当前分支,并且不在origin分支的所有提交
git format-patch origin
// 最终输出为,每个提交一个单独的文件,保存在当前目录下 // 提取origin分支上从创建开始的所有的提交
git format-patch --root origin // 提取最新的三个提交
git format-patch -3

使用git format-patch生成的patch建议使用git am合并。git am可以一次合并一个文件,或者一个目录下的所有patch。简单用法如下:

// 单个patch文件合并
git am 0001-xxx.patch // 合并一个目录下的所有patch
git am ~/all-patch/*.patch

还可以使用git am --continue | --skip | --abort控制patch合并过程中的异常逻辑。

git log用法总结

在windows下使用tortoiseGit有很丰富的关于log的图形界面操作,比如查看特定文件的提交记录、每次提交修改的文件信息、版本修改图等等。那么在命令行中如何获取呢?

// 显示每次修改的文件列表及状态
git log --name-status // 显示每次修改的文件列表
git log --name-only // 显示每次修改的文件列表, 及文件修改的统计
git log --stat // 显示每次修改的文件列表
git whatchanged // 显示每次修改的文件列表, 及文件修改的统计
git whatchanged --stat //显示最后一次的文件改变的具体内容
git show // 以ASCII字符串形式表示的分支及其分化衍合的情况。
git log --graph

git log还支持以下命令:

-n 仅显示最近的n条提交

--since, --after 仅显示指定时间之后的提交。

--until, --before 仅显示指定时间之前的提交。

--author 仅显示指定作者相关的提交。

--committer 仅显示指定提交者相关的提交。

小结

本文简单的整理了git diff / git apply、git format-patch / git am的用法,对此有一定了解,有助于更好的git的补丁机制,提高效率。

同时本文整理了git log的用法,解决很多对于图形界面用法的疑惑,值得后续参考。

参考资料