文档章节

9 - 合并

jepacd
 jepacd
发布于 2016/09/24 18:23
字数 1221
阅读 10
收藏 0
点赞 0
评论 0

git允许两个开发人员在任何时候合并修改,这一切并不需要一个中央仓库。一个合并会结合两个或者多个历史提交分支。尽管git支持同时合并三个、四个或者多个分支,但大多数情况下,一次合并只结合两个分支。

git中的合并,必须发生在一个版本库中,就是所要进行的合并必须在一个版本库中。

当一个分支的修改和另一个分支的修改不发生冲突的时候,git会计算合并结果,并创建一个新的提交来代表统一的状态。当分支冲突时,git并不解决冲突,冲突通常出现在对同一个文件的同一行进行修改的时候。git会把这种有争议的修改在索引中标记为未合并(unmerged),留给开发人员处理。

9.1 - 合并的例子

为了把other_branch合并到branch中,应该检出branch,并把other_branch分支合并到branch中。如下所示:

$ git checkout branch
$ git merge other_branch

9.1.1 - 没有冲突的合并

下面的例子,创建一个只有一个文件的版本库,然后创建两个分支,再把这两个分支合并在一起。

$ git init
Initialized empty Git repository in /Users/iEpac/Documents/git/merge_test/.git/

$ git config user.email 'iepac4srv@163.com'
$ git config user.name 'jEpac'
$ cat > file
Line 1 stuff
Line 2 stuff
Line 3 stuff

$ git add file 
$ git commit -m "init 3 line file"
[master (root-commit) f391dda] init 3 line file
 1 file changed, 3 insertions(+)
 create mode 100644 file

在master分支上创建另一个提交:

$ cat > other_file
here is stuff on another file

$ git add other_file 
$ git commit -m "another file"
[master 5cb5fea] another file
 1 file changed, 1 insertion(+)
 create mode 100644 other_file

到现在为止,版本库中已经有了两个提交的master分支,每次提交都创建了一个新文件。然后,切换到另个分支,修改第一个文件:

$ git checkout -b alternate master^
Switched to a new branch 'alternate'

$ git branch
* alternate
  master
$ git show-branch
* [alternate] init 3 line file
 ! [master] another file
--
 + [master] another file
*+ [alternate] init 3 line file

alternate分支是从master^分支派生来的。接下来,对文件做一些修改以便有内容来合并。

$ cat >> file
init 4 alternate stuff

$ git add file 
$ git commit -m 'add alternate`s line 4'
[alternate 3985336] add alternate`s line 4
 1 file changed, 1 insertion(+)

现在已经有了两个分支,master和alternate,每个分支都有不同的开发工作:

  1. master分支提交了file和other_file
  2. alternate分支对other_file做了修改

注意:git merge是区分上下文的。

  • 当前分支始终是目标分支
  • 其他分支始终是合并到当前分支

所以,alternate分支应该合并到mater分支中。所以,在合并前必须要切到master分支上。

$ git checkout master
Switched to branch 'master'
$ git show-branch
! [alternate] add alternate`s line 4
 * [master] another file
--
+  [alternate] add alternate`s line 4
 * [master] another file
+* [alternate^] init 3 line file

$ git status
On branch master
nothing to commit, working directory clean
$ git merge alternate
Merge made by the 'recursive' strategy.
 file | 1 +
 1 file changed, 1 insertion(+)

$ git ls-files
file
other_file

$ git show-branch
! [alternate] add alternate`s line 4
 * [master] Merge branch 'alternate'
--
 - [master] Merge branch 'alternate'
+* [alternate] add alternate`s line 4

可以使用提交图看一下:

$ git log --graph --pretty=oneline --abbrev-commit
*   37b02aa Merge branch 'alternate'
|\  
| * 3985336 add alternate`s line 4
* | 5cb5fea another file
|/  
* f391dda init 3 line file
  • 两个分支在f391dda提交处分开
  • 每个分支显示一个提交,5cb5fea3985336
  • 两个分支在37b02aa处合并

9.1.2 - 有冲突的合并

$ git merge alternate
自动合并 file
冲突(内容):合并冲突于 file
自动合并失败,修正冲突然后提交修正的结果

当合并出现冲突的时候, 首先要使用git diff查看文件的冲突程度

# git diff file
diff --cc file
index 39b21ea,a892d57..0000000
--- a/file
+++ b/file
@@@ -2,5 -2,5 +2,10 @@@ line 1 stuf
  line 2 stuff
  line 3 stuff
  line 4 alternate stuff
++<<<<<<< HEAD
 +line 5 stuff
 +line 6 stuff
++=======
+ line 5 alternate stuff
+ line 6 alternate stuff
++>>>>>>> alternate
  • <<<<和=====之间的:改变的内容
  • ====和>>>>>之间的:替代的内容

这时候需要手动解决冲突, 然后git add git commit。重新提交修改过的版本。

9.2 - 处理合并冲突

有冲突的修改不能自动合并

9.2.1 - 定位冲突的文件

git会对有问题的文件进行追踪,并在索引中把他们标记为冲突的(conflicted)或者未合并(unmerged)的。使用如下命令来查看工作目录中仍然未合并的一组文件

git status
git ls-files -u

9.2.2 - 检查冲突

移除冲突标记,然后执行git add和git commit. 下面是git提供的解决冲突。

对冲突使用git diff

有冲突的文件合并后, 工作目录中的这个文件内容被修改为冲突后的合并内容,并有冲突标识.

对冲突使用git log命令

git log --merge --left-right -p

不要对有冲突标记的文件执行git add命令, 这会清除索引中的冲突并允许提交, 但是文件是错误的

9.3 - 合并策略

© 著作权归作者所有

共有 人打赏支持
jepacd
粉丝 5
博文 30
码字总数 210248
作品 0
朝阳
程序员
排序——合并排序法

一、合并排序法的概念 合并排序(Merge Sort)就是将两个或多个有序表合并成一个有序表。将两个有序表合并成一个有序表的过程称为二路合并。 二、算法描述 二路合并排序的基本思想是:对于两...

翼动动空 ⋅ 2016/06/17 ⋅ 0

lable、ul、ol、dl和table、fieldset标签

lable标签 有时候,我们希望点击文件的时候,鼠标的光标自动跳到输出框中。这需要使用lable功能 ul、ol、dl标签 table标签 table标签用来制作表格的。 表示行,同一行的内容写在一个中,表示...

余二五 ⋅ 2017/11/15 ⋅ 0

python中使用xlrd、xlwt操作excel表格详解

最近遇到一个情景,就是定期生成并发送服务器使用情况报表,按照不同维度统计,涉及python对excel的操作,上网搜罗了一番,大多大同小异,而且不太能满足需求,不过经过一番对源码的"研究"(...

Betty__ ⋅ 2016/10/09 ⋅ 0

js算法:Merge Sort 归并排序

Merge Sort : 归并排序,把一个大问题分解成若干相同的小问题,解决小问题后,合并小问题结果,最终把大问题解决.例如要排序数组 originArr = [2, 5, 3, 8, 9, 6, 3, 4, 2]先把问题分解为排序...

深山猎人 ⋅ 2016/06/15 ⋅ 0

php 文件处理(合并不同行的字符串)

文件如内容如下: device,"","","",2015-8-1 device,"","","","","",2015-9-1 device_test,"","","",2015-8-1 如果device没有重复的就不合并,device_test就不用合并 想要得到的结果为 devi...

流岚十七 ⋅ 2015/10/23 ⋅ 5

maven学习:多Web应用,合并成一个War包

1、在总的web的pom里面,加入要合并的war内容,示例如下: 2、在总的web的pom里面,加入要合并的war的依赖,示例如下: 注意:如果多个war有同路径且同名的文件,如果总的web里面有,那么总的...

科技探索者 ⋅ 2017/11/13 ⋅ 0

HTML标签之table

对于table来说,在一些小的模块中进行表格布局是非常好用的。我们可以这样来理解table,主要分成table部分和td部分。 table部分: 主要是来控制外边框的(就是最外面一层边框,不包括里面部分...

xinsz08 ⋅ 2017/07/12 ⋅ 0

新迹象显示微软将整合 Windows 和WP 品牌

微软将于本月 30 日发布新一代操作系统 Windows 9,这似乎已经是不争的事实。近期更是传出不少有关 Windows 9 多项新功能的截图及操作演示视频在内的新信息。此前还有传闻称微软可能会在 Wi...

oschina ⋅ 2014/09/29 ⋅ 18

链表面试题(上)

一、题目 1、从尾到头打印单链表 (有四种方法) 2、删除一个无头单链表的非尾节点(不能遍历链表) 3、在无头单链表的一个节点前插入一个节点(不能遍历链表) 4、单链表实现约瑟夫环(Joseph...

qq_38646470 ⋅ 01/04 ⋅ 0

python学习2正则表达

匹配ip地址 参考 http://blog.chinaunix.net/uid-108431-id-3350731.html http://blog.csdn.net/liangyuannao/article/details/8755325 第一步:地址分析,正则初判 1、0-9 d 进行匹配 2、1......

雪地花露 ⋅ 2016/10/18 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 9分钟前 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 35分钟前 ⋅ 0

浅谈设计模式之工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻...

佛系程序猿灬 ⋅ 今天 ⋅ 0

Dockerfile基础命令总结

FROM 指定使用的基础base image FROM scratch # 制作base image ,不使用任何基础imageFROM centos # 使用base imageFROM ubuntu:14.04 尽量使用官方的base image,为了安全 LABEL 描述作...

ExtreU ⋅ 昨天 ⋅ 0

存储,对比私有云和公有云的不同

导读 说起公共存储,很难不与后网络公司时代的选择性外包联系起来,但尽管如此,它还是具备着简单和固有的可用性。公共存储的名字听起来也缺乏专有性,很像是把东西直接堆放在那里而不会得到...

问题终结者 ⋅ 昨天 ⋅ 0

C++难点解析之const修饰符

C++难点解析之const修饰符 c++ 相比于其他编程语言,可能是最为难掌握,概念最为复杂的。结合自己平时的C++使用经验,这里将会列举出一些常见的难点并给出相应的解释。 const修饰符 const在c...

jackie8tao ⋅ 昨天 ⋅ 0

聊聊spring cloud netflix的HystrixCommands

序 本文主要研究一下spring cloud netflix的HystrixCommands。 maven <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-clo......

go4it ⋅ 昨天 ⋅ 0

Confluence 6 从其他备份中恢复数据

一般来说,Confluence 数据库可以从 Administration Console 或者 Confluence Setup Wizard 中进行恢复。 如果你在恢复压缩的 XML 备份的时候遇到了问题,你还是可以对整个站点进行恢复的,如...

honeymose ⋅ 昨天 ⋅ 0

myeclipse10 快速搭建spring boot开发环境(入门)

1.创建一个maven的web项目 注意上面标红的部分记得选上 2.创建的maven目录结构,有缺失的目录可以自己建立目录补充 补充后 这时候一个maven的web项目创建完成 3.配置pom.xml配置文件 <proje...

小海bug ⋅ 昨天 ⋅ 0

nginx.conf

=========================================================================== nginx.conf =========================================================================== user nobody; #......

A__17 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部