本地两个分支合并

先从最简单的一种情况着手。现在项目只有一个 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. NGUI制作可滚动的文本框(摘,如有侵权,联系删除)

    NGUI制作可滚动的文本框 1.首先创建一个UI Root 2.选择UI Root右键 Create 选择Scoll View创建. 3.Scroll view的大小是可以调节的,调节为你需要的适当大 ...

  2. fatal error LNK1104: 无法打开文件“lua51.lib”

    今天学习C++与Lua通信,遇到了问题:fatal error LNK1104: 无法打开文件"lua51.lib" 开发环境: VS2012 cocos版本:cocos2d-x- ...

  3. substr和substring的区别

    substr和substring两个都是截取字符串的. 两者有相同点,如果只是写一个参数,两者的作用都是一样的:就是截取字符串当前下标以后直到字符串最后的字符串片段. 例如:`var a=”abcde ...

  4. Java常用排序算法

    在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序. 一般来说外排序分为两个步骤:预处理和合并排序.首先,根据可用内存的大小,将外存上含有n个纪录的文件分成若干长 ...

  5. eclipse中创建完整的maven项目

    使用eclipse插件创建一个web project 首先创建一个Maven的Project如下图 我们勾选上Create a simple project (不使用骨架) 这里的Packing 选择 ...

  6. Ubuntu 16.04+.Net Core+Docker+Uginx安装部署

    前言 最近公司的项目打算移植到.Net Core平台,所以调研了一下.Net Core在Linux下的安装部署.本篇文章会一步步的描述从安装到配置到部署的全部过程.在文章的结构和内容里,笔者借鉴了很多 ...

  7. 如何搭建ssh服务?

    为了日后便于查询,本文所涉及到的所有命令集合如下: rpm -qa | grep openssh #查看是否安装了openssh软件 service sshd status #服务端的ssh状态 if ...

  8. 转:Socket原理与编程基础

    from: http://acm.tzc.edu.cn/acmhome/projectList.do?method=projectNewsDetail&nid=2 一.Socket简介 Soc ...

  9. POJ 2135 最小费用最大流

    题目链接 Farm Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18961   Accepted: 7326 D ...

  10. jQuery 效果 – 停止动画

    jQuery stop() 方法用于在动画或效果完成前对它们进行停止. 点击这里,向上/向下滑动面板 实例 jQuery stop() 滑动 演示 jQuery stop() 方法. jQuery s ...