假設目前我們擁有一個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