准备工作
- 创建一个git项目git-combining
- 在项目中创建
master目录,在master中添加m1.txt,提交git commit -m 'm1' - 在master中添加m2.txt,提交git commit -m 'm2'
- 创建并切换到新分支
feature,在feature中添加f1.txt,提交git commit -m 'f1' - 在feature中添加f2.txt,提交git commit -m 'f2'
目前我们在这个项目上就有了两个分支,在master分支上有m1,m2两个提交,在feature分支上有m1,m2,f1,f2四个提交:
git merge
在 master 分支上执行
git merge feature
fast-forward
像上图的情况,当master上没有额外的提交时执行git merge,那默认会执行一个Fast-forward的提交,不会产生新的提交记录,只是单纯的将HEAD向后移动。
这时,使用git log查看master分支的提交记录:
当我们进入下一点之前,先撤销我们的合并
git reset --hard HEAD~2
--squash
当合并两个分支可以产生fast-forward情况的时候,可以看到提交记录还是很清晰的,可能不足的是,我在feature这个分支上其实只是完成一个大的需求,所以在合并feature的时候我只希望产生一条记录。
git merge --squash feature
// 使用squash后会将你在feature分支的修改放到暂存区中,我们还要进行一次提交
git commit -m 'feature'
其实使用--squash就相当于将我们在feature分支上的修改集合到一块又做了一次新的提交。
这时,使用git log查看master分支的提交记录:
当我们进入下一点之前,先撤销我们的合并
git reset --hard HEAD~1
non fast-forward
如果我们在开发feature分支的时候,在master分支上也进行了修改,比如添加了m3.txt并提交,这时候再在master上执行git merge feature会产生non fast-forward。
使用
non fast-forward产生的合并会产生一个新的提交。使用git log查看,可以看到按提交顺序排列的提交记录:
如果这个时候我们要回撤我们的合并,注意!只需撤回一个提交即可:
git reset --hard HEAD~1
当执行了HEAD~1,就会将合并操作撤回,也就是Merge branch 'feature'/f2/f1都会被撤回。