[时间: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 diff
和git 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-patch
和git 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的用法,解决很多对于图形界面用法的疑惑,值得后续参考。
参考资料
- git manual
- ProGit
- git 显示最近修改的文件列表
- 补丁git format-patch && git-am用法