git学习笔记(十)--git的历史合并
在一个版本修改过程中,可能会遇到下面这几种情况:
- 刚提交完,发现出错,怎么办?
- 连续提交了好几次,每次修改不多,想把几次合并为一次大的提交,怎么办?
- 以前的多次提交中,有几次的没有用,想从中挑出几次提交,怎么办?
- 历史提交太多了,想精简一下版本库,怎么办?
下面主要针对这几个问题,给出几种解决方案:
问题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上
浙公网安备 33010602011771号