Git push 时如何避免出现 "Merge branch 'master' of ..."

在使用 Git 的进行代码版本控制的时候,每每会发如今 log 中出现 "Merge branch 'master' of ..." 这句话,以下图所示。日志中记录的通常为开发过程当中对代码的改动信息,若是出现过多例如上述描述的信息会形成日志的污染。git

阅读了一些外文的博客,下面就来一探究竟。github

产生缘由分析

当多人合做开发一个项目时,本地仓库落后于远程仓库是一个很是正常的事情,可参考下图。fetch

A-B-C(master)
    \
     D(origin/master)

具体情境以下:url

  1. 我当前拉取的远端版本为 B,此时修改了代码,并在本地仓库 commit 一次,但并未 push 到远端仓库。
  2. 另外一位开发者在 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 比较了解的人应该会知道,不管是 pullpush 亦或是 merge 操做,其实背后都是有不少的不一样的模式的。日志

在进行 pull 操做的同时,其实就是 fetch+merge 的一个过程。咱们从 remote 分支中拉取新的更新,而后再合并到本地分支中去。code

  1. 若是 remote 分支超前于本地分支,而且本地分支没有任何 commit 的,直接从 remote 进行 pull 操做,默认会采用 fast-forward 模式,这种模式下,并不会产生合并节点,也就是说不会产生多余的那条 log 信息
  2. 若是想以前那样,本地先 commit 后再去 pull,那么此时,remote 分支和本地会分支会出现分叉,这个时候使用 pull 操做拉取更新时,就会进行分支合并,产生合并节点和 log 信息。这两种状态分别以下图所示:
# fast-forword 
A-B-D(origin/master)
     \
      C'(master)

# merge
A-B-C-E(master)
   \ /
    D(origin/master)

如何避免

为了去除自动生成的 log 信息,有如下几种解决方案:blog

  1. 若是你使用的是 Git Bash,直接使用 git pull --rebase。若是拉取不产生冲突,会直接 rebase,不会产生分支合并操做,若是有冲突则须要手动 fix 后,自行合并。
  2. 若是使用的是 GUI,例如 TortoiseGit,能够先 fetch,再手动 rebase 就能够了。

关于 rebase 和 merge

关于何时使用 rebase,何时使用 merge,开发者总结了几条规则:开发

  • 从 remote 分支拉取更新到本地时,使用 rebase。
  • 当完成 bug 修复或新功能时,使用 merge 将子分支合并到主分支。
  • 没有人应该 rebase 一根共享的分支。

有关这二者具体的操做,能够参考我在文章最后列出的博客。rem

References

相关文章
相关标签/搜索