git合并多次commit

1,089 阅读3分钟

场景

当我在feature_newPage1分支开发的之后,可能会commit多次,最后再合并到develop或者master分支,这样提交记录看起来有点乱,假如我想要这多次commit合并为一次commit:'update 开发feature_newPage1',这样看起来更加整洁,要做怎么做呢?

1、为了举例,我先从develop分出一个feature分支进行开发 image.png 2、接着我修改了2次,并提交2次

image.png

要合并这2次commit的话,使用git reset和git rebase都可以实现

一、git reset 方法

在介绍git reset方法之前,我们先了解下一个git仓库的组成:

image.png

我们修改、添加一个文件之后,这个文件就处于工作区,假如直接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

image.png 3、git reset --mixed 重置到第一次提交之前的head

git reset --mixed 9ace3094b91f931fb1fc7b59965129716e85f49a

4、此时我们发现,第一次提交之后的修改都在,我们就可以把这些修改一起提交就可以了

git add .
git commit -m 'update feature全部提交'

image.png

注: 如果用可视化工具的话,就更加方便了:

image.png

二、git rebase 变基

个人认为,git rebase其实还是主要用于消除merge,然后才是合并commit,这里主要介绍一下合并commit

git rebase -i [startHEAD] [endHEAD] 合并commit

还是刚才的例子:

image.png 1、git log

git log

image.png 2、合并

git rebase -i 9ace3094b91f931fb1fc7b59965129716e85f49a 0a408b1747bfe319c441723fd0d4486565db6d76

注意:这是一个前开后闭的区间,所以startHEAD要往前一个

3、然后进入了vim编辑器,可以看到我们想要合并的2次commit

image.png

按i,进入编辑模式,只留一个pick,其它的变成s,

image.png esc,:wq保存

4、修改commit message

image.png 5、这时我们看到这2次commit被合并了,但是当前处分处在一个新的HEAD

image.png 6、最后 done!

git branch feature-one-commit // 拉出一个新的分支
git checkout feature-one-commit

image.png