一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Git的Patch功能(轉(zhuǎn)載)

 吳家小院 2016-01-15

UNIX世界的軟件開發(fā)大多都是協(xié)作式的,因此,Patch(補(bǔ)丁)是一個(gè)相當(dāng)重要的東西,因?yàn)閹缀跛械拇笮蚒NIX項(xiàng)目的普通貢獻(xiàn)者,都是通過 Patch來提交代碼的。作為最重要的開源項(xiàng)目之一,Linux,也是這樣的。普通開發(fā)者從軟件倉庫clone下代碼,然后寫入代碼,做一個(gè)Patch, 最后用E-mail發(fā)給Linux Kernel的維護(hù)者就好了。Git最初作為Linux的版本控制工具,提供了透明、完整、穩(wěn)定的Patch功能。

我們先介紹一下Patch是什么。如果一個(gè)軟件有了新版本,我們可以完整地下載新版本的代碼進(jìn)行編譯安裝。然而,像Linux Kernel這樣的大型項(xiàng)目,代碼即使壓縮,也超過70MB,每次全新下載是有相當(dāng)大的代價(jià)的。然而,每次更新變動的代碼可能不超過1MB,因此,我們只 要能夠有兩個(gè)版本代碼的diff的數(shù)據(jù),應(yīng)該就可以以極低的代價(jià)更新程序了。因此,Larry Wall開發(fā)了一個(gè)工具:patch。它可以根據(jù)一個(gè)diff文件進(jìn)行版本更新。

不過在git中,我們沒有必要直接使用diff和patch來做補(bǔ)丁,這樣做既危險(xiǎn)又麻煩。git提供了兩種簡單的patch方案。一是用git diff生成的標(biāo)準(zhǔn)patch,二是git format-patch生成的Git專用Patch。

1.git diff生成的標(biāo)準(zhǔn)patch

我們可以首先用git diff制作一個(gè)patch。本文示例的工作目錄里最初有一個(gè)文件a,內(nèi)容是“This is the file a.”,放置在master分支中。為了修改代碼,我們一般的做法是建立一個(gè)新分支:

sweetdum@sweetdum-ASUS:~/GitEx$ git branch Fix
sweetdum@sweetdum-ASUS:~/GitEx$ git checkout Fix
Switched to branch 'Fix'

接下來我們在a文件里面追加一行,然后執(zhí)行g(shù)it 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的輸出,這是一個(gè)非常典型的Patch式diff。這樣我們可以直接把這個(gè)輸出變?yōu)橐粋€(gè)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'

我們現(xiàn)在有一個(gè)patch文件,并且簽出了master,接下來我們可以使用git apply來應(yīng)用這個(gè)patch。當(dāng)然了,實(shí)際應(yīng)用中,我們不會這樣在一個(gè)分支建patch,到另一個(gè)分支去應(yīng)用,因?yàn)橹挥衜erge一下就好了。我們現(xiàn) 在權(quán)當(dāng)沒有這個(gè)Fix分支。一般情況下,為了保護(hù)master,我們會建立一個(gè)專門處理新交來的patch的分支:

sweetdum@sweetdum-ASUS:~/GitEx$ git branch PATCH
sweetdum@sweetdum-ASUS:~/GitEx$ git checkout PATCH
Switched to branch 'PATCH'
sweetdum@sweetdum-ASUS:~/GitEx$ git apply patch
sweetdum@sweetdum-ASUS:~/GitEx$ git commit -a -m "Patch Apply"
[PATCH 9740af8] Patch Apply
1 files changed, 1 insertions(+), 0 deletions(-)

看,現(xiàn)在我們在PATCH分支中應(yīng)用了這個(gè)補(bǔ)丁,我們可以把PATCH分支和Fix比對一下,結(jié)果肯定是什么也沒有,說明PATCH分支和Fix分支完全一樣。patch應(yīng)用成功。即使有多個(gè)文件git diff 也能生成一個(gè)patch。

2.git format-patch生成的git專用補(bǔ)丁。

我們同樣用上面那個(gè)例子的工作目錄,這次,我們在Fix分支中的a添加了新行之后,用git format-patch生成一個(gè)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選項(xiàng)表示這個(gè)patch要和那個(gè)分支比對?,F(xiàn)在它生成了一個(gè)patch文件,我們看看那是什么:

sweetdum@sweetdum-ASUS:~/GitEx$ cat 0001-Fix1.patch
From 6991743354857c9a6909a253e859e886165b0d90 Mon Sep 17 00:00:00 2001
From: Sweetdumplings <linmx0130@163.com>
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的信息,還有提交者,時(shí)間等等,仔細(xì)一看你會發(fā)現(xiàn),這是個(gè)E-mail的文件,你可以直接發(fā)送它!這種patch,我們要用git am來應(yīng)用。

sweetdum@sweetdum-ASUS:~/GitEx$ git checkout master
Switched to branch 'master'
sweetdum@sweetdum-ASUS:~/GitEx$ git branch PATCH
sweetdum@sweetdum-ASUS:~/GitEx$ git checkout PATCH
sweetdum@sweetdum-ASUS:~/GitEx$ git am 0001-Fix1.patch
Applying: Fix1
sweetdum@sweetdum-ASUS:~/GitEx$ git commit -a -m "PATCH apply"

在提交了補(bǔ)丁之后,我們可以再看看目前文件a的情況:

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

果然,多了一個(gè)Fix!!!

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

3.兩種patch的比較:

  • 兼容性:很明顯,git diff生成的Patch兼容性強(qiáng)。如果你在修改的代碼的官方版本庫不是Git管理的版本庫,那么你必須使用git diff生成的patch才能讓你的代碼被項(xiàng)目的維護(hù)人接受。
  • 除錯(cuò)功能:對于git diff生成的patch,你可以用git apply --check 查看補(bǔ)丁是否能夠干凈順利地應(yīng)用到當(dāng)前分支中;如果git format-patch 生成的補(bǔ)丁不能打到當(dāng)前分支,git am會給出提示,并協(xié)助你完成打補(bǔ)丁工作,你也可以使用git am -3進(jìn)行三方合并,詳細(xì)的做法可以參考git手冊或者《Progit》。從這一點(diǎn)上看,兩者除錯(cuò)功能都很強(qiáng)。
  • 版本庫信息:由于git format-patch生成的補(bǔ)丁中含有這個(gè)補(bǔ)丁開發(fā)者的名字,因此在應(yīng)用補(bǔ)丁時(shí),這個(gè)名字會被記錄進(jìn)版本庫,顯然,這樣做是恰當(dāng)?shù)?。因此,目前使用Git的開源社區(qū)往往建議大家使用format-patch生成補(bǔ)丁。

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    少妇在线一区二区三区| 男人和女人黄 色大片| 日韩一区二区三区四区乱码视频| 91亚洲人人在字幕国产| 亚洲另类女同一二三区| 日韩不卡一区二区在线| 五月婷婷综合缴情六月| 超碰在线播放国产精品| 欧美日韩亚洲精品在线观看| 国产毛片不卡视频在线| 欧美自拍偷自拍亚洲精品| 一级片黄色一区二区三区| 少妇特黄av一区二区三区| 国产精品九九九一区二区| 五月情婷婷综合激情综合狠狠| 九九热国产这里只有精品 | 国产免费自拍黄片免费看| 一区二区三区国产日韩| 久久国产精品亚州精品毛片| 不卡视频免费一区二区三区| 国产肥女老熟女激情视频一区 | 日本深夜福利视频在线| 一区二区三区四区亚洲专区 | 午夜精品久久久99热连载| 欧美激情一区二区亚洲专区| 国产99久久精品果冻传媒| 成人精品一区二区三区在线| 好吊视频一区二区在线| 男女午夜福利院在线观看| 亚洲欧美日韩在线中文字幕| 久热青青草视频在线观看| 亚洲中文字幕在线视频频道 | 亚洲精品偷拍一区二区三区| 欧美成人一区二区三区在线| 国产熟女一区二区三区四区| 少妇肥臀一区二区三区| 亚洲综合色在线视频香蕉视频| 欧美日韩一区二区综合| 欧美做爰猛烈叫床大尺度| 91日韩欧美中文字幕| 午夜国产精品国自产拍av|