git创建和使用补丁patch

缘起

    这两天在出差,而出差呢还是需要改bug是吧(🙄),所以在折腾一个可以远程提交代码的方法。

    传统的方式是在公司开vpn,远程vpn进去操作。但是目前有2个问题,一是需要申请vpn权限,走流程可能需要点时间;一是公司的vpn客户端只有windos版本的,对macos并没有支持。。。


    因此只能基于需要远程提交代码这个需求摸索下了,于是有了这篇文章。


操作

    网上搜索以及印象中各种开源项目基于git patch的工作方式启发后,找到了如下的方法,来实现patch的人肉远程操作-----即是远程写代码提交后生成patch文件,然后让同事在base进patch的合并操作。

git打patch方法

git format-patch (推荐)

适用于git的patch,包含diff信息,包含提交人,提交时间等 如果git format-patch 生成的补丁不能打到当前分支,git am会给出提示,并协助你完成打补丁工作

对比分支生成patch

例:从master checkout 一个新分支修改然后与master对比生成patch。

$ git format-patch -M master //-M选项表示这个patch要和那个分支比对
$ git am 001-xxx.patch(不必重新commit)

将commit打包成patch

# 修改代码
$ vi drivers/bluetooth/btusb.c
# 把代码添加到git管理仓库
$ git add .
# 提交修改
$ git commit -m "some message"
# 查看日志,获取到hash
$ git log 
# 生成patch
$ git format-patch -s 1bbe3c8c19

或者也可以

$ git format-patch HEAD^ 
# 最近的1次commit的patch
$ git format-patch HEAD^^ 
# 最近的2次commit的patch
$ git format-patch HEAD^^^ 
# 最近的3次commit的patch
$ git format-patch HEAD^^^^ 
# 最近的4次commit的patch

测试,应用patch

# 检查patch文件
$ git apply --stat xxx.patch
#查看是否能应用成功
$ git apply --check xxx.patch
# 应用patch
$ git am --ignore-space-change xxx.patch
注意这里的--ignore-space-change选项,如果是跨平台操作,必须加上,否则即使没有冲突的patch也会提交失败,因为diff的原理是比较修改
点前后的内容,如果行结尾符不一样也会导致失败。

所以可用这个解决没用冲突的patch am失败的问题(am fail no conflict patch)

git diff

生成标准的patch,只包含diff信息

git diff 生成的Patch兼容性强,可以用git apply --check 查看补丁是否能够干净顺利地应用到当前分支中。

例:从master checkout一个新分支修改然后与master对比生成patch。

$ git diff master > patch
$ git apply xxx.patch(需要重新commit)



参考文档

    http://yzone.net/blog/87


发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。