概括
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