基础概念

GIT是一种版本控制软件,那就首先了解一下什么是 “版本控制”?

比较官方的解释是,版本控制系统是一种记录一个或若干个内容变化,以便将来查询特定版本修订情况的系统。

简言之,你的修改只要提到到版本控制系统,基本都可以找回,版本控制系统就像一台时光机器,可以让你回到任何一个时间点。

了解了版本控制系统的功能,我们知道就算你把代码改的一塌糊涂,照样可以恢复到我们过去的任何一个时间点,工作量却微乎其微。是不是很amazing。

总结一下版本控制系统有哪些优点:

  • 记录文件所有历史变化。这是版本控制系统的基本能力;
  • 随时恢复到任意时间点。历史记录功能使我们不怕改错代码了;
  • 支持多功能并行开发。通常版本控制系统都支持分支,保证了并行开发的可行;
  • 多人协作并行开发。对于多人协作项目,支持多人协作开发的版本管理将事半功倍;

常见管理版本控制工具

  • SVN(Subversion)

    SVN是曾经最流行的版本管理系统,很多人都有用过,因而对于集中式版本控制系统很多人都很了解它。

    SVN版本控制示例图

    优点:

    • 适合多人团队协作开发
    • 代码集中化管理

    缺点:

    • 单点故障
    • 必须联网,无法单机工作
    • 创建分支成本高

    优点就不多说了,大家可能对缺点更是记忆深刻。

    单点故障,集中式管理的缺点,代码集中在一台机器上,这个问题其实可以通过备份集 群解决;

    必须联网工作,这个缺点我是深入痛觉,一旦公司网络出现问题,几个小时甚至一天无法工作的经历都有。由于这些缺点,便有了Git(分布版本控制系统)。

    创建分支成本高,分支以文档形式表现,对于程序员来说想要切换分支简直就是灾难

  • Git

    想知道GIT有多流行吗?看看GITHUB就知道了,现在很多公司都已经把自己的代码库迁移到了GIT。可见GIT在如今的流行程度,也说明了分布式版本控制系统是如今的趋势。

    Git版本控制示例图

    关于Git,这里只说优点

    • 适合多人团队协作开发
    • 代码集中化管理
    • 可以离线工作
    • 每个计算机都是一个完整仓库

    1、2两点SVN也可以做到,说一下3、4点

    可以离线工作,分布式版本管理系统每个计算机都有一个完整的仓库,可本地提交,可以做到离线工作。没有了SVN令人抓狂的断网无法工作问题;

    每个计算机都是一个完整的仓库,也就没有了SVN的单点故障;

GIT与SVN的比较

1
1. GIT是分布式的,SVN为集中式的
1
2. GIT随处都是版本库,SVN只有一个中央版本库
1
3. GIT没有全局版本号,SVN有全局版本号
1
4. GIT把内容按元数据存储,SVN按文件存储
1
5. GIT记录文件快照,SVN记录文件差异
1
6. GIT的内容完整性高,SVN完整性低

GIT架构

GIT的架构,可以分为几个部分:

  • 本地工作区(working directory)
  • 暂存区(stage area, 又称为索引区, index)
  • 本地仓库(local repository)
  • 远程仓库副本
  • 远程仓库(remote repository)

如下图:

GIT架构图

上图展示了git的整体架构,以及各个部分相关的主要命令。

具体命令大家可以根据这个网址learngitbranching自行去操作理解Git的相关命令。

GIT在团队中的实际使用

  • 搭建gitlab私有化仓库

    网上有很多搭建gitlab服务器的教程,比如手把手教你搭建gitlab服务器,按照步骤搭建自己的gitlab服务器。

  • gitlab上的相关操作
    • 新建project

    • 命令行指令

      • Git global setup
        1
        2
        git config --global user.name "xx"
        git config --global user.email "xxxxxx@xx.com"
      • Create a new repository
        1
        2
        3
        4
        5
        6
        git clone git@ip:user/xxx.git
        cd xxx
        touch README.md
        git add README.md
        git commit -m "add README"
        git push -u origin master
      • Existing folder
        1
        2
        3
        4
        5
        6
        cd existing_folder
        git init
        git remote add origin git@ip:user/xxx.git
        git add .
        git commit -m "Initial commit"
        git push -u origin master
      • Existing Git repository
        1
        2
        3
        4
        5
        cd existing_repo
        git remote rename origin old-origin
        git remote add origin git@ip:user/xxx.git
        git push -u origin --all
        git push -u origin --tags
  • 本地开发 (以下以具体项目:tp6 做演示)
    • bash进入项目tp6根目录
      WechatIMG39

    • 新建 test、dev分支 (test、dev命名看个人习惯)

      1
      2
      git checkout -b test
      git checkout -b dev

      WechatIMG40
      创建分支就这么简单,比svn优雅很多
      test分支作为测试仓库,保持和master仓库代码一致。
      dev分支作为开发仓库,由开发人员自行控制。

    • 团队协同

      • 开发人员

        1
        2
        3
        通过git checkout dev 切换到本地dev分支.比如目前在开发一个用户登录的
        功能模块,则在dev分支的基础上 新建一个feature-xxx分支做开发,开发完成
        后merge到dev分支

        下图完整的描述了git分支的命名规范以及开发流程
        WechatIMG41

      • 测试人员

        1
        2
        3
        4
        测试人员主要在测试服务器上首先测试相关功能分支。
        待版本功能分支全部功能测试完毕后
        通知开发人员merge到test分支进行整体测试。
        整体测试通过后通知开发人员将test分支merge到master分支
      • 技术经理/CTO

        1
        2
        技术经理/CTO主要负责生产服务器中项目master分支的pull操作,
        具体操作命令为 git pull 将gitlab上master最新的代码拉到生产服务器中

最后

本文档从版本控制引出分布式版本控制,比较分布式版本控制系统与其他版本控制系统的区别,从而引入GIT。

与SVN的比较明显可看出GIT的优秀之处。对GIT的架构也进行整体简单介绍。内容比较理论,期望在理清自己思路的同时,不会误导他人。

文中如有错误,请帮忙指正!谢谢!

感谢大家能认真阅读这篇文档,万分感谢!