2022/12/02 7-git merge

116 阅读2分钟

准备工作

  1. 创建一个git项目git-combining
  2. 在项目中创建master目录,在master中添加m1.txt,提交git commit -m 'm1'
  3. 在master中添加m2.txt,提交git commit -m 'm2'
  4. 创建并切换到新分支feature,在feature中添加f1.txt,提交git commit -m 'f1'
  5. 在feature中添加f2.txt,提交git commit -m 'f2'

目前我们在这个项目上就有了两个分支,在master分支上有m1,m2两个提交,在feature分支上有m1,m2,f1,f2四个提交: image.png

git merge

master 分支上执行

git merge feature

fast-forward

像上图的情况,当master上没有额外的提交时执行git merge,那默认会执行一个Fast-forward的提交,不会产生新的提交记录,只是单纯的将HEAD向后移动image.png 这时,使用git log查看master分支的提交记录: image.png 当我们进入下一点之前,先撤销我们的合并

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分支的提交记录: image.png 当我们进入下一点之前,先撤销我们的合并

git reset --hard HEAD~1

non fast-forward

如果我们在开发feature分支的时候,在master分支上也进行了修改,比如添加了m3.txt并提交,这时候再在master上执行git merge feature会产生non fast-forwardimage.png image.png 使用non fast-forward产生的合并会产生一个新的提交。使用git log查看,可以看到按提交顺序排列的提交记录: image.png 如果这个时候我们要回撤我们的合并,注意!只需撤回一个提交即可:

git reset --hard HEAD~1

当执行了HEAD~1,就会将合并操作撤回,也就是Merge branch 'feature'/f2/f1都会被撤回。