Git 创建Patch

来源:互联网 发布:淘宝手机端首页模版 编辑:程序博客网 时间:2024/05/20 22:02

假设目前我们拥有一个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 -14f80ce0bbaa8c8eb9b410fef47cc569e2aa301c6 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.patchApplying: my patch
注意--signoff会在原commit message基础上添加一行以sign off by开始的信息,详细内容请查阅git am --help

$ git log -1commit 03be3d49813cb0f3e50d85cac4d7228af93a7807Author: 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 -2commit 3de4eda5ad46f9d16d9ba86b69e172107988b38cAuthor: 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 8d0a564024e20910b3a60fa2e68aaa72cdeb0cf5Author: 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 8d0a564024e20910001-new-1.patch

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

$ git log --pretty=oneline -43de4eda5ad46f9d16d9ba86b69e172107988b38c new 28d0a564024e20910b3a60fa2e68aaa72cdeb0cf5 new 103be3d49813cb0f3e50d85cac4d7228af93a7807 my patchdcfaf683f61f041b987d9796145d5398dd0ffc31 niceAdministrator@B031-BINGWEI /d/app/eclipse/AndroidSC/gitpractice (master)$ git format-patch 03be3d49813cb0001-new-1.patch0002-new-2.patch

3. 从最后一条commit前推10条

$ git format-patch -10 <HEAD>0001-update2.patch0002-aa-revert.patch0003-Revert-aa-revert.patch0004-add-boy.txt.patch0005-test.patch0006-a.patch0007-commit-1.patch0008-my-patch.patch0009-new-1.patch0010-new-2.patch

或者

$ git format-patch HEAD~100001-update2.patch0002-aa-revert.patch0003-Revert-aa-revert.patch0004-add-boy.txt.patch0005-test.patch0006-a.patch0007-commit-1.patch0008-my-patch.patch0009-new-1.patch0010-new-2.patch


使用HEAD和~, ^的技巧

Administrator@B031-BINGWEI /d/app/eclipse/AndroidSC/gitpractice (master)$ git format-patch HEAD~30001-my-patch.patch0002-new-1.patch0003-new-2.patchAdministrator@B031-BINGWEI /d/app/eclipse/AndroidSC/gitpractice (master)$ git format-patch HEAD^^^0001-my-patch.patch0002-new-1.patch0003-new-2.patch





原创粉丝点击