Git 創建Patch

假設目前我們擁有一個master分支,現在已經在該分支上創建了新的commits,出於某種原因,我們需要把我們新的commits提取出來,併發送給某個需要它的人。下面是實現方法。

先熟悉下 git format-patch的參數 -num表示需要打包的commit的數量, -1表示只選擇一條commit打包, -2表示2條。

多條連續commit的打包有兩種表達方式:

第一種: git format-patch -5 【表示從最新的commit向前推5條都要打包】

第二種: git format-patch HEAD~5 【表示從最新的commit向前推5條都要打包】

【注意,打包的時候不包括HEAD~5這條記錄】【可以使用commit的sha1值來替換HEAD~num表達式】

圖釋:

第一種:

last commit -->打包0005

6 commit -->打包0004

5 commit -->打包0003

4th commit -->打包0002

3rd commit -->打包0001

2nd commit

1st commit

第二種:

第一種:

last commit -->打包0005 (HEAD)

6 commit -->打包0004(HEAD~1)

5 commit -->打包0003(HEAD~2)

4th commit -->打包0002(HEAD~3)

3rd commit -->打包0001(HEAD~4)

2nd commit (HEAD~5)

1st commit



1.首先查看你的歷史記錄,確認你需要提取多少個commits,目前我們僅用最新的一個來做演示

$ git log --pretty=oneline -1
4f80ce0bbaa8c8eb9b410fef47cc569e2aa301c6 my patch

2. 抽取分支,如果僅抽取一個commit,就不需要自定義名字了

$git format-patch -1
如果抽取多個,建議自定義一個名字,這樣便於後期patch的使用。 !注意使用--stdout指向自定義的patch名

$ git format-patch -2 --stdout > newpatch


3. 查看下當前目錄,你會發現目錄裏多了幾個.patch文件,大部分是使用commit message命名的,唯一的一個是使用自定義的名字


4. 將所有.patch文件打包發送給需要的人就可以了



下面我們把這些patch使用到我們自己的分支上

1. 首先查看下patch的內容

$ git apply --stat 0001-my-patch.patch
 README |    1 +
 1 file changed, 1 insertion(+)

2. 可以在進行下檢查

$ git apply --check 0001-my-patch.patch

3. 下面進行應用

$ git am --signoff < 0001-my-patch.patch
Applying: my patch
注意--signoff會在原commit message基礎上添加一行以sign off by開始的信息,詳細內容請查閱git am --help

$ git log -1
commit 03be3d49813cb0f3e50d85cac4d7228af93a7807
Author: bing.wei <[email protected]>
Date:   Thu May 2 10:00:51 2013 +0800


    my patch


    Signed-off-by: bing.wei <[email protected]>



更多技巧:

1. 指定某個commit的patch

$ git log -2
commit 3de4eda5ad46f9d16d9ba86b69e172107988b38c
Author: bing.wei <[email protected]>
Date:   Thu May 2 10:42:20 2013 +0800

    new 2

    Signed-off-by: bing.wei <[email protected]>

commit 8d0a564024e20910b3a60fa2e68aaa72cdeb0cf5
Author: bing.wei <[email protected]>
Date:   Thu May 2 10:42:12 2013 +0800

    new 1

    Signed-off-by: bing.wei <[email protected]>


$ git format-patch -1 8d0a564024e2091
0001-new-1.patch

2. 指定某commit之後的所有commits的patch

$ git log --pretty=oneline -4
3de4eda5ad46f9d16d9ba86b69e172107988b38c new 2
8d0a564024e20910b3a60fa2e68aaa72cdeb0cf5 new 1
03be3d49813cb0f3e50d85cac4d7228af93a7807 my patch
dcfaf683f61f041b987d9796145d5398dd0ffc31 nice

Administrator@B031-BINGWEI /d/app/eclipse/AndroidSC/gitpractice (master)
$ git format-patch 03be3d49813cb
0001-new-1.patch
0002-new-2.patch

3. 從最後一條commit前推10條

$ git format-patch -10 <HEAD>
0001-update2.patch
0002-aa-revert.patch
0003-Revert-aa-revert.patch
0004-add-boy.txt.patch
0005-test.patch
0006-a.patch
0007-commit-1.patch
0008-my-patch.patch
0009-new-1.patch
0010-new-2.patch

或者

$ git format-patch HEAD~10
0001-update2.patch
0002-aa-revert.patch
0003-Revert-aa-revert.patch
0004-add-boy.txt.patch
0005-test.patch
0006-a.patch
0007-commit-1.patch
0008-my-patch.patch
0009-new-1.patch
0010-new-2.patch


使用HEAD和~, ^的技巧

Administrator@B031-BINGWEI /d/app/eclipse/AndroidSC/gitpractice (master)
$ git format-patch HEAD~3
0001-my-patch.patch
0002-new-1.patch
0003-new-2.patch

Administrator@B031-BINGWEI /d/app/eclipse/AndroidSC/gitpractice (master)
$ git format-patch HEAD^^^
0001-my-patch.patch
0002-new-1.patch
0003-new-2.patch





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