多个commit 合并为一个patch

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


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


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

[plain]  view plain copy print ?
  1. commit 9fdd76eb5fd06b1b7f2af6800dc13e51099c40d9  
  2. Author: ShichaoXu   
  3. Date:   Tue Dec 31 17:13:24 2013 +0800  
  4.   
  5.     printf hello world  
  6.   
  7. commit a648e0564c0802267edc774c010956b343e6a844  
  8. Author: ShichaoXu   
  9. Date:   Tue Dec 31 17:12:22 2013 +0800  
  10.   
  11.     add second line  
  12.   
  13. commit 808d68dee51db0c3e64301f43be3c8b8a3808f5a  
  14. Author: ShichaoXu   
  15. Date:   Tue Dec 31 17:11:58 2013 +0800  
  16.   
  17.     add first line  
  18.   
  19. commit 3c5fef11eb9389f3575f8a11dda2deb3b79aa668  
  20. Author: ShichaoXu   
  21. Date:   Tue Dec 31 17:11:16 2013 +0800  
  22.   
  23.     add test.c  

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

[cpp]  view plain copy print ?
  1. #include   
  2.   
  3. int main()  
  4. {  
  5.     printf("hello world\n");  
  6.     return 0;  
  7. }  

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

[plain]  view plain copy print ?
  1. $ git checkout -b dev  
  2. Switched to a new branch 'dev'  

[plain]  view plain copy print ?
  1. $ git branch   
  2. * dev  
  3.   master  

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

[plain]  view plain copy print ?
  1. $ git reset --hard 3c5fef11eb9389f3575f8a11dda2deb3b79aa668  
  2. HEAD is now at 3c5fef1 add test.c  

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

[plain]  view plain copy print ?
  1. $ git log   
  2. commit 3c5fef11eb9389f3575f8a11dda2deb3b79aa668  
  3. Author: ShichaoXu   
  4. Date:   Tue Dec 31 17:11:16 2013 +0800  
  5.   
  6.     add test.c  
同时first.c 文件内容也为空。


再使用git merge:

[plain]  view plain copy print ?
  1. $ git merge master --squash  
  2. Updating 3c5fef1..9fdd76e  
  3. Fast-forward  
  4. Squash commit -- not updating HEAD  
  5.  first.c |    7 +++++++  
  6.  1 file changed, 7 insertions(+)  

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


再编辑一下commit信息:

[plain]  view plain copy print ?
  1. $ git commit -m "add a program--printf hello world"  
  2. [dev 50dc073] add a program--printf hello world  
  3.  1 file changed, 7 insertions(+)  

git log :

[plain]  view plain copy print ?
  1. $ git log   
  2. commit 50dc07351f136f5855b0d0ee3078f9192a58838b  
  3. Author: ShichaoXu   
  4. Date:   Tue Dec 31 18:03:31 2013 +0800  
  5.   
  6.     add a program--printf hello world  
  7.   
  8. commit 3c5fef11eb9389f3575f8a11dda2deb3b79aa668  
  9. Author: ShichaoXu   
  10. Date:   Tue Dec 31 17:11:16 2013 +0800  
  11.   
  12.     add test.c  

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

可以用    git format-patch 制作补丁

[plain]  view plain copy print ?
  1. $ git format-patch HEAD^  
  2. 0001-add-a-program-printf-hello-world.patch  





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

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


你可能感兴趣的:(Linux,kernel)