Git合并操作之merge、rebase、squash详解


有时在一个分支上完成一个功能的开发,开发完成后需要将其合并到主分支中。或者有时提交了很多个commit,它们之间的改动并不是很多,想将它们合并成一个commit,此时就需要使用GIT的合并操作。下面来介绍一下GIT中的几种合并操作:

1 git merge和git rebase

git merge不对仓库历史做任何改变,它会保留分支上所有的历史commit,然后简单地创建一个合并的commit。
在这里插入图片描述

1.1 git merge

使用git mergemaster分支合并到feature分支

git checkout feature
git merge master

上面的操作会在feature分支上产生一个新的commit,它是c4c7的合并为c8c8包含了master分支上的所有修改,结果如下图所示:

在这里插入图片描述

快速模式

  • 若在建立feature分支后主分支没有任何commit,则此时会使用Fast forward模式进行merge,即不会产生一个新的commit,而是直接将main分支的指针指向feature分支
  • 取消快速模式,需要添加选项--no-ff

1.2 git rebase

使用git rebasemaster分支合并到feature分支

git checkout feature
git rebase master

rebase将feature分支的基移到master分支的开头(即c4),将所有的新提交合并到主分支中。与在feature分支中创建合并提交不同,rebase通过在feature分支中为每个commit创建全新的commit来重写提交历史,*c5*c6*c7是在feature分支上的新commit。换句话说,就是c4的基础上,依次重新提交在feature分支上的每一次修改

在这里插入图片描述

可以看到提交是线性的,我们可以回溯从feature分支顶端开始到master分支的第一次提交的任何提交。rebase不会创建不必要的合并提交,因此,项目的提交历史将更清晰,更容易被其他开发人员理解。

  • 注意:不建议在公共分支(master分支)上执行rebase合并,这会创建不同的master分支。当然你也可以同步这两个不同的master分支,然后merge为一个,但是这会导致重复提交,从而让主分支的commit十分混乱。

1.2.1 rebase交互模式

要想使用交互模式,在rebase命令后加上-i--interactive选项即可。

git rebase -i [start] [end]
  • end可省略,默认为HEAD。其中start为开区间,end为闭区间。

例1:合并近三次的commit

git rebase -i HEAD~3

此时会弹出一个文本编辑窗口,前三行即最近三次的commit

pick 344a29d test1
pick 36f77fe test2
pick 88cb498 test3

常用选项如下:

p, pick = use commit
s, squash = use commit, but meld into previous commit
f, fixup = like "squash", but discard this commit's log message
d, drop = remove commit

由选项可知,将最前面的pick设置为squashfixup即可压缩分支,和接下来要用到的--squash类似,但这里可以指定任意个数的commit进行合并。我们的目标是合并近三次commit,所以将第2、3行的前面的pick改为sf即可。

注意:在合并过程中若发生冲突,需要自己对比修改本地文件,解决完冲突后执行:

git add .
git rebase --continue

如果中途不想合并了,则可以执行:

git rebase --abort

例2:删除某个commit

同理,如果想删除某个commit,将最前面的pick改为drop即可。

1.2.2 git pull --rebase

  • git pull:先git fetchgit merge HEAD
  • git pull --rebase:先git fetchgit rebase HEAD

从远程拉取代码后会与本地的代码进行合并,由上面的原理可知,使用git merge拉取最新的另一个分支的commit后,还会多产生一个合并的commit;而rebase则直接在拉取最新的commit后,即在当前本地分支的基础上,应用远程最新分支的修改,在当前分支上产生一个commit,不会有多一个commit。

2 git squash

git merge中,每一次merge就会产生一个额外的commit,如果在工程中有许多bug和一些微小改变的commit,那么可以使用--squash选项将feature分支中的所有commit取出,然后压缩这些commit为一个并加入到master分支中。
在这里插入图片描述

具体指令如下:

git checkout master
git merge --squash feature
  • 注意:上述的合并命令并不会创建一个commit,实际上就是将feature中的每一次commit的更改应用到本地,所以还需要手动提交该commit:git commit -m <"your commit message">

合并结果如下:
在这里插入图片描述

  • 36
    点赞
  • 114
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tilblackout

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值