Git版本控制与工作流
基本概念
Git是什么?
Git是分布式版本控制系统,与SVN类似的集中化版本控制系统相比,集中化版本控制系统虽然能够令多个团队成员一起协作开发,但有时如果中央服务器宕机的话,谁也无法在宕机期间提交更新和协同开发。甚至有时,中央服务器磁盘故障,恰巧又没有做备份或备份没及时,那就可能有丢失数据的风险。
但Git是分布式的版本控制系统,客户端不只是提取最新版本的快照,而且将整个代码仓库镜像复制下来。如果任何协同工作用的服务器发生故障了,也可以用任何一个代码仓库来恢复。而且在协作服务器宕机期间,你也可以提交代码到本地仓库,当协作服务器正常工作后,你再将本地仓库同步到远程仓库。
为什么要使用Git
- 能够对文件版本控制和多人协作开发
- 拥有强大的分支特性,所以能够灵活地以不同的工作流协同开发
- 分布式版本控制系统,即使协作服务器宕机,也能继续提交代码或文件到本地仓库,当协作服务器恢复正常工作时,再将本地仓库同步到远程仓库。
- 当团队中某个成员完成某个功能时,通过pull request操作来通知其他团队成员,其他团队成员能够review code后再合并代码。
- 文件三种状态(modified, staged, committed)
- 直接记录快照,而非差异比较
- 多数操作仅添加操作
- 近乎所有操作都是本地执行
- 时刻保持数据完整性
Git基本工作流程
- 在git版本控制的目录下修改某个文件
- 使用
git add命令对修改后的文件快照,保存到暂存区域 - 使用
git commit命令提交更新,将保存在暂存区域的文件快照永久转储到 Git 目录中
- 自动补全
- Git 命令别名
Git版本控制
创建仓库
git initgit clonegit config
保存修改
git addgit commit
查看仓库
git statusgit log --oneline
撤销修改
查看之前的commit
git checkout <commit> <file>git checkout <commit>git checkout <branch>
撤销公共修改
git revert <commit>
撤销本地修改
git resetgit clean
重写Git历史记录
git commit --amendgit rebasegit reflog
Git协作开发
分支
git branchgit checkoutgit merge
仓库同步
git remotegit fetchgit pullgit push
Git工作流
由于git拥有强大的分支特性,它的工作流比较灵活而缺乏约束,于是参考Atlassian Git Tutorial的Comparing Workflows章节提供四种Git工作流:
- Centralized Workflow
- Feature Branch Workflow
- Gitflow Workflow
- Forking Workflow
以上工作流只是参考指南,而不是具体规则。你可以根据自己实际情况来选择适合自己的工作流或微调来满足自己的需要。
Centralized Workflow
过渡到分布式版本控制系统看起来像一个艰巨的任务,但如果你充分利用好git的话,你不必改变你既有的工作流,你的团队可以采用与之前使用SVN一样的方式来开发项目。
如何工作

Centralized Workflow
- 从远程仓库(central repository)克隆工程到本地仓库(local repository) ---
git clone - 在本地仓库编辑文件和提交更新 ---
git add和git commit - fetch远程仓库已更新的commit到本地仓库和rebase到已更新的commit的上面 ---
git fetch和gitrebase或git pull --rebase - push本地主分支(master branch)到远程仓库 ---
git push
管理冲突

File Conflicts
- 何时发生冲突:在开发者发布它们功能之前,他们需要fetch远程仓库已更新的commit到本地仓库和rebase到已更新的commit的上面。有时,本地提交与远程提交会发生冲突,git会暂停rebase过程来让你手动解决冲突。
- 如何解决冲突:你可以使用
git status和git add来手动解决合并时冲突。
Feature Branch Workflow
Feature Branch Workflow的主要思想就是在开发每个功能时都应该创建一个独立的分支而不只是使用主分支。由于每个分支是独立且互不影响,这就意味着主分支不会包含broken code,对持续集成环境是很有帮助的。
如何工作

Feature Branch Workflow
- 仍然使用远程仓库(central repository)和主分支(master branch)仍记录官方工程的历史
- 开发者每次开发新功能时都创建一个新分支 ---
git checkout -b - Feature branches应该推送到远程仓库(central repository) ---
git push - 发送pull request来请求管理员能否合并到主分支(master branch)
- 发布新功能到远程仓库(central repository)
Pull Request
Pull request是一种当开发者完成一个新功能后向其他团队成员发送通知的机制。它的使用过程如下:
开发者可以通过Github或Bitbucket发送pull request

Pull request on Github
- 其他的团队成员审查、讨论和修改代码
- 项目维护者合并新增功能分支到主分支(master branch),然后关闭pull request
Gitflow Workflow
Feature Branch Workflow是一种非常灵活的开发方式。对于一些规模比较大的团队,最好就是给特定的分支赋予不同的角色。除了功能分支(feature branch),Gitflow Workflow还使用独立的分支来准备发布(preparing),维护(maintaining), 和记录版本(recording releases)。下面我会逐个介绍这个几个分支:Historical Branches、Feature Branches、Release Branches和Maintenance Branches。
Historical Branches

Historical Branches
- master分支保存官方发布历史
- develop分支衍生出各个feature分支
Feature Branches

Feature Branches
- feature分支使用develop分支作为它们的父类分支
- 当其中一个feature分支完成后,它会合并会develop分支
- feature分支应该从不与master分支直接交互
Release Branches

Release Branches
- release分支主要用来清理释放、测试和更新文档
- 一旦develop分支获得足够的功能来发布时,你可以从develop衍生出一个release分支
- 一旦准备好上架,release合并到master分支并且标记一个版本号
- 另外,还需要合并回develop分支
Maintenance Branches

Maintenance Branches.png
- maintenance分支用来快速给已发布产品修复bug或微调功能
- 它从master分支直接衍生出来
- 一旦完成修复bug,它应该合并回master分支和develop分支
- master应该被标记一个新的版本号
标记Tags
使用两个命令来给master分支标记版本号:
git tag -a 0.1 -m "Initial public release" mastergit push origin master --tags
Forking Workflow
Forking Workflow与以上讨论的工作流很不同,一个很重要的区别就是它不只是多个开发共享一个远程仓库(central repository),而是每个开发者都拥有一个独立的服务端仓库。也就是说每个contributor都有两个仓库:本地私有的仓库和远程共享的仓库。

Forking Workflow
Forking Workflow这种工作流主要好处就是每个开发者都拥有自己的远程仓库,可以将提交的commits推送到自己的远程仓库,但只有工程维护者才有权限push提交的commits到官方的仓库,其他开发者在没有授权的情况下不能push。Github很多开源项目都是采用Forking Workflow工作流。
如何工作
1.在服务器上有一个官方公共的仓库
2.开发者fork官方仓库来创建它的拷贝,然后存放在服务器上
Fork official repository.png
1、当开发者准备好发布本地的commit时,他们push commit到他们自己的公共仓库
2、在自己的公共仓库发送一个pull request到官方仓库
3、维护者pull贡献者的commit到他自己的本地仓库
4、审查代码确保它不会破坏工程,合并它到本地仓库的master分支
5、push master分支到服务器上的官方仓库
6、其他开发者应该同步官方仓库。
Git版本控制与工作流的更多相关文章
- Git版本控制与工作流详解
这篇文章是针对git版本控制和工作流的总结,如果有些朋友之前还没使用过git,对git的基本概念和命令不是很熟悉,可以从以下基本教程入手: 专为设计师而写的GitHub快速入门教程 git – 简明指 ...
- 好代码是管出来的——Git的分支工作流与Pull Request
上一篇文章介绍了常用的版本控制工具以及git的基本用法,从基本用法来看git与其它的版本控制工具好像区别不大,都是对代码新增.提交进行管理,可以查看提交历史.代码差异等功能.但实际上git有一个重量级 ...
- GIT 版本控制常用命令学习汇总
GIT 版本控制常用命令汇总 git version 查看当前git版本信息 git help 获取全部命令帮助信息 git help <command> 获取指定命令帮助信息 git c ...
- Git版本控制教程
Git 版本控制入门 不了解Git请查看权威Git书籍 ProGit(中文版). 一份很好的 Git 入门教程,点击这里查看. Git客户端下载地址: 官方Git - TortoiseGit - So ...
- Git版本控制工具(三)----远程仓库GitHub的使用
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- git版本控制工具(二)----本地版本库的常用操作
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- Git版本控制工具(一)----git的安装及创建版本库
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- Git 版本控制工具(学习笔记)
GIT(分布式) 一.Git 初始版本控制工具 1. 安装Git Ubuntu系统下,打开shell界面,输入: sudo apt-get install git-core 之后回车输入密码,即可完 ...
- Git版本控制,rsync同步文件,完成线上部署
之前项目开发完成,测试阶段,借着此时,由于公司暂时用两台aliyun ecs 做业务层,所以每次都需要同步线上文件,进而想着搞一搞服务器端(小公司,新项目,先小搞一把),搭建一套小的版本控制上线的 ...
随机推荐
- CentOS 网卡配置bond4(LACP)
交换机开启LACP,配置聚合. 网卡eno1, eno2, eno3.eno1为管理口,eno2和eno3绑定,配置bond4. 配置eno2: vim /etc/sysconfig/network- ...
- win7下 安装 Flask
参考: http://my.oschina.net/935572630/blog/375758 一 环境版本: os: win7 x64 python: 2.7.10 x64 二 安装步骤: 由于fl ...
- Django 之 models的 F() 和 Q() 函数
前提: app名称为core,models.py 如下: #coding: utf8 import datetime from django.db import models class Order( ...
- IBM Power PC安装sysbench 执行mysql基准测试 --- sysbench安装
第一步:下载Sysbench http://dev.mysql.com/downloads/benchmarks.html 第二步:解压sysbench 第三步:执行安装步骤 1. ./autogen ...
- Python基础篇【第3篇】: Python正则表达式
正则表达式 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大.正则表达式是一个特殊的 ...
- C#正则表达式Regex类的用法
C#正则表达式Regex类的用法 更多2014/2/18 来源:C#学习浏览量:36891 学习标签: 正则表达式 Regex 本文导读:正则表达式的本质是使用一系列特殊字符模式,来表示某一类字符串, ...
- .gitignore 使用中注意的问题
在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改 .gitignore 文件的方法.这个文件每一行保存了一个匹配的规则例如: # 此为注释 – 将被 Git 忽略 *.a ...
- fgtyn
http://www.studiocleo.com/projects/ballettechnique/one_11.html
- http://paulgraham.com/arcfaq.html
Why not use some other delimiter than parentheses?为什么不使用一些其他的分隔符比括号?We tried various possibilities. ...
- ASP.NET程序中 抛出"Thread was being aborted. "异常(转)
Thread was being aborted :中文意思 线程被终止 引用地址:http://support.microsoft.com/default.aspx/kb/312629/EN-US/ ...