Git 入门.

     给小伙伴门总结一下 git 的日常基本的使用方式, 帮助小伙伴们更好的理解 git, 有时间浏览点评下哦, 如果弄坏了仓库中的代码, 小心强哥砍死哦.

什么是版本控制系统(VCS)

     很多人认为 Git 难以理解的第一个门槛在于:所谓的「Git 是一个分布式版本控制系统」这句话的具体含义不够清楚。其实分布式版本控制系统(Distributed Version Control System - DVCS)这个定义并不难,不过一步一步来,我先告诉你,什么是版本控制系统(Version Control System - VCS)。

版本控制:最基本功能

版本控制系统(VCS)最基本的功能是版本控制。所谓版本控制,意思就是在文件的修改历程中保留修改历史,让你可以方便地撤销之前对文件的修改操作。

     最简化的版本控制模型,是大多数主流文本编辑器都有的「撤销(Undo)」功能:你本来想删除一个字符,却在按删除键之前不小心选中了全文,结果一下子整篇文档都被删光了,没关系,按一下「撤销」(Ctrl + Z 或 ⌘ + Z 或 U 等等,具体和你的操作系统以及编辑器有关),删掉的文字就都回来了。这其实是文本编辑器帮你自动保存了之前的内容,当你按下「撤销」的时候,它就帮你把内容回退到上一个状态;同理,按一次是会退到上一个版本,按两次就是回退到上上一个版本.
     写程序的时候同样也难免会遇到「写错」的情况,所以程序的 VCS,当然也会需要版本控制功能,这样当你发现「昨天有一行代码写错了」,你就不用凭着记忆把那段代码背出来,而只需要在 VCS 中选择撤回到昨天的那个版本。

主动提交:程序代码和普通文本的区别

     VCS 和文本编辑器的撤销功能比起来,有一个很重要的区别是:程序代码的修改的生命周期非常长。一次代码的修改,在几天后、几个月后、几年后都有可能需要被翻出来。如果依然采用「每次改动自动保存」的形式来保留修改历史,将会导致改动历史非常频繁和无章可循,这样,历史代码的查找、阅读和回退就会很困难了。所以,和文本编辑器的撤销功能不同,VCS 保存修改历史,使用的是主动提交改动的机制。
     在你写了一段完整的代码(例如修复了一个 bug)之后,使用 commit 命令把改动和对改动的描述信息提交,这次改动就被记录到版本历史中了。之后如果你希望回退到这个版本,就可以从 VCS 的历史日志中方便地找到它。

多人合作的同步需求:中央仓库

     代码可以一个人写,但更多的时候会是多个人共同开发。那么自然地,就需要有一个中央仓库作为代码的存储中心:所有人的改动都会上传到这里,所有人都能也都能看到和下载到别人上传的改动。
     这样,解决了同步的需求,多个人在不同的机器上开发同一个程序就成了可能。
     版本控制、主动提交、中央仓库这三个要素,共同构成了版本控制系统(VCS)的核心:开发团队中的每个人向中央仓库主动提交自己的改动和同步别人的改动,并在需要的时候查看和操作历史版本,这就是版本控制系统。

中央式版本控制系统

     最初的版本控制系统,是中央式版本控制系统(Centralized VCS),也就是前面我讲的这种。Git 是分布式的版本控制系统(Distributed VCS),它和中央式的区别我在下节说,现在先说一下中央式版本控制系统的工作模型。

工作模型

     假设你在一个三人团队,你们计划开发一个软件或者系统,并决定使用中央式 VCS 来管理代码。于是:

  1. 作为项目的主工程师,你独自一人花两天时间搭建了项目的框架;
  2. 然后,你在公司的服务器(这个服务器可以是公司内的设备,也可以是你们买的云服务)上创建了一个中央仓库,并把你的代码提交到了中央仓库上;
  3. 你的两个队友从中央仓库取到了你的初始代码,从此刻开始,你们三人开始并行开发;
  4. 在之后的开发过程中,你们三人为了工作方便,总是每人独立负责开发一个功能,在这个功能开发完成后,这个人就把他的这些新代码提交到中央仓库;
  5. 每次当有人把代码提交到中央仓库的时候,另外两个人就可以选择把这些代码同步到自己的机器上,保持自己的本地代码总是最新的。


     而对于团队中的每个人来说,就会更简单一点:

  1. 第一次加入团队时,把中央仓库的代码取下来;
  2. 写完的新功能提交到中央仓库;
  3. 同事提交到中央仓库的新代码,及时同步下来。

     这样,一个三人的团队就成功做到了各自在自己的电脑上开发同一个项目,并且互不影响,就好像你们三个人是在同一台电脑上操作一样。
     这就是中央式 VCS 最基本的工作模型。当然,实际的开发工作并没有简单到这种程度,因为你时常会需要处理代码冲突、查看版本历史、回退代码版本等;另外,Git 属于分布式 VCS,它的概念也比中央式 VCS 要复杂一些。但这些概念你需要一步步地理解和吸收,你现在只需要先知道中央式 VCS 的这个基本工作模型,其他的内容我会在后面慢慢地全部讲清楚.

什么是分布式版本控制系统(DVCS)

     分布式 VCS (Distributed VCS / DVCS)和中央式的区别在于,分布式 VCS 除了中央仓库之外,还有本地仓库:团队中每一个成员的机器上都有一份本地仓库,这个仓库里包含了所有的版本历史,或者换句话说,每个人在自己的机器上就可以提交代码、查看历史,而无需联网和中央仓库交互——当然,取而代之的,你需要和本地仓库交互。
     中央式 VCS 的中央仓库有两个主要功能:保存版本历史、同步团队代码。而在分布式 VCS 中,保存版本历史的工作转交到了每个团队成员的本地仓库中,中央仓库就只剩下了同步团队代码这一个主要任务。它的中央仓库依然也保存了历史版本,但这份历史版本更多的是作为团队间的同步中转站。

工作模型

     依然以三人团队为例,分布式 VCS 的工作模型大致是这样:

  1. 首先,你作为主工程师,独立搭建了项目架构,并把这些代码提交到了本地仓库;
  2. 然后,你在服务器上创建了一个中央仓库,并把 1 中的提交从本地仓库推送到了服务器的中央仓库;
  3. 其他同事把中央仓库的所有内容克隆到本地,拥有了各自的本地仓库,从此刻开始,你们三人开始并行开发;
  4. 在之后的开发过程中,你们三人总是每人独立负责开发一个功能,在这个功能开发过程中,一个人会把它的每一步改动提交到本地仓库。注意:由于本地提交无需立即上传到中央仓库,所以每一步提交不必是一个完整功能,而可以是功能中的一个步骤或块。
  5. 在一个人把某个功能开发完成之后,他就可以把这个功能相关的所有提交从本地仓库推送到中央仓库;
  6. 每次当有人把新的提交推送到中央仓库的时候,另外两个人就可以选择把这些提交同步到自己的机器上,并把它们和自己的本地代码合并。


     可以看出,这个工作模型和上一节讲的「中央式 VCS 的工作模型」很相似,只是把代码的提交和上传过程拆开了。
     另外,和上节讲的中央式 VCS 工作模型一样,这个也只是分布式 VCS 的一个最基本的工作模型,实际的开发工作会比这个麻烦和复杂。但这是个核心模型,你把它理解了,就可以更好地看懂后面的内容。

优点与缺点

     分布式 VCS 的优点:

  1. 大多数的操作可以在本地进行,所以速度更快,而且由于无需联网,所以即使不在公司甚至没有在联网,你也可以提交代码、查看历史,从而极大地减小了开发者的网络条件和物理位置的限制(例如,你可以在飞机上提交代码、切换分支等等);
  2. 由于可以提交到本地,所以你可以分步提交代码,把代码提交做得更细,而不是一个提交包含很多代码,难以 review 也难以回溯。

     分布式 VCS 的缺点:

  1. 由于每一个机器都有完整的本地仓库,所以初次获取项目(Git 术语:clone)的时候会比较耗时;
  2. 由于每个机器都有完整的本地仓库,所以本地占用的存储比中央式 VCS 要高。

     对于一般的程序项目而言,由于项目的大多数内容都是文本形式的代码,所以工程的体积都并不是很大,再加上文本内容自身的特点,VCS 可以利用算法来把仓库的体积极大地压缩。这就导致,在实际中,Git 等分布式 VCS 的仓库体积并不大,初次获取项目的耗时和本地仓库的存储占用都很小。所以对于大多数的程序项目而言,分布式 VCS 「尺寸大、初次下载慢」的问题其实并不严重。
     不过也有一些例外,比如游戏开发。游戏的开发中有大量的大尺寸数据和媒体文件,并且这些文件的格式也不容易压缩尺寸,如果用分布式 VCS 会导致仓库的体积非常庞大。所以一些大型游戏的开发会选择中央式的 VCS 来管理代码。

~感谢捧场,您的支持将鼓励我继续创作~