patch應用

1.git diff生成的標準patch
我們可以首先用git diff製作一個patch。本文示例的工作目錄裏最初有一個文件a,內容是“This is the file a.”,放置在master分支中。爲了修改代碼,我們一般的做法是建立一個新分支:

sweetdum@sweetdum-ASUS:~/GitExgitbranchFixsweetdum@sweetdumASUS: /GitEx git checkout Fix
Switched to branch ‘Fix’

接下來我們在a文件裏面追加一行,然後執行git diff。
sweetdum@sweetdum-ASUS:~/GitExechoFix!!!>>asweetdum@sweetdumASUS: /GitEx git diff
diff –git a/a b/a
index 4add65f..0d295ac 100644
— a/a
+++ b/a
@@ -1 +1,2 @@
This is the file a.
+Fix!!!

我們看到了Git diff的輸出,這是一個非常典型的Patch式diff。這樣我們可以直接把這個輸出變爲一個Patch:
sweetdum@sweetdum-ASUS:~/GitExgitcommitamFix[Fixb88c46b]Fix1fileschanged,1insertions(+),0deletions()sweetdum@sweetdumASUS: /GitEx git diff master > patch
sweetdum@sweetdum-ASUS:~/GitEx$ git checkout master
Switched to branch ‘master’

我們現在有一個patch文件,並且簽出了master,接下來我們可以使用git apply來應用這個patch。當然了,實際應用中,我們不會這樣在一個分支建patch,到另一個分支去應用,因爲只有merge一下就好了。我們現 在權當沒有這個Fix分支。一般情況下,爲了保護master,我們會建立一個專門處理新交來的patch的分支:

sweetdum@sweetdum-ASUS:~/GitExgitbranchPATCHsweetdum@sweetdumASUS: /GitEx git checkout PATCH
Switched to branch ‘PATCH’
sweetdum@sweetdum-ASUS:~/GitExgitapplypatchsweetdum@sweetdumASUS: /GitEx git commit -a -m “Patch Apply”
[PATCH 9740af8] Patch Apply
1 files changed, 1 insertions(+), 0 deletions(-)

看,現在我們在PATCH分支中應用了這個補丁,我們可以把PATCH分支和Fix比對一下,結果肯定是什麼也沒有,說明PATCH分支和Fix分支完全一樣。patch應用成功。即使有多個文件git diff 也能生成一個patch。

2.git format-patch生成的git專用補丁。
我們同樣用上面那個例子的工作目錄,這次,我們在Fix分支中的a添加了新行之後,用git format-patch生成一個patch。
sweetdum@sweetdum-ASUS:~/GitExgitcheckoutFixSwitchedtobranchFixsweetdum@sweetdumASUS: /GitEx echo ‘Fix!!!’>>a
sweetdum@sweetdum-ASUS:~/GitExgitcommitamFix1[Fix6991743]Fix11fileschanged,1insertions(+),0deletions()sweetdum@sweetdumASUS: /GitEx git format-patch -M master
0001-Fix1.patch

git format-patch的-M選項表示這個patch要和那個分支比對。現在它生成了一個patch文件,我們看看那是什麼:

sweetdum@sweetdum-ASUS:~/GitEx$ cat 0001-Fix1.patch
From 6991743354857c9a6909a253e859e886165b0d90 Mon Sep 17 00:00:00 2001
From: Sweetdumplings [email protected]
Date: Mon, 29 Aug 2011 14:06:12 +0800
Subject: [PATCH] Fix1


a | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)

diff –git a/a b/a
index 4add65f..0d295ac 100644
— a/a
+++ b/a
@@ -1 +1,2 @@
This is the file a.

+Fix!!!

1.7.4.1

看,這次多了好多東西,不僅有diff的信息,還有提交者,時間等等,仔細一看你會發現,這是個E-mail的文件,你可以直接發送它!這種patch,我們要用git am來應用。

sweetdum@sweetdum-ASUS:~/GitExgitcheckoutmasterSwitchedtobranchmastersweetdum@sweetdumASUS: /GitEx git branch PATCH
sweetdum@sweetdum-ASUS:~/GitExgitcheckoutPATCHsweetdum@sweetdumASUS: /GitEx git am 0001-Fix1.patch
Applying: Fix1
sweetdum@sweetdum-ASUS:~/GitEx$ git commit -a -m “PATCH apply”

在提交了補丁之後,我們可以再看看目前文件a的情況:

sweetdum@sweetdum-ASUS:~/GitEx$ cat a
This is the file a.
Fix!!!

果然,多了一個Fix!!!

不過要注意的是,如果master與Fix分支中間有多次提交,它會針對每次提交生成一個patch。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章