本地两个分支合并

先从最简单的一种情况着手。现在项目只有一个 master 分支,我来新建一个 idea 分支,实现自己的想法,commit 一下。那现在仓库内的情况就是这样的

这个是前面已经见过的情形了。那如何让 idea 的代码并入 master 呢?需要”融合“( merge )一下。到客户端的 Branches 一项下,点击 Merge View

现在我想要把 idea 分支 merge 进 master 分支,注意图中的箭头方向。把鼠标移动到 master 分支的最左侧部分,知道鼠标变成了小手,拖拽 master 分支到右侧空框框里,idea 拖到左侧。

然后点 Merge Branches 按钮。就合并成功了,master 中拥有了 idea 中的所有代码。底层历史变成了这样

新生成了一个 C5 ,这是一个“融合版本”( Merge Commit )这个合并挺特殊,里面一般没有修改内容,它的作用主要是把两个分支合并起来。怎么合并的呢?把 master 的内容 sync 到 github.com 上,然后查看一下这个 merge commit ,会发现它有两个 parent

merge 之后, master 分支指针指向了 merge commit,也就自动拥有了 idea 分支上的 C3 这个版本了。idea 分支一般这会儿就可以删除了。

代码冲突 conflicts

实际中经常有这样的情况,我正在 idea 分支上开发一个比较大的功能。但是这个时候突然发现了一个紧急的问题需要修复,所以我会直接到 master 分支上,做一个 commit 来解决这个紧急的问题。然后会来继续到 idea 上开发。

其他的情形也有,总之这样就会出现,两个不同分支上并行开发,同时都有新的 commit ,这个一般没有问题,一样可以直接 merge ,如下图

但是如果在两个分支上改动了同一个地方,合并的就会出现代码冲突。 因为 Git 不知道该听哪个分支的,所以只能报出冲突的位置,让开发者手动解决。

来具体操作一下。在 idea 分支上,改动 README 文件中的一行,比如改成 AAA,commit 了,然后切换到 master 分支上,把这一行的内容改为 BBB ,也一样做
commit。这样再到客户端,打开 merge view 把 idea 分支 merge 到 master 之中,操作不会直接成功,而是会看到下面的代码冲突界面。

点击上图中的 Open In External Editor 按钮,就可以在你的编辑器中中打开存在冲突的文件,看到如下内容

test project for gitbeijing book
<<<<<<< HEAD
BBB
=======
AAA
>>>>>>> idea

注意上面的 HEAD 是代表当前分支,此刻对应我的情形就是 master 。所以 ===== 就是两个冲突代码块的分界线了。上面的代码就是
master 分支上的,下面的代码是 idea 分支的。解决冲突就是把上面的三行“冲突标示符”都删掉,然后修改代码。之后,回到客户端,点击 2 处的 Commit to Master 。 这样,这次分支合并就完成了,也会生成一个 merge commit 。

合并分支除了融合( merge )还有另外一种形式叫”变基“( rebase )这里暂时用不上,先不管。

合并远端分支

现在我本地仓库叫 coco,github.com 上托管了这个仓库。那么自然就有本地一个 master 分支,和远端一个 master 分支,这两个分支虽然名字都叫 master,但是本质上也是两个分支,也存在分支合并的问题。

比如这样,我在 github.com 网页上,修改一下项目,把修改内容 commit 到 master 分支之上。这样,远端的 master 就比我本地的 master 分支多了一个 commit。此时我到客户端,点 sync 按钮执行同步,这样这个 commit 就会直接被拉( pull )到我本地,这个是前面提过的。

另外一种情况,在我没有 sync 之前,我自己在本地也做了一个 commit,也就是本地的 master 和远端 master 出现了并行开发的情况,这种情况是非常常见的。这个时候我执行 sync ,会发生什么呢?

来操作一下。我自己到 github.com 上面,打开 coco 项目,添加一个文件进来,叫 remote。然后到本地也添加一个文件叫 local,做一个 commit 。这样我执行 sync,跟本地两个分支合并是一样的,一般也会生成一个 merge commit,在本地客户端和 github.com 上的历史线都可以看到。

在特定条件下,点 sync 按钮两个分支合并会不使用融合( merge )方式,而采用“变基”( rebase )方式,这样最终不会生成一个 merge commit 。但是达成的效果是一样的,也是实现了两个分支代码的合并,处理冲突的方式也一样,所以暂时不必深究。

总结

前面学会了怎么开分支,今天又学会了怎么合并分支,那分支的基本操作就会了。后面就是在实际开发情形中运用了。

[GitHub]第四讲:合并分支的更多相关文章

  1. GitHub使用(四) - 关于分支Branch

    1. 什么是分支Branch? 我初步的理解为:GitHub仓库默认有一个master的分支,当我们在master分支开发过程中接到一个新的功能需求,我们就可以新建一个分支同步开发而互不影响,开发完成 ...

  2. [GitHub]第三讲:简单分支操作

    Git 最核心的操作对象是版本( commit ),最核心的操作技巧就是分支. 什么是分支? 仓库创建后,一旦有了新 commit,默认就会放到一个分支上,名字叫 master.前面咱们一直看到的多个 ...

  3. 《SLAM十四讲》个人学习知识点梳理

    0.引言 从六月末到八月初大概一个月时间一直在啃SLAM十四讲[1]这本书,这本书把SLAM中涉及的基本知识点都涵盖了,所以在这里做一个复习,对这本书自己学到的东西做一个梳理. 书本地址:http:/ ...

  4. git之合并分支(git merge)------(三)

    最近几天写小demo,总是自己拉取他人的代码,然后创建分支,在自己的分支上进行修改,然后提交到自己的分支,具体的这一步,我就不多讲了,因为在我的博客“工作中常用的Git操作”中有详细的介绍,今天主要讲 ...

  5. Git工程开发实践(四)——Git分支管理策略

    A successful Git branching model https://nvie.com/posts/a-successful-git-branching-model/ Git工程开发实践( ...

  6. git 教程(13)--创建与合并分支

    在版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支.截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支.HEAD严格来说不是指向提交,而 ...

  7. git学习笔记06-创建分支合并分支-比svn快多了,因为只有指针在改变

    一开始git只有一条时间线,这个分支叫主分支,即master分支. HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支. 每次提交,mas ...

  8. 转:C#精髓 第四讲 GridView 72般绝技

    说明:准备出一个系列,所谓精髓讲C#语言要点.这个系列没有先后顺序,不过尽量做到精.可能会不断增删整理,本系列最原始出处是csdn博客,谢谢关注. C#精髓 第四讲 GridView 72般绝技 作者 ...

  9. git分支管理之创建与合并分支

    在版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支.截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支.HEAD严格来说不是指向提交,而 ...

随机推荐

  1. 腾讯北京SNG一面

    写在前面 面试官超nice,以一种聊天的形式跟你交流.上午10点10左右开始,11点40结束.总的来说,基础还可以,但是有些东西的底层学的还是不够深. 问题回忆 自我介绍 怎么平衡科研与项目开发之间的 ...

  2. quartz入门详解

    http://www.cnblogs.com/monian/p/3822980.html http://www.blogjava.NET/baoyaer/articles/155645.html 另: ...

  3. Linux下安装java的jdk和配置环境变量

    每次感觉配这个超级简单 但是每次都要查下 记一下好了 Linux下安装jdk,步骤如下 1:下载jdk包:本章使用的为后缀为tar.gz的文件(不需要安装),如jdk-8u111-linux-x64. ...

  4. Linux文件基本操作

    TIP:Tab键可以自动补全命令 首先要了解Linux树形结构 1./- 根每一个文件和目录从根目录开始.只有root用户具有该目录下的写权限.请注意,/root是root用户的主目录,这与/.不一样 ...

  5. JConsole/JvisualVM 远程连接失败处理

    今天在使用JConsole进行远程连接时,发现IP和端口在Windows下是可以远程telnet的,但是,使用JConsole时却无法连接. 我的环境如下: Windows下运行JConsole,准备 ...

  6. Docker命令查询

    基本语法 docker [OPTIONS] COMMAND [arg...] 一般来说,Docker 命令可以用来管理 daemon,或者通过 CLI 命令管理镜像和容器.可以通过 man docke ...

  7. 【Java集合系列】---ArrayList

    开篇前言--ArrayList中的基本方法 前面的博文中,小编主要简单介绍java集合的总体架构,在接下来的博文中,小编将详细介绍里面的各个类,通过demo.对比,来对java集合类进行更加深入的理解 ...

  8. 安卓7.1 新特性Shortcut

    介绍 Shortcut 是谷歌在API25提出来的 类似苹果3D touch 但是没有压力感应.在安卓中完全就是长按. 来看下效果吧: 是不是很赞? 那么请随本文一起学习吧 更新 新建项目 在你项目下 ...

  9. Dynamics CRM 产品视图列上自带按钮的隐藏

    CRM中对command bar的处理都是使用ribbon workbench,但是很多系统自带的按钮你是没法在ribbon workbench看到的,咱们以产品为例,比如我要隐藏form上的保存按钮 ...

  10. Scala:集合类型Collection和迭代器

    http://blog.csdn.net/pipisorry/article/details/52902549 Scala Collection Scala 集合分为可变的和不可变的集合. 可变集合可 ...