Git 上多次commit 合并成一个 patch

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

commit 9fdd76eb5fd06b1b7f2af6800dc13e51099c40d9  
Author: ShichaoXu   
Date:   Tue Dec 31 17:13:24 2013 +0800  
  
    printf hello world  
  
commit a648e0564c0802267edc774c010956b343e6a844  
Author: ShichaoXu   
Date:   Tue Dec 31 17:12:22 2013 +0800  
  
    add second line  
  
commit 808d68dee51db0c3e64301f43be3c8b8a3808f5a  
Author: ShichaoXu   
Date:   Tue Dec 31 17:11:58 2013 +0800  
  
    add first line  
  
commit 3c5fef11eb9389f3575f8a11dda2deb3b79aa668  
Author: ShichaoXu   
Date:   Tue Dec 31 17:11:16 2013 +0800  
  
    add test.c  


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

#include   
  
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   
Date:   Tue Dec 31 17:11:16 2013 +0800  
  
    add test.c  

同时first.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   
Date:   Tue Dec 31 18:03:31 2013 +0800  
  
    add a program--printf hello world  
  
commit 3c5fef11eb9389f3575f8a11dda2deb3b79aa668  
Author: ShichaoXu   
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  



总结:

1. 基于当前已经修改过的分支 Test  创建新分支 Fix  切换到分支 Fix

2. git log 查看提交记录 

假如当前提交记录为:commit 5

    commit 4

    commit 3

    commit 2

    commit 1

    commit 原始


3. 自己新提交的有五次   使用git reset 命令彻底回退到某个版本 这里回退到commit 原始

git reset --hard 原始

4. git merge Test --squash

5. 再编辑一下commit信息

git commit -m " new message "

6. git log 查看合并好的提交

7. 使用 git format-patch HEAD^ 制作补丁









你可能感兴趣的:(技术)