用了一段时间github,一直想用时间来对git的使用来做一段笔记,前段时间比较忙,现在沉下心来学习也是极好的。

很多项目开发会采用git这一优秀的分布式版本管理工具来进行项目版本管理。因为git的使用非常灵活,所以在实际操作中会有许多不同的工作流程。不同团队对于不同项目会有不同的协作方式。掌握git版本管理开发,对以后的学习和开发都有很多好处。

首先基本名词要懂:

仓库(Repository)、分支(branch)、工作流(workflow)

1. 仓库(Repository)

在项目的开始到结束,我们会有两种仓库。一种是源仓库(origin),一种是开发者仓库。

源仓库(origin)的有两个作用:

  • 汇总参与该项目的各个开发者的代码

  • 存放趋于稳定和可发布的代码

源仓库应该是受保护的,开发者不应该直接对其进行开发工作。只有项目管理者(通常是项目发起人)能对其进行较高权限的操作。

开发者仓库:

任何开发者都不会对源仓库进行直接的操作,源仓库建立以后,每个开发者需要做的事情就是把源仓库的“复制”一份,作为自己日常开发的仓库。这个复制,也就是github上面的fork。

每个开发者所fork的仓库是完全独立的,互不干扰,甚至与源仓库都无关。  每个开发者仓库相当于一个源仓库实体的影像,  开发者在这个影像中进行编码, 提交到自己的仓库中,这样就可以轻易地实现团队成员之间的并行开发工作。  而开发工作完成以后,   开发者可以向源仓库发送pull request,请求管理员把自己的代码合并到源仓库中,这样就实现了分布式开发工作,和最后的集中式的管理。

2. 分支(branch) 

在git中,分支操作则是每个开发人员日常工作流。利用git的分支,可以非常方便地进行开发和测试。

我们为git定下一种分支模型,在这种模型中,分支有两类,五种:

  • 永久性分支

    • master branch:主分支

    • develop branch:开发分支

  • 临时性分支

    • feature branch:功能分支

    • release branch:预发布分支

    • hotfix branch:bug修复分支

master:主分支从项目一开始便存在,它用于存放经过测试,已经完全稳定代码;在项目开发以后的任何时刻当中,master存放的代码应该是可作为产品供用户使用的代码。每一次master更新的时候都应该用git打上tag,说明你的产品有新版本发布了。

develop:开发分支,一开始从master分支中分离出来,用于开发者存放基本稳定代码。开发者把功能做好以后,是存放到自己的develop中,当测试完以后,可以向管理者发起一个pull request,请求把自己仓库的develop分支合并到源仓库的develop中。

归纳:所有开发者开发好的功能会在源仓库的develop分支中进行汇总,当develop中的代码经过不断的测试,已经逐渐趋于稳定了,接近产品目标了。这时候,我们就可以把develop分支合并到master分支中,发布一个新版本。

 

feature:功能性分支,是用于开发项目的功能的分支,是开发者主要战斗阵地。开发者在本地仓库从develop分支分出功能分支,在该分支上进行功能的开发,开发完成以后再合并到develop分支上,这时候功能性分支已经完成任务,可以删除。功能性分支的命名一般为feature-*,*为需要开发的功能的名称。

release:预发布分支,当产品即将发布的时候,要进行最后的调整和测试,这时候就可以分出一个预发布分支,进行最后的bug fix。测试完全以后,发布新版本,就可以把预发布分支删除。预发布分支一般命名为release-*。

hotfix:修复bug分支,当产品已经发布了,突然出现了重大的bug。这时候就要新建一个hotfix分支,继续紧急的bug修复工作,当bug修复完以后,把该分支合并到master和develop以后,就可以把该分支删除。修复bug分支命名一般为hotfix-*。

示范:举一个例子,A正在做一个团队项目,已经把源仓库fork了,并且clone到了本地。现在要开发网站的某个功能。A在本地仓库中可以这样做:

  1. 切换到develop分支 :>>> git checkout develop

  2. 分出一个功能性分支: >>> git checkout -b feature-discuss

  3. 在功能性分支上进行开发工作,多次commit,测试以后...

  4. 把做好的功能合并到develop中:

    >>> git checkout develop    # 回到develop分支

    >>> git merge--no-ff feature-discuss# 把做好的功能合并到develop中

    >>> git branch -d feature-discuss    # 删除功能性分支

    >>> git push origin develop    # 把develop提交到自己的远程仓库中

3. 工作流(workflow)

    1) 源仓库的构建,创建一个项目,初始化了两个永久性分支master和develop.

    2) 开发者fork源仓库

    3) 把自己开发者仓库clone到本地,命令:git clone

    4) 构建功能分支进行开发,完成后合并到自己的develop分支。

进入仓库中,按照前面说所的构建功能分支的步骤,构建功能分支进行开发、合并,假设我现在要开发一个“讨论”功能:

  >>> git checkout develop    # 切换到`develop`分支

  >>> git checkout -b feature-discuss    # 分出一个功能性分支

  >> touch discuss.js    # 假装discuss.js就是我们要开发的功能

  >> git add .

  >> git commit -m 'finish discuss feature'# 提交更改

  >>> git checkout develop    # 回到develop分支

  >>> git merge--no-ff feature-discuss# 把做好的功能合并到develop中

  >>> git branch -d feature-discuss    # 删除功能性分支

  >>> git push origin develop    # 把develop提交到自己的远程仓库中

  5) 向管理员提交pull request。经过测试以后,觉得没问题,就可以请求管理员把自己仓库的develop分支合并到源仓库的develop分支中,这就是传说中的pull request。

    6) 管理员测试、合并

         1) 对代码进行review,github提供非常强大的代码review功能

         2) 在本地测试新建一个测试分支,测试pull request的代码

         >> git checkout develop    # 进入本地的develop分支

>> git checkout -b livoras-develop

# 从develop分支中分出一个叫livoras-develop的测试分支测试pull request代码

>> git pull https://github.com/livoras/git-demo.git develop

# 把pull request的代码pull到测试分支中,进行测试

         3) 判断是否同意合并到源仓库的develop中,如果经过测试没问题,可以把我的代码合并到源仓库的develop中:

>> git checkout develop

>> git merge--no-ff livoras-develop

>> git push origin develop

使用Git进行协同开发的更多相关文章

  1. 用Git进行协同开发

    用Git进行协同开发 问题场景描述 常常会遇到这样的协同场景:后台的同事和前端的同事需要共同开发一个新功能,而他们的代码相互依赖,所以需要不停地更新各自的代码进行联调. 对于这种场景,最简单的方式就是 ...

  2. Git项目协同开发学习笔记2:项目库开发协作相关命令

    之前介绍了如何用git构建项目库及其后续操作的问题,但主要还是个人的操作问题,不太涉及到项目协作方面的问题,所以来说下这块.传送门在这里(后面的可以不用看了). 1.同步 首先就式同步问题:在项目协作 ...

  3. Git 之 协同开发

    GitHub中多人协同开发和单人开发还是有点差别,协同开发一般有两种方式: 合作者,将其他用户添加到仓库合作者中之后,该用户就具有向当前仓库提交代码. 组织,创建一个组织,然后再该组织下可以创建多个项 ...

  4. Git之协同开发

    Github之协同开发 一.协同开发 1.引子:假如三个人共同开发同一份代码,每个人都各自安排了任务,当每个人都完成了一半的时候,提交不提交呢? 要提交,提交到dev吗,都上传了一半,这样回家拿出来的 ...

  5. Git项目协同开发学习笔记1:项目库开发基础git命令

    这年头git基本都是项目开发的标配,之前刚好碰到了就花了两天时间系统学习了下.本文内容基本来自以下tutorial:Learn Git(建议直接去看原文,因为这个网站是有更新的).这个是我看过对git ...

  6. 【转】Android Studio中Git的配置及协同开发

    一. Android Stutio配置git   setting–>Version Control–>Git–>Path to Git executable中选择git.exe的位置 ...

  7. Android Studio中Git的配置及协同开发

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51595096 本文出自:[openXu的博客] 目录: 一 Android Stutio配置 ...

  8. git 入门教程之协同开发

    前面我们已经介绍过远程仓库的相关概念,不过那时并没有深入探讨,只是讲解了如何创建远程仓库以及推送最新工作成果到远程仓库,实际上远程仓库对于团队协同开发很重要,不仅仅是团队协同开发的基础,也是代码备份的 ...

  9. 使用git和github进行协同开发流程

    (本文假设各位已经对基本git的基本概念.操作有一定的理解,如无相关git知识,可以参考Pro Git这本书进行相关的学习和练习) 很多项目开发都会采用git这一优秀的分布式版本管理工具进行项目版本管 ...

随机推荐

  1. 设计模式(12)--Proxy(代理模式)--结构型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. ...

  2. 鼠标悬浮控制元素隐藏与显示 - css中鼠标的hover状态

    需求:当鼠标移动到一个元素A身上时,另外一个元素B显示. 实现原理: A元素与B元素有一个相同的父级. B元素默认隐藏,A元素默认显示. 当鼠标移动到A元素身上时,也可以看做是移动到了A元素的父级身上 ...

  3. 安装ArcGIS Enterprise WebGIS (Portal ArcGIS Server DataStore ) 系统后如何应对网络环境的配置修改

    客户往往在部署完ArcGIS WebGIS系统后,由于需要满足业务或者网络管理的要求,需要修改系统的网络环境的配置,下文将从常见的几个场景来讲述如何去应对这些变动. 1.网络IP地址变动 由于在部署W ...

  4. php api 接口输出json 数据

    页面调用接口,简单写个api 试试 如下 <?php $arr = array( array('url'=>'https://baidu.com'), array('map'=>'h ...

  5. 学习笔记(4)——实验室集群管理结点IP配置

    经过验证,集群管理结点mgt的IP配置应为如下所示: [root@mgt zmq]# ifconfig//外部网卡 eth0 Link encap:Ethernet HWaddr 5C:F3:FC:E ...

  6. 《Javascript权威指南-第6版》

    第3章 类型.值和变量 3.2 文本 3.2.1 字符串直接量 建议:在javascript中使用单引号表示字符串,在HTML中使用双引号表示字符串; 3.2.2 转义字符 \n 换行符 \r 回车符 ...

  7. MySQL 性能监控4大指标——第二部分

    [编者按]本文作者为 John Matson,主要介绍 mysql 性能监控应该关注的4大指标. 第一部分介绍了前两个指标:查询吞吐量与查询执行性能.本文将继续介绍另两个指标:MySQL 连接与缓冲池 ...

  8. pycharm的常用快捷键

      使用pycharm写代码时,如果有错误,一般代码右边会有红色标记.   1,写代码时忘记导入模块,可以使用快捷键 Alt + Enter 自动导入模块.() 再倒入模块之前,需要现在pycharm ...

  9. Azure Resource Manager 概述

    应用程序的基础结构通常由许多组件构成:可能有虚拟机.存储帐户和虚拟网络,或 Web 应用.数据库.数据库服务器和第三方服务. 这些组件不会以独立的实体出现,而是以单个实体的相关部件和依赖部件出现. 如 ...

  10. SQL Server中数据库文件的存放方式,文件和文件组 (转载)

    简介 在SQL SERVER中,数据库在硬盘上的存储方式和普通文件在Windows中的存储方式没有什么不同,仅仅是几个文件而已.SQL SERVER通过管理逻辑上的文件组的方式来管理文件.理解文件和文 ...