合并分支是多人开发中的常规操作,如何高效的合并其他分支的commit并解决冲突是每个人应掌握的基本技能。
Rebasing
In Git, there are two main ways to integrate changes from one branch into another: the merge and the rebase. In this section you’ll learn what rebasing is, how to do it, why it’s a pretty amazing tool, and in what cases you won’t want to use it.
变基
一般的变基操作就是拉取其他分支到本地进行合并。
git pull -r origin feat
在rebase的过程中如果出现conflict,Git会停止rebase并让你去解决冲突,在解决完冲突后,需要add更新这些内容,并用--continue参数继续rebase,这样git会继续apply余下的补丁。
git add .
git rebase --continue
在任何时候,你都可以用--abort参数来终止rebase的行动,并且你的当前分支会回到rebase开始前的状态。
git rebase --abort
合并commit
当我们在本地仓库提交了多次类似修改或功能相同的commit后,为了让log更简洁明了,需要把多个提交记录合并为一个完整的提交,然后再push到远程仓库,这时我们也要用到rebase。
首先我们需要先查看log信息。
git log --oneline
选取最近3次commit进行合并。
git rebase -i HEAD~3
进入到vi页面,可以看到command说明。
我们主要关注pick、squash、fixup这三个指令。由于vi页面的commit越往下越新,合并commit操作都是往前一条commit上合并,所以第一条一定要pick,下面的可以选择squash或fixup,s和f的区别就是s会再弹出一个vi页面可以更改log message,而f则直接丢弃。
p, pick <commit> = use commit --- 保留该条commit
s, squash <commit> = use commit, but meld into previous commit --- 合并到前一条commit
f, fixup <commit> = like "squash", but discard this commit's log message --- 和s一样不过会丢弃log message
wq保存退出后就进行合并,如果有冲突正常rebase就好。
你还可以选择要合并的commit区间,注意区间是(左开, 右闭]的。
git rebase -i [startpoint] [endpoint]
只选择一条commit时则会默认选择从这条之后到最新的所有commit。
git rebase -i commit
合并结束后就可以push到远程仓库了,如果commit已经push过,你还想覆盖远程仓库的commit,可以用push -f,但是一定要确保自己本地的代码是最新的,否则慎用。
tip: 如果只是更改刚刚commit的信息,可以使用简单的--amend参数即可。
git commit --amend