gitHub pull requset 的三种合并方式

  • 多个commit直接合并到master上
    rebase and merge

  • 多个commit合成一个再合并到master上
    quash and merge

  • 产生了一个merge的commit
    merge pull request

快速合并和非快速合并

1
2
$ git merge feature/a # 快速合并
$ git merge --no-ff feature/a # 非快速合并
  • 快速合并
    会直接将 master 指向了 feature/a,如下图所示:

  • 非快速合并
    会在 master 创建合并提交节点,如下图所示:

但是,master分支的历史记录有可能在bugfix分支分叉出去后有新的更新。这种情况下,要把master分支的修改内容和bugfix分支的修改内容汇合起来。

因此,合并两个修改会生成一个提交。这时,master分支的HEAD会移动到该提交上。

两种合并方式都可以,如果选择快速合并,需要保证每个提交都是独立且完整的,如果不满足要求,Git 支持修改提交历史,需要修改后再次合并。

合并你的开发分支

在合并之前,建议先将主分支新的提交合并到当前分支,有两种策略可以选择,合并和变基,合并操作更简单,变基操作提交树更清晰,建议使用变基的方式。

  • 合并操作的过程,命令如下:

    1
    2
    3
    $ git merge master
    $ git checkout master
    $ git merge feature/a

    合并操作后的提交树如下图所示:

  • 变基会修改feature/a的历史,就像 feature/a 是在 master 之后开发的一样,变基命令如下:

    1
    2
    3
    $ git rebase master
    $ git checkout master
    $ git merge feature/a

    变基操作后的提交树如下图所示,虚线的提交是feature/a变基之前的状态,在变基后,虚线的提交不再有分支指向,但并不会删除,而是变成Git中的游离节点,在Git执行GC(垃圾清理)操作后,节点才会彻底删除。

当多个开发分支时,故障分支合并

如果发现存在 Bug,要尽快修复,此时可以基于主分支新建故障分支,命令如下:

1
$ git checkout -b bugfix/b

当验证没问题后,故障分支需要合并回主分支,并在主分支上发布新的补丁版本,命令如下:

1
2
$ git checkout master
$ git merge --no-ff bugfix/b

主分支更新后,下游的公共分支要及时同步变更,建议使用变基进行同步,命令如下:

1
2
$ git checkout feature/a
$ git rebase master

故障分支模型如下图所示,bugfix/b 分支合并到 master 后,feature/a 分支进行了变基操作。