在使用 Git 的进行代码版本控制的时候,每每会发如今 log 中出现 "Merge branch 'master' of ..." 这句话,以下图所示。日志中记录的通常为开发过程当中对代码的改动信息,若是出现过多例如上述描述的信息会形成日志的污染。git
阅读了一些外文的博客,下面就来一探究竟。github
当多人合做开发一个项目时,本地仓库落后于远程仓库是一个很是正常的事情,可参考下图。fetch
A-B-C(master) \ D(origin/master)
具体情境以下:url
B
,此时修改了代码,并在本地仓库 commit 一次,但并未 push 到远端仓库。B
的基础上,一样 commit 了一次并 push 到远端仓库。那么这个时候,我再 push 本身的代码就会发生错误,以下。To github.com:maoqyhz/usegit.git ! [rejected] master -> master (fetch first) error: failed to push some refs to 'git@github.com:maoqyhz/usegit.git' hint: Updates were rejected because the remote contains work that you do hint: not have locally. This is usually caused by another repository pushing hint: to the same ref. You may want to first integrate the remote changes hint: (e.g., 'git pull ...') before pushing again.
这个时候咱们会选择,先 pull,再 push。Ok,push 成功,可是此时咱们查看 log 就会发现除了咱们本身提交的那条日志以外,会多出一条 "Merge branch 'master' of ..."。版本控制
那么,为何会出现这种现象呢?实际上是与 Git 的工做原理有关,对 Git 比较了解的人应该会知道,不管是 pull
、push
亦或是 merge
操做,其实背后都是有不少的不一样的模式的。日志
在进行 pull 操做的同时,其实就是 fetch+merge 的一个过程。咱们从 remote 分支中拉取新的更新,而后再合并到本地分支中去。code
fast-forward
模式,这种模式下,并不会产生合并节点,也就是说不会产生多余的那条 log 信息# fast-forword A-B-D(origin/master) \ C'(master) # merge A-B-C-E(master) \ / D(origin/master)
为了去除自动生成的 log 信息,有如下几种解决方案:blog
git pull --rebase
。若是拉取不产生冲突,会直接 rebase,不会产生分支合并操做,若是有冲突则须要手动 fix 后,自行合并。关于何时使用 rebase,何时使用 merge,开发者总结了几条规则:开发
- 从 remote 分支拉取更新到本地时,使用 rebase。
- 当完成 bug 修复或新功能时,使用 merge 将子分支合并到主分支。
- 没有人应该 rebase 一根共享的分支。
有关这二者具体的操做,能够参考我在文章最后列出的博客。rem