git patch 功能

概括

  git 有两种生成 patch 的方式,以下分别举实例说明用法。

  • 以下两个实例都需要首先创建一个 master 分支
    $ touch a
    $ echo "This is a file" > a
    $ git init
    $ git add a
    $ git commit -m "init"
    $ git branch
    * master

git diff生成的标准patch

  • 生成标准patch
    $ git branch Fix             #建立一个分支
    $ git checkout Fix           #切换到Fix分支中
    Switched to branch 'Fix'       
    $ git branch
    * Fix
      master $ echo "This is a Fix" >> a  #修改分支内容 $ git diff diff --git a/a b/a index 0637880..ea52879 100644 --- a/a +++ b/a @@ -1 +1,2 @@ This is a file +This is a Fix $ git commit -a -m "Fix" [Fix d6e40c5] Fix 1 file changed, 1 insertion(+) $ git diff master > patch #生成patch
  • 给master打patch
    $ git checkout master        #切换到master分支
    Switched to branch 'master'
    $ git apply patch              #打patch
    $ cat a                        #查看文件 a 内容发现改变了
    This is a file
    This is a Fix
    $ git commit -a -m "apply Fix patch"    #提交

git format-patch生成的git专用补丁

  •  生成git专用patch
    $ git branch Fix             #建立一个分支
    $ git checkout Fix           #切换到Fix分支中
    Switched to branch 'Fix'       
    $ git branch
    * Fix
      master
    $ echo "This is a Fix" >> a  #修改分支内容
    $ git commit -a -m "Fix"
    [Fix 00fca27] Fix
     1 file changed, 1 insertion(+)
    $ git format-patch -M master #生成patch
    0001-Fix.patch

    $ cat 0001-Fix.patch
    From 00fca2756999112ebfbd357bfa114ea07bae2de6 Mon Sep 17 00:00:00 2001
    From: rivsidn <rivsidn@163.com>
    Date: Wed, 29 May 2019 20:43:17 +0800
    Subject: [PATCH] Fix

    ---
     a | 1 +
     1 file changed, 1 insertion(+)

    diff --git a/a b/a
    index 0637880..86e7879 100644
    --- a/a
    +++ b/a
    @@ -1 +1,2 @@
     This is a file
    +This is a Fix  
    --
    2.7.4

  • 打patch
    $ git checkout master              #切换到master分支
    Switched to branch 'master'
    $ git am 0001-Fix.patch           #打patch
    Applying: Fix
    rivsidn@rivsidn:~/test$ cat a
    This is a file
    This is a Fix

总结

  • 兼容性:很明显,git diff生成的Patch兼容性强。如果你在修改的代码的官方版本库不是Git管理的版本库,那么你必须使用git diff生成的patch才能让你的代码被项目的维护人接受。
  • 除错功能:对于git diff生成的patch,你可以用git apply --check 查看补丁是否能够干净顺利地应用到当前分支中;如果git format-patch 生成的补丁不能打到当前分支,git am会给出提示,并协助你完成打补丁工作,你也可以使用git am -3进行三方合并,详细的做法可以参考git手册或者《Progit》。从这一点上看,两者除错功能都很强。
  • 版本库信息:由于git format-patch生成的补丁中含有这个补丁开发者的名字,因此在应用补丁时,这个名字会被记录进版本库,显然,这样做是恰当的。因此,目前使用Git的开源社区往往建议大家使用format-patch生成补丁。

注意事项

  • 一般情况下,为了保护master,我们会建立一个专门处理新交来的patch的分支
  • 实际应用中,我们不会在一个分支建patch,到另一个分支去应用,因为只有merge一下就好了,此处仅仅是做演示用。

参考资料

  • https://www.cnblogs.com/y041039/articles/2411600.html
上一篇:四叶草clover配置工具Clover Configurator 5.4.4.0 Mac汉化版


下一篇:【独家】K8S漏洞报告 | CVE-2019-1002101解读