原文出处:刘耀柱(@Sam_Lau_Dev)   欢迎分享原创到伯乐头条

Git Version Control

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

  • 专为设计师而写的GitHub快速入门教程
  • git – 简明指南
  • 学习Git的在线互动教程

基本概念

Git是什么?

Git是分布式版本控制系统,与SVN类似的集中化版本控制系统相比,集中化版本控制系统虽然能够令多个团队成员一起协作开发,但有时如果中央服务器宕机的话,谁也无法在宕机期间提交更新和协同开发。甚至有时,中央服务器磁盘故障,恰巧又没有做备份或备份没及时,那就可能有丢失数据的风险。

但Git是分布式的版本控制系统,客户端不只是提取最新版本的快照,而且将整个代码仓库镜像复制下来。如果任何协同工作用的服务器发生故障了,也可以用任何一个代码仓库来恢复。而且在协作服务器宕机期间,你也可以提交代码到本地仓库,当协作服务器正常工作后,你再将本地仓库同步到远程仓库。

为什么要使用Git

  • 能够对文件版本控制多人协作开发
  • 拥有强大的分支特性,所以能够灵活地以不同的工作流协同开发
  • 分布式版本控制系统,即使协作服务器宕机,也能继续提交代码或文件到本地仓库,当协作服务器恢复正常工作时,再将本地仓库同步到远程仓库。
  • 当团队中某个成员完成某个功能时,通过pull request操作来通知其他团队成员,其他团队成员能够review code后再合并代码。

Git有哪些特性

  • 文件三种状态(modified, staged, committed)
  • 直接记录快照,而非差异比较
  • 多数操作仅添加操作
  • 近乎所有操作都是本地执行
  • 时刻保持数据完整性

有关以上特性的详细解释,请查看Pro git的git基础章节

Git基本工作流程

  1. 在git版本控制的目录下修改某个文件
  2. 使用git add命令对修改后的文件快照,保存到暂存区域
  3. 使用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 <commit> <file>
  • git checkout <commit>
  • git checkout <branch>
撤销公共修改
  • git revert <commit>
撤销本地修改
  • 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 Tutorial的Comparing Workflows章节提供四种Git工作流

  • Centralized Workflow
  • Feature Branch Workflow
  • Gitflow Workflow
  • Forking Workflow

以上工作流只是参考指南,而不是具体规则。你可以根据自己实际情况来选择适合自己的工作流或微调来满足自己的需要。

Centralized Workflow

过渡到分布式版本控制系统看起来像一个艰巨的任务,但如果你充分利用好git的话,你不必改变你既有的工作流,你的团队可以采用与之前使用SVN一样的方式来开发项目。

如何工作

Centralized Workflow
  1. 从远程仓库(central repository)克隆工程到本地仓库(local repository) — git clone
  2. 在本地仓库编辑文件和提交更新 — git addgit commit
  3. fetch远程仓库已更新的commit到本地仓库和rebase到已更新的commit的上面 —git fetchgit rebase 或 git pull --rebase
  4. push本地主分支(master branch)到远程仓库 — git push

管理冲突

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

Feature Branch Workflow

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

如何工作

Feature Branch Workflow
  1. 仍然使用远程仓库(central repository)和主分支(master branch)仍记录官方工程的历史
  2. 开发者每次开发新功能时都创建一个新分支 — git checkout -b
  3. Feature branches应该推送到远程仓库(central repository) — git push
  4. 发送pull request来请求管理员能否合并到主分支(master branch)
  5. 发布新功能到远程仓库(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" master
  • git 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

  3. 当开发者准备好发布本地的commit时,他们push commit到他们自己的公共仓库
  4. 在自己的公共仓库发送一个pull request到官方仓库
  5. 维护者pull贡献者的commit到他自己的本地仓库
  6. 审查代码确保它不会破坏工程,合并它到本地仓库的master分支
  7. push master分支到服务器上的官方仓库
  8. 其他开发者应该同步官方仓库。

扩展阅读

  • Pro Git 简体中文版
  • atlassian Git Tutorials

Git版本控制与工作流相关推荐

  1. Git 版本控制之 GitFlow

    来源:  http://t.cn/EbZKx96 最近在着手制定开发规范,想要把项目正规高效的跑起来.计划引入 Git 版本控制,Git-Flow 便成为了首选.因为之前并没有过多接触,所以先花些时间 ...

  2. 好代码是管出来的——Git的分支工作流与Pull Request

    上一篇文章好代码是管出来的--使用Git来管理源代码 介绍了常用的版本控制工具以及git的基本用法,从基本用法来看git与其它的版本控制工具好像区别不大,都是对代码新增.提交进行管理,可以查看提交历史 ...

  3. Git版本控制面试知识小结

    今天我们来学习下Git版本控制的知识,Git是目前世界上最先进的分布式版本控制系统(没有之一). 一.git容易混淆的两个概念 工作区: 电脑中所看到的文件目录,project就是一个工作区: git ...

  4. git版本控制工具(二)----本地版本库的常用操作

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  5. 非程序员如何使用 Git——版本控制你的生活

    在协同工作和版本控制方面,Git 绝对是一个优秀的工具,但其优点并不被大众所熟知.在过去的几年中,由于大众对于文字处理,电子表格(译者注:这里暗指Word和Excel,下同.)以及其他常用的功能的需求 ...

  6. git修改服务器的命令行,Git版本控制工具安装及命令行操作

    很多小伙伴不知道如何来安装Git版本控制工具,对于命令操作比较陌生.本文做了一个详细的文档,希望对大家有所帮助. 1.git 是什么一个分布式版本控制系统,和SVN类似,但远比SVN强大的一个版本控制 ...

  7. Git - Pull Request工作流

    Pull Requests是Bitbucket上方便开发者之间协作的功能.提供了一个用户友好的Web界面,在集成提交的变更到正式项目前可以对变更进行讨论. 开发者向团队成员通知功能开发已经完成,Pul ...

  8. 《Git版本控制管理(第2版)》——4.3 Git在工作时的概念

    本节书摘来自异步社区<Git版本控制管理(第2版)>一书中的第4章,第4.3节,作者:[美]Jon Loeliger , Matthew McCullough著,更多章节内容可以访问云栖社 ...

  9. 在Android Studio 上为项目添加Git版本控制

    准备:Android Studio 需要配置GitHub ,配置方法在上一篇文章:https://blog.csdn.net/z1web/article/details/84106234 然后打开你想 ...

最新文章

  1. 一个基于SpringBoot + Mybatis + Vue的代码生成器
  2. Redis的设计与实现之整数集合和压缩列表
  3. SAP CRM Pricing Procedure中的Doc和Customer Procedure在哪里维护
  4. yaml parse python_python-yaml
  5. html中选择收货地址时候,选择收货地址.html
  6. c语言程序设计实验结果与分析,C语言程序设计实验报告(7)
  7. 手机变成投影仪 建筑穿上节能衣
  8. 禁用win10 1903 wifi诊断
  9. 微星网卡linux驱动,微星b360系列win10无法安装网卡驱动解决方法_武汉久龙电脑维修中心...
  10. 《缠中说禅108课》24::MACD 对背弛的辅助判断
  11. 简单的定时任务(项目发布时启动,停止时任务结束)
  12. phalapi 数据库锁_PhalApi:[1.15] 数据库操作:基于NotORM的使用及优化-Go语言中文社区...
  13. 不需要K值实现打开链接、扫码即可在手机、电脑端弹出QQ添加好友框的方法
  14. 杭电出了“王炸班”!考研3个清北8个浙大,就业人均起薪30万+
  15. linux分区变为空闲,分析linux系统中磁盘空闲空间的管理方法
  16. java中的枚举与注解
  17. Java 开源中文分词器Ansj 学习教程
  18. PANSS 阳性与阴性症状量表
  19. 程序猿专用代码注释:佛祖保佑,永无BUG
  20. 基于Apriori算法的菜品组合挖掘

热门文章

  1. 映客都是互刷礼物吗_仿映客刷礼物效果---代码优化
  2. 瑞萨RL78簇bootloader深入探讨(一):User工程建立
  3. 修复无限网卡驱动报错:windows仍在设置此设备的类配置(代码56)
  4. android 商城评价,打开应用商店对应用进行评价
  5. 高效深度学习软硬件设计——神经网络压缩、 Pruning模型剪枝、权值共享、低秩近似
  6. docker容器端口影射宿主机端口
  7. 写给大家看的Web设计书:第3版(世界级设计大师指点迷津)(全彩印刷)
  8. DM9000C网卡驱动程序编写与测试
  9. 引用类库出现类型初始值设定项引发异常错误
  10. 清晨,赶路,感觉像孤魂野鬼,没有归宿感