场景
当我在feature_newPage1分支开发的之后,可能会commit多次,最后再合并到develop或者master分支,这样提交记录看起来有点乱,假如我想要这多次commit合并为一次commit:'update 开发feature_newPage1',这样看起来更加整洁,要做怎么做呢?
1、为了举例,我先从develop分出一个feature分支进行开发
2、接着我修改了2次,并提交2次
要合并这2次commit的话,使用git reset和git rebase都可以实现
一、git reset 方法
在介绍git reset方法之前,我们先了解下一个git仓库的组成:
我们修改、添加一个文件之后,这个文件就处于工作区,假如直接git commit
git会提示如下信息,就是说还需要执行git add把这个文件加入到暂存区,才可以进行commit,提交到本地库。
On branch feature
Changes not staged for commit:
modified: main.js
no changes added to commit
回到git reset,git reset其实就是修改当前分支的HEAD指针到某一次commit,git reset 后面有3个参数可以选择
git reset --soft [HEAD] // 本地库回到这个HEAD
git reset --mixed [HEAD] // 本地库、暂存区回到这个这个HEAD
git reset --hard [HEAD] // 本地库、暂存区、工作区回到这个这个HEAD
听起来是不是有点绕。。。我们用通俗的话讲:
git reset --soft [HEAD] // 回到这次commit,修改的文件都在,并且已经被加入到了暂存区
git reset --mixed [HEAD] // 回到这次commit,修改的文件都在,还没有加入暂存区,也就是需要 git add 然后 git commit
git reset --hard [HEAD] // 回到这次commit,修改的文件都不在了T T
好了,了解了这些,可见,我们想要修改的代码还在的话,应该使用--soft或者--mixed,这2个我们使用哪个都可以
1、确保在feature分支
git checkout feature // 确保在feature分支
2、git log查看提交HEAD
git log
3、git reset --mixed 重置到第一次提交之前的head
git reset --mixed 9ace3094b91f931fb1fc7b59965129716e85f49a
4、此时我们发现,第一次提交之后的修改都在,我们就可以把这些修改一起提交就可以了
git add .
git commit -m 'update feature全部提交'
注: 如果用可视化工具的话,就更加方便了:
二、git rebase 变基
个人认为,git rebase其实还是主要用于消除merge,然后才是合并commit,这里主要介绍一下合并commit
git rebase -i [startHEAD] [endHEAD] 合并commit
还是刚才的例子:
1、git log
git log
2、合并
git rebase -i 9ace3094b91f931fb1fc7b59965129716e85f49a 0a408b1747bfe319c441723fd0d4486565db6d76
注意:这是一个前开后闭的区间,所以startHEAD要往前一个
3、然后进入了vim编辑器,可以看到我们想要合并的2次commit
按i,进入编辑模式,只留一个pick,其它的变成s,
esc,:wq保存
4、修改commit message
5、这时我们看到这2次commit被合并了,但是当前处分处在一个新的HEAD
6、最后 done!
git branch feature-one-commit // 拉出一个新的分支
git checkout feature-one-commit