Git版本控制与工作流


这篇文章是针对git版本控制和工作流的总结,如果有些朋友之前还没使用过git,对git的基本概念和命令不是很熟悉,可以从以下基本教程入手:

专为设计师而写的GitHub快速入门教程

git - 简明指南

学习Git的在线互动教程

基本概念
Git是什么?
Git分布式版本控制系统,与SVN类似的集中化版本控制系统相比,集中化版本控制系统虽然能够令多个团队成员一起协作开发,但有时如果中央服务器宕机的话,谁也无法在宕机期间提交更新和协同开发。甚至有时,中央服务器磁盘故障,恰巧又没有做备份或备份没及时,那就可能有丢失数据的风险。
但Git是分布式的版本控制系统,客户端不只是提取最新版本的快照,而且将整个代码仓库镜像复制下来。如果任何协同工作用的服务器发生故障了,也可以用任何一个代码仓库来恢复。而且在协作服务器宕机期间,你也可以提交代码到本地仓库,当协作服务器正常工作后,你再将本地仓库同步到远程仓库。
为什么要使用Git
能够对文件版本控制多人协作开发

拥有强大的分支特性,所以能够灵活地以不同的工作流协同开发

分布式版本控制系统,即使协作服务器宕机,也能继续提交代码或文件到本地仓库,当协作服务器恢复正常工作时,再将本地仓库同步到远程仓库。

当团队中某个成员完成某个功能时,通过pull request操作来通知其他团队成员,其他团队成员能够review code后再合并代码。

Git有哪些特性
文件三种状态(modified, staged, committed)

直接记录快照,而非差异比较

多数操作仅添加操作

近乎所有操作都是本地执行

时刻保持数据完整性

有关以上特性的详细解释,请查看Pro git的git基础章节
Git基本工作流程
在git版本控制的目录下修改某个文件

使用git add
命令对修改后的文件快照,保存到暂存区域

使用git commit
命令提交更新,将保存在暂存区域的文件快照永久转储到 Git 目录中

Git基本技巧
自动补全

Git 命令别名

关于具体如何使用自动补全和命名别名技巧,请查看Pro git的技巧和窍门
Git版本控制
创建仓库
git init

git clone

git config

保存修改
git add

git commit

查看仓库
git status

git log --oneline

撤销修改
查看之前的commit
git checkout

git checkout

git checkout

撤销公共修改
git revert

撤销本地修改
git reset

git clean

重写Git历史记录
git commit --amend

git rebase

git reflog

Git协作开发
分支
git branch

git checkout

git merge

仓库同步
git remote

git fetch

git pull

git push

Git工作流
由于git拥有强大的分支特性,它的工作流比较灵活而缺乏约束,于是参考Atlassian Git TutorialComparing Workflows章节提供四种Git工作流
Centralized Workflow

Feature Branch Workflow

Gitflow Workflow

Forking Workflow

以上工作流只是参考指南,而不是具体规则。你可以根据自己实际情况来选择适合自己的工作流或微调来满足自己的需要。
Centralized Workflow
过渡到分布式版本控制系统看起来像一个艰巨的任务,但如果你充分利用好git的话,你不必改变你既有的工作流,你的团队可以采用与之前使用SVN一样的方式来开发项目。
如何工作


从远程仓库(central repository)克隆工程到本地仓库(local repository) --- git clone

在本地仓库编辑文件和提交更新 ---  git add和git commit

fetch远程仓库已更新的commit到本地仓库和rebase到已更新的commit的上面 --- git fetch和git rebase 或 git pull --rebase

push本地主分支(master branch)到远程仓库 --- git push

管理冲突

何时发生冲突:在开发者发布它们功能之前,他们需要fetch远程仓库已更新的commit到本地仓库和rebase到已更新的commit的上面。有时,本地提交与远程提交会发生冲突,git会暂停rebase过程来让你手动解决冲突。

如何解决冲突:你可以使用git status
和git add
来手动解决合并时冲突。

Feature Branch Workflow
Feature Branch Workflow的主要思想就是在开发每个功能时都应该创建一个独立的分支而不只是使用主分支。由于每个分支是独立且互不影响,这就意味着主分支不会包含broken code,对持续集成环境是很有帮助的。
如何工作

仍然使用远程仓库(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
其他的团队成员审查、讨论和修改代码

项目维护者合并新增功能分支到主分支(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

**master分支**保存官方发布历史

**develop分支**衍生出各个feature分支

Feature Branches

**feature分支**使用develop分支作为它们的父类分支

当其中一个feature分支完成后,它会合并会develop分支

feature分支应该从不与master分支直接交互

Release Branches


**release分支**主要用来清理释放、测试和更新文档

一旦develop分支获得足够的功能来发布时,你可以从develop衍生出一个release分支

一旦准备好上架,release合并到master分支并且标记一个版本号

另外,还需要合并回develop分支

Maintenance Branches

**maintenance分支**用来快速给已发布产品修复bug或微调功能

它从master分支直接衍生出来

一旦完成修复bug,它应该合并回master分支和develop分支

master应该被标记一个新的版本号

标记Tags
使用两个命令来给master分支标记版本号:

git tag -a 0.1 -m "Initial public release" master

git push origin master --tags

Forking Workflow

Forking Workflow与以上讨论的工作流很不同,一个很重要的区别就是它不只是多个开发共享一个远程仓库(central repository),而是每个开发者都拥有一个独立的服务端仓库。也就是说每个contributor都有两个仓库:本地私有的仓库和远程共享的仓库。

Forking Workflow这种工作流主要好处就是每个开发者都拥有自己的远程仓库,可以将提交的commits推送到自己的远程仓库,但只有工程维护者才有权限push提交的commits到官方的仓库,其他开发者在没有授权的情况下不能push。Github很多开源项目都是采用Forking Workflow工作流。
如何工作:

1、在服务器上有一个官方公共的仓库开发者fork官方仓库来创建它的拷贝,然后存放在服务器上
2、当开发者准备好发布本地的commit时,他们push commit到他们自己的公共仓库

3、在自己的公共仓库发送一个pull request到官方仓库

4、维护者pull贡献者的commit到他自己的本地仓库

5、审查代码确保它不会破坏工程,合并它到本地仓库的master分支

6、push master分支到服务器上的官方仓库

7、其他开发者应该同步官方仓库。

扩展阅读
Pro Git 简体中文版

atlassian Git Tutorials

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容

  • 这篇文章是针对git版本控制和工作流的总结,如果有些朋友之前还没使用过git,对git的基本概念和命令不是很熟悉,...
    Sam_Lau阅读 62,390评论 22 328
  • 终于等到一个自己喜欢的,结果他各方面条件太好,我自知配不上
    草管人命阅读 237评论 0 1
  • Cline97阅读 333评论 0 0
  • 身边有一个这样不断折腾的姑娘M。 M出生在八十年代史上最严酷的计划生育阶段,因是二胎,父母在国家单位上班,所以从小...
    c8cc749430db阅读 291评论 0 0
  • 心情很糟糕时却是一个陌生人来问候。似乎今天从一开始心情就变差,也不知道是发什么神经,事事都不顺,糟透了。
    Destinationl阅读 232评论 2 0