關於git的打patch的功能

2021-09-22 09:37:12 字數 2746 閱讀 3104

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要和那個分支比對。現在它生成了乙個patc**件,我們看看那是什麼:

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 ...