有时候开发一个功能需要commit 很多次才能有一个比较精简的版本。 但是此时只允许打一个patch,如果这样就要把这几个commit 信息合并。
可以通过git reset + git merge 命令来搞定。
对于一个test 工程 git log 看其提交的过程:
- commit 9fdd76eb5fd06b1b7f2af6800dc13e51099c40d9
- Author: ShichaoXu <gudujianjsk@gmail.com>
- Date: Tue Dec 31 17:13:24 2013 +0800
- printf hello world
- commit a648e0564c0802267edc774c010956b343e6a844
- Author: ShichaoXu <gudujianjsk@gmail.com>
- Date: Tue Dec 31 17:12:22 2013 +0800
- add second line
- commit 808d68dee51db0c3e64301f43be3c8b8a3808f5a
- Author: ShichaoXu <gudujianjsk@gmail.com>
- Date: Tue Dec 31 17:11:58 2013 +0800
- add first line
- commit 3c5fef11eb9389f3575f8a11dda2deb3b79aa668
- Author: 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 dev
- Switched to a new branch 'dev'
- $ git branch
- * dev
- master
再使用git reset 命令彻底回退到某个版本,这里回退到第一次commit之后:
- $ git reset --hard 3c5fef11eb9389f3575f8a11dda2deb3b79aa668
- HEAD is now at 3c5fef1 add test.c
此时git log 发现后面3次commit已经没有了:
- $ git log
- commit 3c5fef11eb9389f3575f8a11dda2deb3b79aa668
- Author: ShichaoXu <gudujianjsk@gmail.com>
- Date: Tue Dec 31 17:11:16 2013 +0800
- add test.c
再使用git merge:
- $ git merge master --squash
- Updating 3c5fef1..9fdd76e
- Fast-forward
- Squash 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 50dc07351f136f5855b0d0ee3078f9192a58838b
- Author: ShichaoXu <gudujianjsk@gmail.com>
- Date: Tue Dec 31 18:03:31 2013 +0800
- add a program--printf hello world
- commit 3c5fef11eb9389f3575f8a11dda2deb3b79aa668
- Author: 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