unix世界的軟體開發大多都是協作式的,因此,patch(補丁)是乙個相當重要的東西,因為幾乎所有的大型unix專案的普通貢獻者,都是通過 patch來提交**的。作為最重要的開源專案之一,linux,也是這樣的。普通開發者從軟體倉庫clone下**,然後寫入**,做乙個patch, 最後用e-mail發給linux kernel的維護者就好了。git最初作為linux的版本控制工具,提供了透明、完整、穩定的patch功能。
不過在git中,我們沒有必要直接使用diff和patch來做補丁,這樣做既危險又麻煩。git提供了兩種簡單的patch方案。一是用git diff生成的標準patch,二是git format-patch生成的git專用patch。
我們可以首先用git diff製作乙個patch。本文示例的工作目錄裡最初有乙個檔案a,內容是「this is the file a.」,放置在master分支中。
為了修改**,我們一般的做法是建立乙個新分支:
(以下操作應該不是在window上操作的,應該是linux,我也不知道....)
sweetdum@sweetdum-asus:~/gitex$ git branch fix
sweetdum@sweetdum-asus:~/gitex$ git checkout fix
switched to branch 'fix'
接下來我們在a檔案裡面追加一行,然後執行git diff。
sweetdum@sweetdum-asus:~/gitex$ echo 'fix!!!'>>a
sweetdum@sweetdum-asus:~/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:~/gitex$ git commit -a -m "fix"
[fix b88c46b] fix
1 files changed, 1 insertions(+), 0 deletions(-)
sweetdum@sweetdum-asus:~/gitex$ git diff master > patch
sweetdum@sweetdum-asus:~/gitex$ git checkout master
switched to branch 'master'
看,現在我們在patch分支中應用了這個補丁,我們可以把patch分支和fix比對一下,結果肯定是什麼也沒有,說明patch分支和fix分支完全一樣。patch應用成功。即使有多個檔案git diff 也能生成乙個patch。
我們同樣用上面那個例子的工作目錄,這次,我們在fix分支中的a新增了新行之後,用git format-patch生成乙個patch。
sweetdum@sweetdum-asus:~/gitex$ git checkout fix
switched to branch 'fix'
sweetdum@sweetdum-asus:~/gitex$ echo 'fix!!!'>>a
sweetdum@sweetdum-asus:~/gitex$ git commit -a -m "fix1"
[fix 6991743] fix1
1 files changed, 1 insertions(+), 0 deletions(-)
sweetdum@sweetdum-asus:~/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
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來應用。
在提交了補丁之後,我們可以再看看目前檔案a的情況:
sweetdum@sweetdum-asus:~/gitex$ cat a
this is the file a.
fix!!!
果然,多了乙個fix!!!
不過要注意的是,如果master與fix分支中間有多次提交,它會針對每次提交生成乙個patch。
關於git的打patch的功能
unix世界的軟體開發大多都是協作式的,因此,patch 補丁 是乙個相當重要的東西,因為幾乎所有的大型unix專案的普通貢獻者,都是通過 patch來提交 的。作為最重要的開源專案之一,linux,也是這樣的。普通開發者從軟體倉庫clone下 然後寫入 做乙個patch,最後用e mail發給li...
關於git的patch做法
關於git 對於乙個task 如果提交 需要修改 1 我常用的操作 先在gerrit上abandoned掉這個提交,然後在git的log上reset到最新的版本,然後再提交。缺點 在gerrit就只有最新提交的乙個,之前的提交的記錄都沒有,刪除了。非常不利於對比,reviewer看不到之前為什麼不通...
android 打Patch的方法
跟著本文的步驟操作一下,肯定能掌握diff patch用法,基本上使用diff時就是 diff naur from to from,to為變數 這樣的固定打法,然後在使用patch的時候,先看看補丁檔案的大致內容,結合當前目錄以確定需要跳過的目錄數,然後套用 patch pn patch.file ...