注,测试机 CentOS 5.5 x86_64,Git 服务器版本:git version 1.8.2.1,客户端版本:git version 1.9.2.msysgit.0。所有软件请到这里下载:http://msysgit.github.io/。

1.前言

在上一篇博客中我们主要讲解了Git 远程仓库,相信大家对远程的Git仓库有一定的了解,嘿嘿。在这一篇博客中我们来在大家讲解一下Git 分支管理,这可以说是Git的又一大特点。下面我们就来学习一下Git分支管理吧。

我们先来说一个简单的案例吧,你们团队中有多个人再开发一下项目,一同事再开发一个新的功能,需要一周时间完成,他写了其中的30%还没有写完,如果他提 交了这个版本,那么团队中的其它人就不能继续开发了。但是等到他全部写完再全部提交,大家又看不到他的开发进度,也不能继续干活,这如何是好呢?

对于上面的这个问题,我们就可以用分支管理的办法来解决,一同事开发新功能他可以创建一个属于他自己的分支,其它同事暂时看不到,继续在开发分支(一般都 有多个分支)上干活,他在自己的分支上干活,等他全部开发完成,再一次性的合并到开发分支上,这样我们既可知道他的开发进度,又不影响大家干活,是不是很 方便呢?

大家可能会说了,你Git的分支功能人家SVN也有啊,也没什么特殊的嘛。但我想说你那个创建和切换速度怎么样呢?嘿嘿,我想说谁用谁知道啊!但Git呢,无论你创建还是切换或者删除都很快哦!

分支本质上其实就是一个指向某次提交的可变指针。Git 的默认分支名字为 master 。而我们是怎么知道当前处于哪个分支当中呢?答案就是在于 HEAD 这个十分特殊的指针,它专门用于指向于本地分支中的当前分支。我们可以简单理解为:commit <- branch <- HEAD (注,本来我们详细说一下HEAD的,这个东西真不好说,goole了一下也没几个大神说这个,嘿嘿。下面我就通过讲解帮助大家理解,简单的说HEAD就 是指向于本地分支中的当前分支,如下图:) 下面我们来创建分支。

2.创建分支

当我们需要调试某个Bug或者尝试添加或修改程序中的某个模块,而又不能影响主分支的开发时。就可以通过创建分支来满足需求。创建分支相当于是创建一个新的分支指针指向当前所在的提交。我们在Commit3上创建dev分支:

如下图所示,dev分支指向Commit3。

从上图可知,虽然我们创建了一个新分支,但是 HEAD 仍然指向 master 。如果希望在创建分支的同时切换到新分支上,我们可以通过以下命令实现:

git checkout命令加上-b参数表示创建并切换分支上。

3.切换分支

切换当前分支我们可以用以下命令实现:

git branch -a 命令可以查看所有分支,现在我们HEAD指针便指向dev分支,大家可以在上图中看到dev分支上有个*号。

下面我们修改一下readme.txt中的内容,并在dev分支上提交一下。如下图:

用流程图演示上述过程如下:

现在我们在dev分支上完成工作,现在到master分支上。如下图:

流程图表示如下:

切换回master分支后,再查看一个readme.txt文件,如下图:

大家可以看到我们刚才增加的一行内容不见了,嘿嘿。因为那个提交是在dev分支上,而master分支没有变化。好了,下面我们来演示一下合并分支。

4.合并分支(快速合并)

现在,我们把dev分支的工作成果合并到master分支上,如下图:

git merge 命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。如下图:

大家注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度 非常快。当然,也不是每次合并都能Fast-forward,我们后面会将其他方式的合并。合并完成后,就可以放心地删除dev分支了。

5.删除分支

下面我们来演示一下删除分支,如下图:

大家在实际操作中可以发现在我们创建、合并、删除分支的速度非常快吧,这和直接在master分支上工作效果是一样的,但过程更安全,更可靠。下面我们来简单的总结一下:

  • 查看分支 git branch -a
  • 创建分支 git branch name
  • 切换分支 git checkout name
  • 创建并切换 git checkout -b name
  • 合并某分支到当前分支 git merge name
  • 删除分支 git branch -d name

6.分支合并冲突

下面我们来演示一下不同分支修改同一个文件产生冲突问题,下面我们来创建一个新的分支,继续开发新功能:

现在我们将分支切换到master分支上修改readme.txt内容并提交,如下图:

这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,如下图:

果然冲突了,Git告诉我们readme.txt文件存在冲突,必须手动解决冲突后再提交。下面我们用git status查看一下状态:

下面我们来查看一下readme.txt中的内容,如下图:

Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,让我们选择要保留的内容,下面我们修改一下readme.txt,再次提交。如下图:

好了,到这我们的分支合并冲突就讲解完成了,下面我们来删除分支。如下图:

最后,我们可以用 git log --graph --pretty=oneline --abbrev-commit 命令,查看一下分支合并。

7.合并分支(普通合并)

分支合并分为快速合并与普通合并两种模式,普通合并,合并后的历史有分支记录,能看出来曾经做过合并,而快速合并就看不出来曾经做过合并。下面我们来演示一下普通合并,

大家可以看到我们这次合并用的普通模式合并,--no-ff参数表示禁用快速合并。下面我们用git log命令查看一下合并历史:

注,合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支记录,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。如下图:

1).快速合并

2).普通合并

8.分支管理策略

下面我们来说一下一般企业中开发一个项目的分支策略:

  • 主分支 master
  • 开发分支 develop
  • 功能分支 feature
  • 预发布分支  release
  • bug 分支 fixbug
  • 其它分支 other

1).主分支 master

代码库应该有一个、且仅有一个主分支。所有提供给用户使用的正式版本,都在这个主分支上发布。

Git主分支的名字,默认叫做Master。它是自动建立的,版本库初始化以后,默认就是在主分支在进行开发。

2).开发分支 develop

主分支只用来分布重大版本,日常开发应该在另一条分支上完成。我们把开发用的分支,叫做Develop。

这个分支可以用来生成代码的最新代码版本。如果想正式对外发布,就在Master分支上,对Develop分支进行"合并"(merge)。

3).功能分支 feature

功能分支,它是为了开发某种特定功能,从Develop分支上面分出来的。开发完成后,要再并入Develop。

功能分支的名字,可以采用feature-*的形式命名。

4).预发布分支  release

预发布分支,它是指发布正式版本之前(即合并到Master分支之前),我们可能需要有一个预发布的版本进行测试。预发布分支是从Develop分支上面 分出来的,预发布结束以后,必须合并进Develop和Master分支。它的命名,可以采用release-*的形式。

5).bug 分支 fixbug

bug分支。软件正式发布以后,难免会出现bug。这时就需要创建一个分支,进行bug修补。修补bug分支是从Master分支上面分出来的。修补结束以后,再合并进Master和Develop分支。它的命名,可以采用fixbug-*的形式。

6).其它分支 other

还有就是其它分支了,大家可以根据需要创建即可……

9.团队多人开发协作

在上面的章节中我们讲解了Git的分支管理策略,一般开发团队中有这样几个分支,master、develop、feature、release、 bug、other分支,或者你还有其它分支,那有博友会问了,你讲了那么多分支,都在本地放着我们怎么查看和推送分支到远程服务器上呢?嘿嘿,我们说大 家别急我们在这一章节中就来重点讲解,在团队多人协作中的分支推送与抓取。

1).查看远程仓库分支

查看远程仓库的信息,如下图:

大家可以看到git remote命令可以查看远程仓库,加-v选项可以查看详细信息。上面显示了你抓取和推送的origin(源)信息。 当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且远程仓库的默认名称是origin。

2).分支推送

下面我们来演示一下将本地分支推送到远程的仓库中,如下图:

大家可以看到,我们的本地master分支与远程的master分支已同步。下面我们来演示一下同步dev分支,如下图:

有博友会问了,我本地有很多分支,有哪些分支需要推送到远程仓库中呢?一般是这样的,

  • master 分支是主分支,要时刻与远程同步,一般我们发布最新版本就用master分支
  • develop 分支是开发分支,团队中所有人都在这个分支上开发,所以也需要与远程同步
  • bug 分支一般只在本地使用来修复bug,一般不需推送远程仓库中
  • feature 分支是否需要推送到远程,要看是不是有几个人合作开发新功能,如果你是一个开发,那就留在本地吧
  • release 分支一般是系统管理,推送或抓取的分支一般与开发人员无关
  • other 分支大家按需求分配

3).分支抓取

现在你一同事在电脑上克隆一份仓库,我们来演示一下。

生成公钥:

将生成的公司增加到git服务器上:

克隆远程版本库:

我们现在查看一下分支:

你同事要在dev分支上开发,就得创建与远程origin一样的dev分支到本地的仓库上,下面我们来创建一下:

现在你同事就可以在dev分支上开发了,下面我们新建一些文件并提交到远程dev分支:

你的同事向origin/dev分支提交了一个index.html页面,现在你也在修改这个文件,并提交:

推送失败,因为你同事的最新提交和你推送的提交有冲突,Git提示我们,先用git pull把最新的提交从origin/dev抓下来,然后在本地合并解决冲突,再推送:

git pull 失败了,原因是没有将dev分支与远程origin/dev分支进行链接,Git提示我们设置dev和origin/dev的链接:

下面我们再来git pull一下试试:

git pull 成功,但是合并有冲突需要手动解决,解决的方法和分支管理中的解决冲突完全一样。解决后提再push:

好了,这样的我们的远程推送与抓取就讲解完成了,下面我们来总结一下。

10.总结

一般在团队中多人开发模式是这样的:首先,可以试图用git push origin branch-name推送自己的修改如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并如果合并有冲突,则解决冲突,并在本地提交没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。

好了,到这里我们的Git分支管理就讲解到这里了。最后,希望大家有所收获^_^……

本文出自 “Share your knowledge …” 博客,http://freeloda.blog.51cto.com/2033581/1417525

多人开发 Git 分支管理详解相关推荐

  1. Git学习总结(12)——多人开发 Git 分支管理详解

    1.前言 在上一篇博客中我们主要讲解了Git 远程仓库,相信大家对远程的Git仓库有一定的了解,嘿嘿.在这一篇博客中我们来在大家讲解一下Git 分支管理,这可以说是Git的又一大特点.下面我们就来学习 ...

  2. git分支branch详解

    上一篇git的基本原理http://blog.csdn.net/xiaoputao0903/article/details/23912561,介绍了git最基本的原理和相关操作,这篇就来讲讲git的分 ...

  3. git 分支branch详解

    git看到分支的时候发现这篇文章,讲比较详细. 原文地址:https://blog.csdn.net/xiaoputao0903/article/details/23933589 1.git的分支是什 ...

  4. Git学习系列(五)分支管理详解

    分支管理在咱们实际工作中经常用到,因此掌握分支对于咱们从事移动开发并且使用到了Git这样的分布式版本管理工具来说是很有必要的.比如当你饿了的时候,甲帮你做饭,一帮你烧菜: 当然你也可以自己做饭烧菜.但 ...

  5. 软件测试 | 测试开发 | Git分支管理搞定在线合并和本地合并

    似于SVN这种集中式版本管理,三年前刚来上海工作时候,在华为驻场上班,华为用的就是SVN,印象最深的就是那个小乌龟的图标:后来到外面工作,渐渐发现用Git的非常多,慢慢学习了解发现Git这种分布式的版 ...

  6. Git学习系列(七)Bug和Feature分支管理详解

    当咱们拿到一个新的bug或者feature(功能)时,首先应该想到通过分支来完成咱们的任务.因为在软件开发中,总是会根据客户的需求不断的添加新的feature进来,同时在做移动开发过程中bug也可以说 ...

  7. 开发环境、测试环境、生产环境、UAT环境、仿真环境,分支管理详解

    开发环境(DEV):开发环境是程序猿们专门用于开发的服务器,配置可以比较随意, 为了开发调试方便,一般打开全部错误报告. 测试环境(UAT):一般是克隆一份生产环境的配置,一个程序在测试环境工作不正常 ...

  8. Git实战:branch分支操作详解

    什么是分支 分支是指在主干道上分支的支线,可以前往不同的地方,也可以到达相同的终点(只是实现的路线不同).Git指向团队开发中的个体,各开发者可以有自己的分支,开发时不会影响其他分支的开发进度.分支完 ...

  9. Shiro权限管理详解(授权和注解开发)【面试点】

    Shiro权限管理详解 1. 权限管理 1.1什么是权限管理 1.2用户身份认证 1.2.1 概念 1.2.2 用户名密码身份认证流程 1.2.3 关键对象 1.3 授权 1.3.1 概念 1.3.2 ...

最新文章

  1. springmvc 将post转换为delete,put
  2. 过去的一年,我在读研
  3. 疲劳、垃圾邮件、备份缺失,拖垮了GitLab.com
  4. 配置ADO.NET类文件连接优化
  5. 全自动洗衣机维修教程
  6. 描述一下Spring Bean 的生命周期
  7. MonoRail学习-介绍篇(一)
  8. 移动终端CPU、GPU浅析
  9. Docker 基本操作
  10. spring-第十二篇之两种后处理器
  11. Linux查看端口占用进程
  12. 数论1.0 数论基础
  13. 【解决】updateAppMessageShareData:fail, the permission value is offline verifying
  14. 包包各部位名称图解_手袋包细节详解
  15. Python中的函数(二)--提高篇
  16. c# Stack源码解析
  17. 【python脚本系列】gif录制png序列帧
  18. 文件上传绕waf(waf拦不住我)
  19. 计算机信息管理存在的问题与对策,全面信息化管理系统问题及对策(word版)...
  20. mac彻底卸载idea

热门文章

  1. 微信生态下的营销洞察报告 附下载地址
  2. 一款超好用的 Redis 可视化管理工具
  3. 关于如何用程序实现重启路由器!!!!!
  4. 贩妖记 第七十三章,只是,不虚伪
  5. XShell免费版的安装配置教程
  6. INTERSPEECH2023|达摩院语音实验室入选论文全况速览
  7. python怎么进行数据库增加_python中的数据库增加等操作
  8. EAS 分录增加按钮(左侧)
  9. 计算机组成原理 mips指令,计算机组成原理--MIPS指令的表示
  10. 微信开发大坑汇总之微信语音篇