[GitHub]第四讲:合并分支
本地两个分支合并
先从最简单的一种情况着手。现在项目只有一个 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]第四讲:合并分支的更多相关文章
- GitHub使用(四) - 关于分支Branch
1. 什么是分支Branch? 我初步的理解为:GitHub仓库默认有一个master的分支,当我们在master分支开发过程中接到一个新的功能需求,我们就可以新建一个分支同步开发而互不影响,开发完成 ...
- [GitHub]第三讲:简单分支操作
Git 最核心的操作对象是版本( commit ),最核心的操作技巧就是分支. 什么是分支? 仓库创建后,一旦有了新 commit,默认就会放到一个分支上,名字叫 master.前面咱们一直看到的多个 ...
- 《SLAM十四讲》个人学习知识点梳理
0.引言 从六月末到八月初大概一个月时间一直在啃SLAM十四讲[1]这本书,这本书把SLAM中涉及的基本知识点都涵盖了,所以在这里做一个复习,对这本书自己学到的东西做一个梳理. 书本地址:http:/ ...
- git之合并分支(git merge)------(三)
最近几天写小demo,总是自己拉取他人的代码,然后创建分支,在自己的分支上进行修改,然后提交到自己的分支,具体的这一步,我就不多讲了,因为在我的博客“工作中常用的Git操作”中有详细的介绍,今天主要讲 ...
- Git工程开发实践(四)——Git分支管理策略
A successful Git branching model https://nvie.com/posts/a-successful-git-branching-model/ Git工程开发实践( ...
- git 教程(13)--创建与合并分支
在版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支.截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支.HEAD严格来说不是指向提交,而 ...
- git学习笔记06-创建分支合并分支-比svn快多了,因为只有指针在改变
一开始git只有一条时间线,这个分支叫主分支,即master分支. HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支. 每次提交,mas ...
- 转:C#精髓 第四讲 GridView 72般绝技
说明:准备出一个系列,所谓精髓讲C#语言要点.这个系列没有先后顺序,不过尽量做到精.可能会不断增删整理,本系列最原始出处是csdn博客,谢谢关注. C#精髓 第四讲 GridView 72般绝技 作者 ...
- git分支管理之创建与合并分支
在版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支.截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支.HEAD严格来说不是指向提交,而 ...
随机推荐
- Linux学习之CentOS(八)----详解文件的搜寻、查找(转)
which (寻找『运行档』) [root@www ~]# which [-a] command 选项或参数: -a :将所有由 PATH 目录中可以找到的命令均列出,而不止第一个被找到的命令名称 分 ...
- Cisco 交换机配置的基本命令
1.不同的vlan 不同vlan需要路由 在路由的端口设置多个IP段 交换机模拟器实验六 2.查看端口名字 SWA#sh vlan default Active F0/1, F0/2, F0 ...
- Linux学习之CentOS(八)----文件与目录的默认权限与隐藏权限(转)
文件与目录的默认权限与隐藏权限 一个文件有若干个属性, 包括读写运行(r, w, x)等基本权限,及是否为目录 (d) 与文件 (-) 或者是连结档 (l) 等等的属性! 要修改属性的方法在前面也约略 ...
- js去除空格,判断是否包含
js去除空格 function trimStr(str){ return str.replace(/(^\s*)|(\s*$)/g,""); } js判断是否包含 //是否包含 f ...
- Go实现海量日志收集系统(四)
到这一步,我的收集系统就已经完成很大一部分工作,我们重新看一下我们之前画的图: 我们已经完成前面的部分,剩下是要完成后半部分,将kafka中的数据扔到ElasticSearch,并且最终通过kiban ...
- 从 python 中 axis 参数直觉解释 到 CNN 中 BatchNorm 的工作方式(Keras代码示意)
1. python 中 axis 参数直觉解释 网络上的解释很多,有的还带图带箭头.但在高维下是画不出什么箭头的.这里阐述了 axis 参数最简洁的解释. 假设我们有矩阵a, 它的shape是(4, ...
- EF实体的部分更新
实现实体的部分更新假设实体InfoHotel如下: public class InfoHotel { public int Id{get;set;} public string Name{get;se ...
- Docker 第一篇 认识Docker 的作用好处
Docker 第一篇 认识Docker 的作用好处 (1)什么是Docker (2)Docker 优势劣势 Docker是去年开始关注并学习的,因为项目用到了AspnetCore 了解了之后总感觉会用 ...
- nodeppt的使用教程
为什么选择nodeppt 这可能是迄今为止最好的网页版演示库 基于GFM的markdown语法编写 支持html混排,再复杂的demo也可以做! 支持多个皮肤:colors-moon-blue-dar ...
- sourcestress 问题解决方案
描述:在Windows系统下,在保证GitHub上的账号和密码正确的情况下,在push时候,输入正确的账号和密码后,却是提醒无效的账户密码. 解决方法:在C:\Users\...\AppData\Lo ...