Git 软件开发过程
一、关于Git与Subversion的区别

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

三、优势与缺点
- 架构
* Git:分布式,所有的teammates本地可以clone一份独立完整的仓库,而不仅仅是某一个版本的镜像拷贝;
开发者可以在本地clone仓库中完成所有vcs的操作,只有当需要协同工作提交代码到远程仓库的时候,才需要联上网络。
* Subversion:中央集中式,所有的teammates都面向同样一个远程仓库工作;
checkout出来的本地工作区代码只是远程仓库某一版本的一份镜像拷贝。
- 仓库结构与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上某一特定的发布版本。
- 分支管理
* Git:Git分支相对于其他的vcs是非常不一样的设计理念,一个Git分支仅仅指的是指向某一确定版本的简单指针,
因此,Git的分支是无拷贝、无新建目录、几乎无开销的。
* Subversion:正如我们所知道的,SVN中的分支仅仅是项目的一份拷贝,是一个具有特殊含义的普通文件夹;
多分支则是多文件夹的形式。
- 提交操作
* Git:若你使用的是Git,你的提交操作不受网络的影响,你的提交仅仅影响了本地仓库,仅当你需要于远端仓库同步内容之时,
才需要使用到网络; 另外的,在你本地仓库还存在一个so-called Staging Area,并非你的所有文件需要在一次提交中全部commit,
你可以选择指定的变更放入staging area中,从而在本次提交中仅仅包含你所选定的变更条目;
关于Git的版本号,大家都知道,Git是分布式的vcs,要想和svn、cvs一般生成revision#5,
revision#6类似的递增数值作为唯一版本号是不可取的,但是我们也同样需要一个唯一的标识来辨别每一次提交,
而Git的做法是使用了”commit hashes”。
* Subversion:当你使用的是SVN,假设你要提交代码,以下是你的提交过程:
* 首先设备必须是联网的,可以与远端中央仓库建立连接;
* 将提交的内容立即传输到远端中央仓库;
* 远端中央仓库生成递增的版本号,并赋予本地分支。
- 协同工作
* Git:若你使用的是Git,你需要决定何时将你的本地仓库的内容同步上传到远端仓库分享出来,
而Git不会为你作任何的自动上传的操作; 这样子的分享过程相对于其他的中央仓库式的vcs系统来说是更加安全的,
所发生的冲突也只会发生于你的本地(仓库)而非远端服务器的仓库,这将更能帮助你规避打乱teammates工作内容冲突的风险。
* Subversion:当你将本地分支内容作commit操作之时,你的内容便会分享到远端中央仓库中,
其他teammates也都能同步到你所提交的内容。
四、集成工具简介
SourceTree:开源的Git源代码管理工具
TortoiseGit:开源的Git源代码管理工具
EGit:Eclipse插件,最新Mars版本已经自带
Gitflow Nightly:Eclipse插件,支持Git-Flow
五、常用Git基础知识
认识Git的几个关键目录

Working directory:工作区
Index directory:暂存区
Local repository:本地仓库
Remote repository:远端仓库
常用的Git操作

clone:克隆项目到本地工作区,类似svn checkout
checkout:创建/切换本地仓库的指定分支到工作区中
commit:将本地工作区代码提交到本地仓库
push:将本地仓库代码同步到远端仓库
pull / fetch:将远端仓库的代码同步到本地仓库/工作区
* pull:fetch + merge,该操作会影响工作区
* fetch:从远端仓库获取并更新到本地仓库中,不影响工作区
- merge / rebase:从指定分支(PS:分支名称常跟在命令之后)中获取更新并合并到当前分支
* merge:
* rebase:
- 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 软件开发过程的更多相关文章
- 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 ...
- 【转】UML图与软件开发过程那点关系
首先,软工文档, 软工文档,也就是计划,设计,描述,使用软件的一些文件,它最大的特点就是固定不变,用来给不同的人和计算机来阅读.在期间,文档起到了桥梁的作用,看这张图很形象: 在这里在看一下国家统一规 ...
- 软件开发过程中的审查 (Review)
http://blog.csdn.net/horkychen/article/details/5035769 软件开发过程中的审查 (Review) 希望别人做些什么->定义出流程 希望别人 ...
- 软件开发过程文档-cgaowei
鸡肋——食之无味,弃之可惜”,软件开发过程文档遭遇了鸡肋一样的境遇. 目前敏捷软件开发过程非常流行.相对于软件开发过程文档,敏捷软件开发过程更加重视可运行的程序.关于软件开发过程文档,两个极端都是不可 ...
- [转]软件开发过程(CMMI/RUP/XP/MSF)是与非?
经常看到和听到大家在争论敏捷过程.RUP和CMM 哪个软件开发过程更好或者哪个过程不好,各自都有理由.争论得不亦乐乎......实际上,没有十全十美的过程,也不存在更好的过程.关键是什么样的过程适合自 ...
- 个人阅读作业2:结合《No Silver Bullet》谈谈我在软件开发过程的遇到的困难与体会
英文捉急,只能挑一段看得比较懂的,而且正好和我们现在编程任务联系比较紧密的内容来谈一谈体会. 在<No Silver Bullet>中,作者描述了造成软件本质性困难(essence)的四个 ...
- 在统一软件开发过程中使用UML
如何在统一软件开发过程中使用UML? 起始阶段常用UML图 在起始阶段,通常有用例图.类图.活动图.顺序图等UML图的参与. 获取用户需求之后首先要将这些需求转化为系统的顶层用例图. 在确定了用例之后 ...
- UML图与软件开发过程那点关系
首先,软工文档, 软工文档,也就是计划,设计,描述,使用软件的一些文件,它最大的特点就是固定不变,用来给不同的人和计算机来阅读.在期间,文档起到了桥梁的作用,看这张图很形象: 在这里在看一下国家统一规 ...
- RUP---统一软件开发过程
更详细的见:http://www.ibm.com/developerworks/cn/rational/r-rupbp/ 本文引用:http://baike.baidu.com/view/223583 ...
随机推荐
- 通读cheerio API-网络爬虫
所谓工欲善其事,必先利其器,所以通读了cheerio的API,顺便翻译了一遍,有些地方因为知道的比较少,不知道什么意思,保留了英文,希望各位不吝告诉我,然后一起把这个翻译完成. ###cheerio ...
- 安装MySQL后要做的事
安装MySQL后要修改的配置 [mysql] default-character-set=utf8 [mysqld] # 关闭域名反解 skip_name_resolve # 每表一个独立的表空间文件 ...
- sgu 147. Black-white king 思路 坑 难度:1
147. Black-white king time limit per test: 0.25 sec.memory limit per test: 4096 KB input: standard i ...
- C# #if, #else和#endif预处理指令
#if 使您可以开始条件指令,测试一个或多个符号以查看它们是否计算为 true.如果它们的计算结果确实为true,则编译器将计算位于 #if 与最近的 #endif 指令之间的所有代码.例如, ...
- webpack 提升90%的构建速度 HardSourceWebpackPlugin
HardSourceWebpackPlugin 插件 不能提升第一次构建的速度,但对于第二次构建能提升99%的构建速度 第一次构建: 第二次: 提升了..,算不出来,反正就是很多啦~~~ npm in ...
- CH3401 石头游戏
题意 3401 石头游戏 0x30「数学知识」例题 描述 石头游戏在一个 n 行 m 列 (1≤n,m≤8) 的网格上进行,每个格子对应一种操作序列,操作序列至多有10种,分别用0~9这10个数字指明 ...
- python 保存文件时候, 去除名字中的非法字符
import re def validateTitle(title): rstr = r"[\/\\\:\*\?\"\<\>\|]" # '/ \ : * ? ...
- 华为OJ:2199 推断输入字符串中的括号匹配
依据不同的括号有个计数器.在遍历时.当计数器小于0则返回false或者当遍历完后,计数器仍旧不为零,也返回false. import java.util.Scanner; public class b ...
- postgres 使用存储过程批量插入数据
參考资料(pl/pgsql 官方文档): http://www.postgresql.org/docs/9.3/static/plpgsql.html create or replace functi ...
- IT项目管理的十六个字心得体会
目标驱动,系统思维,风险意识,数据量化 凡事预则立,不预则废.如果你不知道要到哪里?给你一张地图也没有用.目标驱动首先要有最基本的计划管理和时间管理能力.对于一个项目,我们过程中做的所有工作都是为了要 ...