在使用 Git 的进行代码版本控制的时候,往往会发现在 log 中出现 "Merge branch 'master' of ..." 这句话,如下图所示。日志中记录的一般为开发过程中对代码的改动信息,如果出现过多例如上述描述的信息会造成日志的污染。

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

产生原因分析

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

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

具体情境如下:

  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 分支中拉取新的更新,然后再合并到本地分支中去。

  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 信息,有以下几种解决方案:

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

关于 rebase 和 merge

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

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

有关这两者具体的操作,可以参考我在文章最后列出的博客。

References

Git push 时如何避免出现 "Merge branch 'master' of ..."的更多相关文章

  1. git push 时发生 error: failed to push some refs to 错误 (解决办法)

    出现问题的原因:在github上更新了README.md,没有更新到本地仓库.而在本地git仓库又修改了文件,这时使用 git push origin master 推送到远程仓库后就出现了下面的问题 ...

  2. Merge branch 'master' of xxx error

    Merge branch 'master' of xxx Please enter a commit message to explain why this merge is necessary,es ...

  3. git push时提示"Everything up-to-date"

    从github上git clone下的项目,添加或修改文件后,git push时出现"Everything up-to-date" ,   即“一切都是最新的'. 通过 git s ...

  4. 如何修改git push时的密码

    如何修改git push时的密码 如下: 打开git bash 输入 cd ~/.ssh ls 确定有 id_rsa 和 id_rsa.pub文件 ssh-keygen -p -f id_rsa 第一 ...

  5. Git系列 —— 记一次Mac上git push时总是403的错误

    问题: 今天从github上clone下一个项目,然后修改后git push时总是出现: remote:Permission to lixyou/rw-split-plugin.git defined ...

  6. git push时提示"fatal: The current branch master has no..."

    git push到远程仓库时提示:fatal: The current branch master2 has no upstream branch. To push the current branc ...

  7. git常见问题之git pull时Please specify which branch you want to merge with.

    $ git pull时遇到如下提示 $ git pull warning: no common commits remote: Counting objects: 5, done. remote: C ...

  8. git push 时发生错误 error: src refspec master does not match any. error: failed to push some refs to

    很多相关解决办法都是最后要 push 到远端的 master 上,但很多其实要求不能把个人的修改内容直接 push 到 master 主分支. 因此,当我想将本地 feature/work1 分支的修 ...

  9. git push解决办法: ! [remote rejected] master -> master (pre-receive hook declined)

    前天准备上传一个project到GitLab上,但是试了很多次都上传不上去,报错如下: ! [remote rejected] master -> master (pre-receive hoo ...

随机推荐

  1. svn下已add文件如何忽略

    正如官方指南所言:TortoiseSVN → Unversion and add to ignore list,取消版本控制并添加至忽略列表. http://www.cnblogs.com/huang ...

  2. 转:SQL Server - 使用 Merge 语句实现表数据之间的对比同步

    表数据之间的同步有很多种实现方式,比如删除然后重新 INSERT,或者写一些其它的分支条件判断再加以 INSERT 或者 UPDATE 等.包括在 SSIS Package 中也可以通过 Lookup ...

  3. [cb]ScriptableWizard 创建向导

    需求 方便策划一步一步的创建Actor 思路分析 Unity的Editor中提供创建向导的功能,ScriptableWizard 代码实现 创建一个WizardCreateActor继承自Script ...

  4. 系统运维|IIS的日志设置

    摘要: 1.服务器告警,磁盘资源不足 2.检查发现是IIS日志没有清理并且设置有误.在E盘占用了200G的空间 3.原则上IIS日志不能放在C盘,避免C盘写满了导致操作系统异常 4.附上IIS日志按天 ...

  5. 2.1Python数据处理篇之---内建有关数学的函数

    目录 目录 前言 (一)数学相关得内建函数 (二)具体演示 1.求绝对值 2.创建一个复数 3.求商和余数 4.求x得y次幂 5.生成一个序列 6.四舍五入 7.对一个集合求和 8.求最大值 9.求最 ...

  6. MATLAB最小二乘法

    MATLAB最小二乘法 作者:凯鲁嘎吉 - 博客园http://www.cnblogs.com/kailugaji/ 三.实验程序 四.实验内容 设有如下数据: 用3次多项式拟合这组数据. 五.解答( ...

  7. C#中删除集合中符合条件的元素以及需注意属相

    如果用foreach,会造成被遍历的集合更改后带来异常问题. 此时,用for循环可有效的解决这个问题. for(int i=0;i<List.Count;i++) { if(条件是真) { Li ...

  8. spring boot thymeleaf 标签未关闭报错

    每天学习一点点 编程PDF电子书免费下载: http://www.shitanlife.com/code spring boot,input标签未关闭报bug,代码稍有不慎就出小问题,后来百度,goo ...

  9. Reflections - Java 8 - invalid constant type

    异常说明 使用Reflections扫描的时候出现could not create class file from, 原因是invalid constant type: 18 异常堆栈: org.re ...

  10. 项目Alpha冲刺 3

    作业描述 课程: 软件工程1916|W(福州大学) 作业要求: 项目Alpha冲刺(团队) 团队名称: 火鸡堂 作业目标: 介绍第三天冲刺的项目进展.问题困难和心得体会 1.团队信息 队名:火鸡堂 队 ...