假设目前我们拥有一个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 <bing.wei@symbio.com>
Date: Thu May 2 10:00:51 2013 +0800
my patch
Signed-off-by: bing.wei <bing.wei@symbio.com>
更多技巧:
1. 指定某个commit的patch
$ git log -2
commit 3de4eda5ad46f9d16d9ba86b69e172107988b38c
Author: bing.wei <bing.wei@symbio.com>
Date: Thu May 2 10:42:20 2013 +0800
new 2
Signed-off-by: bing.wei <bing.wei@symbio.com>
commit 8d0a564024e20910b3a60fa2e68aaa72cdeb0cf5
Author: bing.wei <bing.wei@symbio.com>
Date: Thu May 2 10:42:12 2013 +0800
new 1
Signed-off-by: bing.wei <bing.wei@symbio.com>
$ 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