git学习笔记(十)--git的历史合并

在一个版本修改过程中,可能会遇到下面这几种情况:

  1. 刚提交完,发现出错,怎么办?
  2. 连续提交了好几次,每次修改不多,想把几次合并为一次大的提交,怎么办?
  3. 以前的多次提交中,有几次的没有用,想从中挑出几次提交,怎么办?
  4. 历史提交太多了,想精简一下版本库,怎么办?

下面主要针对这几个问题,给出几种解决方案:

问题1


  git reset --soft HEAD^            很简单,撤销上一次提交即可

  git commit --amend -m ".." --author       也可以使用amend参数来修改说明,作者,邮箱

 

问题2


 

其实这个问题跟问题一一样,可以利用reset --soft,把HEAD指针指向N次之前的某一次提交,然后从那里开始一次性提交完毕,这样其后的几次提交都无效,但工作区和暂存区修改过的内容还是得以保留。

 git reset --soft HEAD~n

 git commit -m "新的说明"

 

问题3


 

方法一:使用git cherry-pick命令

git cherry-pick 这个命令的含义是,从众多的提交中选出一个应用到当前的分支中,操作过程相当于把该提交打包成一个补丁文件,在当前HEAD上重新做一遍,内容和提交说明都保持一致。

首先先做一下准备工作,如下图:

 

cherry-pick的使用

修改完后的处理工作

可以看到,最终把test3这个创建的提交给pass掉了

 

 

 

方法二:使用git rebase这个命令

首先学习一下rebase(变基)命令:

格式:  git rebase --onto <newbase> <since> <till>

含义:  以newbase为一个提交开始,把从since..till范围内的提交顺序安放到newbase上,构成一个新的提交结构

 

具体操作过程:

(1)首先git checkout到till上,如果till不是一个分支,那还要在变基结束后,做分支重置工作

(2)将sine..till标示的提交范围写到临时文件中,记得复习上一篇学习笔记中介绍的标示提交范围的方法

(3)将当前分支重置到newbase

(4)从临时文件中顺序读出提交列表,按顺序重置到该分支上,遇到已包含的,跳过

(5)如果遇到冲突,变基过程暂停。用户解决冲突后,可以选择:

    ① git rebase --continue  继续提交

    ② git rebase --skip    跳过提交  

    ③ git rebase --abort    终止提交

 

 

 

问题四


 

我们可以选定一个提交作为新的开始,打上个标签。

以此tag为根基,利用变基操作,把之后的提交全部打到这个tag上后,就实现了对之前历史的清除。

 

(1)创建新的根:

  git tag newstart ID1    给某个提交ID打个tag,从这里开始作为新的根

  git commit-tree newstart^{tree}  从该提交的目录树创建一个提交

  git log --pretty=raw ID2  查看刚才创建提交的ID2,发现没有父提交

 

(2) 变基:

  git rebase --onto ID2 newstart maser    把从newstart之后到master当前的提交全部转移到新建的ID2上

 

  

 

 

 

posted on 2012-07-25 16:55  melburg  阅读(350)  评论(0)    收藏  举报