一、关于Git与Subversion的区别

二、目前我们用Subversion是怎么执行软件过程的

三、优势与缺点

  1. 架构
* Git:分布式,所有的teammates本地可以clone一份独立完整的仓库,而不仅仅是某一个版本的镜像拷贝;
开发者可以在本地clone仓库中完成所有vcs的操作,只有当需要协同工作提交代码到远程仓库的时候,才需要联上网络。 * Subversion:中央集中式,所有的teammates都面向同样一个远程仓库工作;
checkout出来的本地工作区代码只是远程仓库某一版本的一份镜像拷贝
  1. 仓库结构与URL
* Git:对于Git而言,仓库会独立于开发者的本地磁盘中,在仓库的根目录中只包含了一个”.git”文件夹,
所有的branches、trunk(PS:git中名称为master)、tags均是通过命令操作而生成的,并非通过URL路径。
在Git中,URL类似于ssh://git@example.com/path/to/git-repo.git,仅仅是指向了仓库的一个标识。 * Subversion:分支的url类似于svn+ssh://svn@example.com/svn/trunk,每一个分支独占一个唯一URL,
每一个URL都会直接定位到每一个分支在远程仓库中的路径位置。 对于Subversion,会有一个trunk分支作为开发主线分支,
会有很多branches分支作为并行分支,tags则是mark上某一特定的发布版本。
  1. 分支管理
* Git:Git分支相对于其他的vcs是非常不一样的设计理念,一个Git分支仅仅指的是指向某一确定版本的简单指针,
因此,Git的分支是无拷贝、无新建目录、几乎无开销的。 * Subversion:正如我们所知道的,SVN中的分支仅仅是项目的一份拷贝,是一个具有特殊含义的普通文件夹;
多分支则是多文件夹的形式。
  1. 提交操作
* Git:若你使用的是Git,你的提交操作不受网络的影响,你的提交仅仅影响了本地仓库,仅当你需要于远端仓库同步内容之时,
才需要使用到网络; 另外的,在你本地仓库还存在一个so-called Staging Area,并非你的所有文件需要在一次提交中全部commit,
你可以选择指定的变更放入staging area中,从而在本次提交中仅仅包含你所选定的变更条目;
关于Git的版本号,大家都知道,Git是分布式的vcs,要想和svn、cvs一般生成revision#5,
revision#6类似的递增数值作为唯一版本号是不可取的,但是我们也同样需要一个唯一的标识来辨别每一次提交,
而Git的做法是使用了”commit hashes”。 * Subversion:当你使用的是SVN,假设你要提交代码,以下是你的提交过程: * 首先设备必须是联网的,可以与远端中央仓库建立连接; * 将提交的内容立即传输到远端中央仓库; * 远端中央仓库生成递增的版本号,并赋予本地分支。
  1. 协同工作
* Git:若你使用的是Git,你需要决定何时将你的本地仓库的内容同步上传到远端仓库分享出来,
而Git不会为你作任何的自动上传的操作; 这样子的分享过程相对于其他的中央仓库式的vcs系统来说是更加安全的,
所发生的冲突也只会发生于你的本地(仓库)而非远端服务器的仓库,这将更能帮助你规避打乱teammates工作内容冲突的风险。 * Subversion:当你将本地分支内容作commit操作之时,你的内容便会分享到远端中央仓库中,
其他teammates也都能同步到你所提交的内容。

四、集成工具简介

  1. SourceTree:开源的Git源代码管理工具

  2. TortoiseGit:开源的Git源代码管理工具

  3. EGit:Eclipse插件,最新Mars版本已经自带

  4. Gitflow Nightly:Eclipse插件,支持Git-Flow

五、常用Git基础知识

认识Git的几个关键目录

  • Working directory:工作区

  • Index directory:暂存区

  • Local repository:本地仓库

  • Remote repository:远端仓库

常用的Git操作

  1. clone:克隆项目到本地工作区,类似svn checkout

  2. checkout:创建/切换本地仓库的指定分支到工作区中

  3. commit:将本地工作区代码提交到本地仓库

  4. push:将本地仓库代码同步到远端仓库

  5. pull / fetch:将远端仓库的代码同步到本地仓库/工作区

* pull:fetch + merge,该操作会影响工作区

* fetch:从远端仓库获取并更新到本地仓库中,不影响工作区
  1. merge / rebase:从指定分支(PS:分支名称常跟在命令之后)中获取更新并合并到当前分支
* merge:

* rebase:
  1. stash:备份/唤出当前的现场状态(包含工作区和暂存区)
* git stash [save -a “msg”] 备份当前的现场状态

* git stash list 显示已保存的现场状态列表

* git stash pop/apply [--index][<stash>] 恢复工作状态,若不含带参数,则从状态栈中获取最新的。
pop在获取完成后,从栈中移除该状态,apply则不会从栈中移除 * git stash clear 清空状态栈中的所有内容 * git drop 删除状态栈中的指定状态

六、可供参考的高阶应用方案

什么是Git-SVN的扩展开发模式,即本地开发应用Git的强大分支特性,当最终push操作的时候,目标仓库设定为SVN远端仓库。这里点到为止,只提及一下,以便有既想使用Git又纠结无法脱离Subversion的开发者去使用,这确实是一种很赞的“曲线救国”方案。什么是Git Stash的开发模式,即一个工程师可以并行开发多项内容,要求用到切换分支的操作,而在没有提交到本地仓库之前,可以使用git stash命令将当前分支的工作区和暂存区的状态镜像下来。当回过头来需要继续开发的时候,使用git stash pop将指定的状态唤出后,可以继续未完成的内容。

七、Git-Flow介绍

一图胜过千言万语

关键几个分支的概念全解

  • 主分支

    • branch:保存当前开发成果的分支

    • master:保存当前可供生产部署的代码,在每次发布之时推荐为每次新增发布的代码都打上一个TAG,供后续代码维护使用

  • 辅助分支

    • Feature:开发完整功能、新特性,从develop分支发起的分支

    • Release:用于发布新的产品版本而设计的,支持从develop分支派生

    • Hotfix:属于计划外创建的可供生产部署的代码分支,普遍场景是软件遇到了异常情况或发生了严重必须要立即修复的缺陷之时。支持从master分支(或者其中的某一个TAG版本)中派生出来

  • 分支命名惯例

    • Feature分支:feature-*

    • Release分支:release-*

    • Hotfix分支:hotfix-*

八、GitHub Flow

九、Mike Flow (Base on 《Git in Practice》)

Single Pattern

Multiple Pattern

十、Jerome Flow (I call it this name^_^)

  • Version 1: 该版本适合于团队成员较小,各个泳道分支规范制定严格的项目。

  • Version 2:适合于多环境分支、多团队协作的项目,没有太多的规范约束,将最大的自由度释放给开发者们。

http://aboutcoder.com/2015/11/16/work-in-git/

参考资料

Git 软件开发过程的更多相关文章

  1. Atitit各种SDM 软件开发过程SDP sdm的ddd tdd bdd设计

    Atitit各种SDM 软件开发过程SDP sdm的ddd tdd bdd设计 1.1. software development methodology (also known as SDM 1 1 ...

  2. 【转】UML图与软件开发过程那点关系

    首先,软工文档, 软工文档,也就是计划,设计,描述,使用软件的一些文件,它最大的特点就是固定不变,用来给不同的人和计算机来阅读.在期间,文档起到了桥梁的作用,看这张图很形象: 在这里在看一下国家统一规 ...

  3. 软件开发过程中的审查 (Review)

    http://blog.csdn.net/horkychen/article/details/5035769 软件开发过程中的审查 (Review)   希望别人做些什么->定义出流程 希望别人 ...

  4. 软件开发过程文档-cgaowei

    鸡肋——食之无味,弃之可惜”,软件开发过程文档遭遇了鸡肋一样的境遇. 目前敏捷软件开发过程非常流行.相对于软件开发过程文档,敏捷软件开发过程更加重视可运行的程序.关于软件开发过程文档,两个极端都是不可 ...

  5. [转]软件开发过程(CMMI/RUP/XP/MSF)是与非?

    经常看到和听到大家在争论敏捷过程.RUP和CMM 哪个软件开发过程更好或者哪个过程不好,各自都有理由.争论得不亦乐乎......实际上,没有十全十美的过程,也不存在更好的过程.关键是什么样的过程适合自 ...

  6. 个人阅读作业2:结合《No Silver Bullet》谈谈我在软件开发过程的遇到的困难与体会

    英文捉急,只能挑一段看得比较懂的,而且正好和我们现在编程任务联系比较紧密的内容来谈一谈体会. 在<No Silver Bullet>中,作者描述了造成软件本质性困难(essence)的四个 ...

  7. 在统一软件开发过程中使用UML

    如何在统一软件开发过程中使用UML? 起始阶段常用UML图 在起始阶段,通常有用例图.类图.活动图.顺序图等UML图的参与. 获取用户需求之后首先要将这些需求转化为系统的顶层用例图. 在确定了用例之后 ...

  8. UML图与软件开发过程那点关系

    首先,软工文档, 软工文档,也就是计划,设计,描述,使用软件的一些文件,它最大的特点就是固定不变,用来给不同的人和计算机来阅读.在期间,文档起到了桥梁的作用,看这张图很形象: 在这里在看一下国家统一规 ...

  9. RUP---统一软件开发过程

    更详细的见:http://www.ibm.com/developerworks/cn/rational/r-rupbp/ 本文引用:http://baike.baidu.com/view/223583 ...

随机推荐

  1. UVALive-2531 The K-League (最大流建模+枚举)

    题目大意:有n支足球队,已知每支球队的已胜场数和任意两支球队之间还需要的比赛场数a[i][j],求最终可能夺冠的所有球队. 题目分析:枚举所有的球队,对于球队 i 让它在接下来的比赛中全部获胜,如果这 ...

  2. IOS UI-标签(Label)的高级应用

    // // BWLabel.h // IOS_0119_label // // Created by ma c on 16/1/19. // Copyright © 2016年 博文科技. All r ...

  3. POJ 2689 筛法求素数

    DES:给出一个区间[L, U].找出这个区间内相邻的距离最近的两个素数和距离最远的两个素数.其中1<=L<U<=2147483647 区间长度不超过1000000. 思路:因为给出 ...

  4. c primer plus 5 读书笔记1

    C语言是一种融合了控制特性的语言,是一种快速.高效.紧凑.可移植性的语言. 使用C语言的7个步骤:定义程序目标.设计程序.编写代码.编译程序.运行程序.测试和调试程序.维护和修改程序. c程序是由一个 ...

  5. 如何处理HTML5新标签的兼容性问题

    支持HTML5新标签: * IE8/IE7/IE6支持通过document.createElement方法产生的标签, 可以利用这一特性让这些浏览器支持HTML5新标签, 浏览器支持新标签后,还需要添 ...

  6. PostgreSQL常用插件收集

    hexdump -C 数据表文件 -- 查看表文件中数据. pg_stat_statements pgcompacttable -- 在减少锁的情况下,清理表和索引的老空间. pg_repack--P ...

  7. CS231n课程笔记翻译7:神经网络笔记 part2

    译者注:本文智能单元首发,译自斯坦福CS231n课程笔记Neural Nets notes 2,课程教师Andrej Karpathy授权翻译.本篇教程由杜客翻译完成,堃堃进行校对修改.译文含公式和代 ...

  8. HDU 2485

    http://acm.hdu.edu.cn/showproblem.php?pid=2485 n个车站,m条边,两边之间费用为1,问最少摧毁多少车站,使得1-n无法在k时间内到达 将2-(n-1)每个 ...

  9. 第10课 struct和union分析

    struct的小秘密:空结构体占多大内存呢? 直观的答案有两种: 1.空结构体的大小为0 2.结构体本来就是为了将不同的变量集合在一起使用的,定义空结构体会导致编译错误 实例分析: #include ...

  10. JS查找孩子节点

    以前看了JS方面的书,如今用到了,书看得再多,不用就忘了,所以经常用用你所学到的知识,温故知新. <!DOCTYPE html> <html> <head> < ...