‌$ git format-patch [-s]  <引用或其范围>

// 将特定的一个提交或一个范围内的提交("HEAD~3...HEAD"等价于"HEAD HEAD^ HEAD^^")转换成补丁文件,加上s 参数表示在补丁说明中加入作者姓名。

‌$ git send-email *.patch

// 将补丁文件用邮件的方式发送给PM(项目经理) ,邮件接受者打开mail ,可以将收到的补丁邮件挑选出来,保存在一个mbox格式的文件中。例如执行mail 命令后,在mail 命令行中执行

& s 1-3 user1-mail-archive

表示将收件箱中前三封邮件归档在user1-mail-archive文件中。当然这个文件可以通过执行mail -f user1-mail-archive打开查看。

‌$ git am user1-mail-archive

// 此时当把heads 退回到HEAD~3 时,再执行上述命令就可以成功打上3补丁,使heads 再次指向原HEAD。

‌$ cat  *.patch | git am

// 打补丁文件*.patch。该补丁文件可以是u 盘靠过来的,或是其他人任何非mail 形式获取的补丁文件。

还有另外两个补丁管理工具StGit和 Quilt

以StGit 为例来说明:

安装

// 可以通过apt install stgit stgit-contrib安装

安装好之后,进入工作区。首先初始化stgit

‌$ stg init //初始化

‌$ stg series //查看补丁列表

‌$ stg uncommit -n<num>

// 将最近num个提交预选为补丁文件源,压入补丁栈中。注意此时分支master没变化。

‌$ stg pop [-a]

‌// 弹出栈顶补丁文件,同时删除对应的提交。如果加上a参数,表示弹出所有栈中的补丁文件,并将master 重置到最后一个补丁文件之后的提交。

‌$ stg push

‌$ stg goto <x.patch>

// 前者打栈顶补丁到分支中,后者将指定补丁打到分支中。

‌$ stg refresh

//当打完一个补丁后,发现其中有一个小的bug,我们可以在工作区修改完后,不加入暂存区,直接执行上述补丁刷新命令,此时你打过的补丁会自动更新,而不必再产生一个提交。

‌$ stg push + $ stg refresh

// 因为之前的补丁有更新,导致执行stg push 后再往后打补丁有可能会遇到冲突,此时可以直接编辑冲突文件,之后添加到暂存区,不提交直接执行stg refresh 。更新补丁文件的同时更新提交。

‌$ stg export -d patchs

//将补丁文件导出到patchs 目录,且目录里除了补丁文件之外,还会包含一个说明补丁顺序的文件series