关于git的基础以及mac下的安装,请看我写的另一篇博客:Git基本知识及MAC安装使用

1. Git与其他VCS的差异

1.1 本地操作

  • svn perforce 等旧VCS一旦离开服务器就无法工作
  • git 在本地仍旧可以进行提交等几乎所有的工作
  • git 在之后使用push命令推送代码到远程服务器

1.2 版本控制的原理(快照)

旧的VCS 使用文件来管理,git 使用快照来管理

  • 每次提交都将创建一个commit快照
    • commit会链接所有代码库中的文件(快照包含全体文件 ),但是没有改动的文件不会有实体blob存储产生
    • commit会有一个当前commit改动过的文件的列表tree
    • tree会链接所有改动过的文件的blob(新储存的文件)
    • 每次提交都会创建一个全局唯一的checksum编号
      • 查看下图:
  • 新的提交则会链接到老的提交上(其他未改动的文件就靠这种方式来追溯)
    • 查看下图:

1.3 分支管理

因为git的特殊版本控制原理,使得git能很聪明地进行分支管理。旧的VCS在创建一个分支的时候,一般会将代码进行一次完整的文件拷贝,而git则只需要移动一次指针。如何理解指针,请看下文:

  • 每次commit都会有一个单独并唯一的checksum编号
  • branch就可以非常简单地通过指向某一个commit的checksum编号来进行定位,而完全不涉及到文件
  • git库创建的时候就有的主分支为master(当然你也可以重命名)
  • git库当前启用的分支为HEAD
    • 查看下图:
    • 在这幅图中,主分支为master,工作分支为testing,当前启用的分支就是testing

所以你应该可以理解了,为什么git的分支管理可以如此之快,切换一个branch几乎没有延迟。

2. Git的使用

关于软件,相信大家都不希望有事没事都到命令行下打命令来操作git。这里有一个软件,Atlassian >> SourceTree windows和mac下通用的git可视化管理软件。这个软件应该可以说是当前市面上最好的git管理工具了。

2.1 概念:Remote

就像一开始介绍的时候描述的,git的一大特点就是本地和远程服务器的分离。在git中,远程服务器称为remote。一个应用可以有多个远程服务器。

2.2 概念:push

你在git库上进行的所有操作,都是在本地进行的。而将本地的代码推送到远程服务器,就称为push

2.3 工作流程:创建

  • 用户A创建了一个空的代码库
  • 用户A向空的代码库中添加了一个远程服务器∂
  • 用户A在这个空的代码库中,创建了文件a和文件b
  • 用户A将文件a和文件badd到本地库
  • 用户A将add完成的两个文件commit到本地库
  • 用户A将这次提交push到远程服务器∂上

2.4 工作流程:修改

  • 用户A修改了本地文件b
  • 用户A将这次修改add到本地库
  • 用户A将这次修改commit到本地库
  • 用户A将这次提交push到远程服务器∂上

2.5 工作流程:HOTFIX

  • 用户A将出问题的分支上的某个commit checkout出来(将当前工作环境切换到出问题的分支的某个提交)
  • 用户A在这个commit的基础上创建一个新的branch
  • 用户A在这个新的branch上进行代码修改,测试,并提交
  • 用户A在通过测试后,将新的分支重新merge回主干分支
    • 参见下图:

2.6 工作流程:项目

  • 项目有两个远程服务器:开发(dev)和发布(product)
    • 服务器 开发,用来存储开发代码(开发版本)
    • 服务器 发布,用来存储生产环境用来发布的代码(稳定版本)
  • 项目代码中有开发(dev)和稳定(master),两个分支
  • 程序员在dev分支上进行日常代码开发
  • 在代码完成,测试之后,合并到master分支中,并打上标签(tag)
  • QA会拉master下稳定版本的tag,然后进行测试
  • 测试通过则向porduct远程服务器上push
  • 最后由运维拉product服务器上的tag进行部署