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