多个commit 合并为一个patch

来源:互联网 发布:知满天面试班怎么样 编辑:程序博客网 时间:2024/06/06 03:02

   有时候开发一个功能需要commit 很多次才能有一个比较精简的版本。  但是此时只允许打一个patch,如果这样就要把这几个commit 信息合并。


可以通过git reset + git merge 命令来搞定。


对于一个test 工程   git log 看其提交的过程:

commit 9fdd76eb5fd06b1b7f2af6800dc13e51099c40d9Author: ShichaoXu <gudujianjsk@gmail.com>Date:   Tue Dec 31 17:13:24 2013 +0800    printf hello worldcommit a648e0564c0802267edc774c010956b343e6a844Author: ShichaoXu <gudujianjsk@gmail.com>Date:   Tue Dec 31 17:12:22 2013 +0800    add second linecommit 808d68dee51db0c3e64301f43be3c8b8a3808f5aAuthor: ShichaoXu <gudujianjsk@gmail.com>Date:   Tue Dec 31 17:11:58 2013 +0800    add first linecommit 3c5fef11eb9389f3575f8a11dda2deb3b79aa668Author: ShichaoXu <gudujianjsk@gmail.com>Date:   Tue Dec 31 17:11:16 2013 +0800    add test.c

经过第四次commit之后文件内容如下:

#include <stdio.h>int main(){printf("hello world\n");return 0;}

首先创建一个新的分支 dev (原来分支是master)

$ git checkout -b devSwitched to a new branch 'dev'

$ git branch * dev  master

再使用git reset 命令彻底回退到某个版本,这里回退到第一次commit之后:

$ git reset --hard 3c5fef11eb9389f3575f8a11dda2deb3b79aa668HEAD is now at 3c5fef1 add test.c

此时git log 发现后面3次commit已经没有了:

$ git log commit 3c5fef11eb9389f3575f8a11dda2deb3b79aa668Author: ShichaoXu <gudujianjsk@gmail.com>Date:   Tue Dec 31 17:11:16 2013 +0800    add test.c
同时first.c 文件内容也为空。


再使用git merge:

$ git merge master --squashUpdating 3c5fef1..9fdd76eFast-forwardSquash commit -- not updating HEAD first.c |    7 +++++++ 1 file changed, 7 insertions(+)

 --squash选项的含义是:本地文件内容与不使用该选项的合并结果相同,但是不保留待合并分支上的历史信息,也不提交、不移动HEAD,因此需要一条额外的commit命令。其效果相当于将another分支上的多个commit合并成一个,放在当前分支上,原来的commit历史则没有拿过来。
   判断是否使用--squash选项最根本的标准是,待合并分支上的历史是否有意义。


再编辑一下commit信息:

$ git commit -m "add a program--printf hello world"[dev 50dc073] add a program--printf hello world 1 file changed, 7 insertions(+)

git log :

$ git log commit 50dc07351f136f5855b0d0ee3078f9192a58838bAuthor: ShichaoXu <gudujianjsk@gmail.com>Date:   Tue Dec 31 18:03:31 2013 +0800    add a program--printf hello worldcommit 3c5fef11eb9389f3575f8a11dda2deb3b79aa668Author: ShichaoXu <gudujianjsk@gmail.com>Date:   Tue Dec 31 17:11:16 2013 +0800    add test.c

此时dev 分支的first.c 文件与 master 分支一样。

可以用    git format-patch 制作补丁

$ git format-patch HEAD^0001-add-a-program-printf-hello-world.patch





关于git merge 可以参考如下链接:

http://blog.csdn.net/hudashi/article/details/7664382










0 0
原创粉丝点击