关于团队合作的git冲突小叙

适宜人群

这是一篇关于 git 冲突入门级的介绍,以及简略介绍 git 分支的应用,大佬请绕行//手动龇牙
另外还有一篇非常好的最最基础的git使用命令请参考这篇写得很好的博客:Git操作详解

背景

最近在做一个微信小程序,因为不再是自己一个人独自开发,而是和两个组员一起开发小程序前端页面
那么不能再像在 GitHub 中托管辣鸡 demo 一样,一直一条分支
直接 git pull origin master
然后git push origin master
然后看着 GitHub 又变绿了一点,发出一声感叹:“虽然今天的代码一个都调不通,但是还是好累呢!”
刚开始其实三个人也是用的一个分支,即 master 分支,后来页面数量多起来,愈发地混乱,而且小程序页面注册,还有全局变量的设置,都在根目录下的app.js,app.json...中进行配置,(我重新整理后的)小程序目录大概如下:

小程序目录结构

所以项目 git 上传就一直冲突不断,基本上传一次就冲突一次

入坑

当项目中的两个成员同时修改一个文件(不是文件夹),然后分别上传到远程 git 仓库就会产生冲突,一般 git 会整合的时候在发生冲突的文件中自动生成三方合并标记线(<<<<<<<、=======、>>>>>>>)来标识各个成员的不同修改
Fine,For example

  1. 在 GitHub 上创建了一个测试项目来模拟远程 git 仓库
  2. 在电脑本地新建并使用两个空文件夹 file1file2 模拟真实开发中的两个项目成员
  3. file1file2 中分别clone下这个测试项目
  4. file1file2 先后修改clone到本地的测试项目中的同一个文件 test.text 中的内容
  5. 将修改后的 file1file2 先后push到GitHub,你会发现冲突

具体过程:
test.text 文件中, zb是模拟的公共配置项代码


成员 file1 在公共代码下面配置了自己的代码: 甲的修改


成员 file2 在公共代码下面配置了自己的代码: 乙的修改


于是他们两个在互不知情的情况下修改了同一个文件,分别 push 到远程 git 仓库
file1 先 pull,然后 push,这时候远程的 git 仓库中的 test.text 中的内容变成了 file1 修改后的内容
这时候 file2 在 pull 的时候就会产生冲突,因为远程的 git 仓库 test.text 中的第二行和 file2 本地
git 仓库 test.text 中的第二行内容不一样,git 本身无法判断到底保留哪个
所以就会自动处理冲突,全部保留下来,下面图片就是 git 自动处理冲突后的打印出的信息:


git 并使用标记线标明代码冲突来源和冲突的内容,下图就是 file2test.text 在 git 自动处理冲突后打开时候的内容(顿时感觉自己的代码被下了毒)

稍稍解释一哈这个里面的意思:

  • <<<<<<<HEAD 乙的修改

表示 git 提示这部分产生冲突的来源是HEAD,冲突的内容是 乙的修改 ,这个 HEAD 是一个指针,指向的是 file2 的最新提交记录

  • =======

分隔符,将冲突的内容以及来源的不同信息隔开

  • 甲的修改 >>>>>>>a35d5e7617aeb98bf382fa1a1af7579e976f9f4a

表示 git 提示这部分产生冲突来源是哈希值为a35d5e7617aeb98bf382fa1a1af7579e976f9f4a的提交记录(每一个提交 commit 都会有一个独有的哈希值,通过哈希值可以找到这个提交的所有信息),冲突的内容是 甲的修改 ,这个提交记录正是 file1 的提交

这时候你就要自己手动处理,看看到底保留哪一份代码,或者还是都保留,然后删掉这些 git 自己增加的字符,解决冲突后,继续 push 到远程 git 仓库
那么这时候问题来了,如果是一个两个文件冲突还好,像我自己目前这个小程序包含了大量的项目页面,配置等文件,每上传一次,来一次冲突,冲突还是一大片的,这谁顶得住?


我的微信小程序项目的冲突就是这样,许多文件许多代码段出现大量的<<<<<<<、=======、>>>>>>>标记符:


填坑

解决这个坑的思路是这样的:

  • 三个人分别建立自己的分支,每个人在自己的分支上提交记录,互不干扰
  • 将公共的要配置的代码放在gitignore中不传到远程git仓库中,最后合并分支再统一处理

分支思想

如果是单独开发,开发者可以选择一条分支进行代码托管
但是项目协作者一多,单分支就会出现问题:


上图就是我之前的项目的问题,大家都在同一条分支上进行修改提交,不知不觉就会修改同一个文件,然后产生冲突的问题
所以就将每个人写的项目独立成一条分支,然后就在自己的分支上尽情修改,最后再合并成一条,这样在开发的时候各个功能开发一起进行,互不影响,等各自完成后再合并部署,加快了进度和主分支的完整性和可用性

如图,在 master 分支上第二次提交的节点上新建branch2分支,甲在 master 上继续提交,乙在 branch2 上提交,互不干扰
合并分支:

当分支上的功能完成,我们可以将 branch2 分支合并到 master 分支上,如上图所示,最后又合并成一条主分支,然后就可以进行完整功能测试和部署至服务器了
那么问题来了,分支解决了冲突了么?

其实分支的目的就是避免冲突,互不影响,提高效率,如果两位开发者在两条不同的分支修改同一份文件,最后合并的时候还是会有冲突的,git 还是搞不清楚到底保留哪一份代码,于是又会它自己解决冲突,又会出现那些三方合并标记线
所以项目的模块划分,低耦合性很重要,我这个项目的解决方式是将这些公共的经常修改的配置文件等都在 .gitignore 中配置好,不传到远程 git 仓库中,最后统一分支的时候手动选择

相关命令

git branch
列出本地已经存在的分支,并且在当前分支的前面加 * 号标记

  • git branch -r 列出远程分支
  • git branch -a 列出本地分支和远程分支
  • git branch branch2 创建一个新的叫 branch2 的本地分支,但只是创建分支,没有进行分支切换

git chekout
切换分支

  • git checkout master 切换到 master 分支
  • git checkout -b branch2 新建并且切换到一条名为 branch2 的新分支
    即这条命令包含了两个过程:
    1.git branch branch2 新建 branch2 分支
    2.git checkout branch2 指针 HEAD 指向切换到 branch2 分支(也就是目前你都是在 branch2 分支上修改)

git pull origin master
git push origin master
将本地 git 仓库的 master 分支 push 到远程的test分支中,照例还是要先 pull,后push

git log
打印git的提交记录,后面可以跟参数
1.git log --oneline 可以使每条日志以简短的形式一行输出
2.git log --graph 可以使日志以图的形式打印
参数可以连用,即:git log --oneline --graph 功能叠加

举个例子:创建,合并分支过程

  1. git init
    在空文件下初始化git
  2. 在初始化 git 后的文件夹中创建并编辑相关代码文件
  3. git add .
    将自己修改好的代码添加到暂存区(add后面有个空格和 . )
  4. git commit -m "master第一次提交"
    将暂存区的代码提交到本地 git 仓库中
    此时的本地 git 仓库:


  5. git checkout -b branch2
    新建并且切换到 branch2 新分支
    这时候一个节点就包含了两个指针,一个 master ,一个 branch2
  6. 两次 git commit
    因为两个指针都包含在一个节点,所以要分离开两个指针,使之成为两条独立的分支
    当前 HEAD 指向 branch2 ,所以直接输入 git commit
    然后切换至 master 分支:git checkout master,继续输入: git commit
  7. 这时候不同开发者就可以在各个分支上进行修改
    假设 master 分支上提交了一次, branch2 分支上也提交了一次
  8. git checkout master
    如果在其他分支,这时候切换至 master 分支,准备合并
  9. git merge branch2
    如果在其他分支,先使用 git checkout master 命令切换至 master 分支
    再使用 git merge branch2branch2 合并至 master 分支
  10. git commit
    再使用 commit ,使 git 分支树彻底合并:

    10.git log --oneline --graph
    之前的图示都是我自己绘的,如果使用控制台查看 git 的历史提交记录,就是这样:

    如果你也是一步步按照我的步骤,这就是最后打印出来的图示!

坑外话

其实 git 博大精深,林纳斯作为 git 的创造者,毕竟是影响世界 IT 进程的程序员,牛皮不是没有道理的,我这里也只是小叙一波,有什么错误的不清晰的地方请大佬们指教,以后有什么更深入的理解也会持续更新(撒花)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,056评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,842评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,938评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,296评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,292评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,413评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,824评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,493评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,686评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,502评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,553评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,281评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,820评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,873评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,109评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,699评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,257评论 2 341

推荐阅读更多精彩内容

  • (预警:因为详细,所以行文有些长,新手边看边操作效果出乎你的预料) 一:Git是什么? Git是目前世界上最先进的...
    axiaochao阅读 1,920评论 1 8
  • Git 是目前最流行的分布式版本控制系统之一。 版本控制指的是,记录每次版本变更的内容和时间等细节,保留各版本之间...
    神齐阅读 1,390评论 0 7
  • 声明:这篇文章来源于廖雪峰老师的官方网站,我仅仅是作为学习之用 Git简介 Git是什么? Git是目前世界上最先...
    横渡阅读 3,941评论 3 27
  • 第一部分是文档,为了日后查看方便放到了前边[可能敲错了,详见阮一峰老师的文章]http://www.ruanyif...
    白璞1024阅读 1,012评论 0 49
  • 应该是从13年的时候就跟MT和王嘎嘎吆喝着想来台湾看看,当然,那个时候我还是疯狂迷恋五月天的我,要来看看,他们的故...
    小雨的soul阅读 475评论 0 1