大话项目管理工具之Git篇

前言

Git 这个词相信大家并不陌生,做开发的童鞋们每天都离不开它,当然,如果你的项目中没有用到分布式,那么,你可能从未用过 Git,当然也可能没听过。不过,这不是重点,重点是这一篇文章,我们将一起谈谈 Git,从宏观上来认识 Git。

一点序

在写这篇文章之前,就一直在想该如何定位呢?是写一篇基础一些的使用教程,还是从宏观上介绍一下 Git 的机制呢?由于最近时间很紧,没有那么多的空余时间,因此,思来想去决定写一篇宏观上的介绍,至于基础教程嘛,网上已经有很多了,我都看了看,写的都比我好,因此我也就没有必要再误人子弟了。

鉴于此,我的定位是,这篇文章的主要内容是在宏观上谈谈 Git 给我们带来的改变,以及 Git 的内部实现,或者说是机制吧。最后,把自己在项目中使用 Git 的感受跟大家分享一下。

版本控制

什么是版本控制?我为什么要关心它呢?我想我问的这个问题有点小傻了。有过开发的童鞋们这点就不用说了,如果你真的不知道,那么去 Baidu 一下吧。那么,你知道版本控制系统有几种吗?你考虑过为什么公司里用的是 Git 而不用 SVN 呢?或者用的是 SVN 而不用 Git 呢?先看看他们之间的区别吧。

  • 本地版本控制系统

还记得在很早以前,我们要备份文件、备份数据的时候,我们是怎么做的吗?反正我的做法就是,复制整个文件(文件夹),拷贝到另一块硬盘,或者网盘。然后自己给他们命名。这是一种纯手工的 job 。大家都知道,只要是人工的重复性劳动,出错的几率会大大增加的。然而,为了解决这个问题,人们很久以前就开发了许多种本地版本控制系统,大多都是采用某种简单的数据库来记录文件的历次更新差异。

其中最流行的一种叫做 rcs(Revision Control System),现今许多计算机系统上都还看得到它的踪影。甚至在流行的 Mac OS X 系统上安装了开发者工具包之后,也可以使用 rcs 命令。它的工作原理基本上就是保存并管理文件补丁(patch)。文件补丁是一种特定格式的文本文件,记录着对应文件修订前后的内容变化。所以,根据每次修订后的补丁,rcs 可以通过不断打补丁,计算出各个版本的文件内容。

  • 集中化版本控制系统

rcs 的出现大大的方便了人们对历史文件(数据)的控制和维护。然而,不久之后,又一个问题出现了。操作系统的差异,导致开发人员无法进行协同工作,尤其是在版本控制方面。聪明的 Human 找到了解决的办法,就这样,集中式版本控制系统(Centralized Version Control Systems,简称 CVCS)应运而生。

像这类系统,诸如 CVS,Subversion 以及 Perforce 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。多年以来,这已成为版本控制系统的标准做法。而且在企业开发中,集中式的版本控制系统也是最常见的、最普遍的。

这种做法带来了许多好处,特别是相较于老式的本地 VCS 来说。现在,每个人都可以在一定程度上看到项目中的其他人正在做些什么。而管理员也可以轻松掌控每个开发者的权限,并且管理一个 CVCS 要远比在各个客户端上维护本地数据库来得轻松容易。

古人有一句老话,叫做“福兮祸之所伏,祸兮福之所倚”。他是说,任何事物都有两面性,不存在绝对的好与坏,只不过是一个相对的比较罢了。我们要追求的就是一种平衡,或者说对我们来说,利大于弊的方面而已。似乎有点跑题啊。。。回到正题, 可以看到,集中式版本控制系统,最显而易见的缺点就是中央服务器的单点故障。如果宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。

要是中央服务器的磁盘发生故障,碰巧没做备份,或者备份不够及时,就会有丢失数据的风险。最坏的情况是彻底丢失整个项目的所有历史更改记录,而被客户端偶然提取出来的保存在本地的某些快照数据就成了恢复数据的希望。但这样的话依然是个问题,你不能保证所有的数据都已经有人事先完整提取出来过。本地版本控制系统也存在类似问题,只要整个项目的历史记录被保存在单一位置,就有丢失所有历史更新记录的风险。

  • 分布式版本控制系统

为什么说人类总是最聪明的呢?人类总是能解决遇到的难题,这次也不例外。基于上述的问题,分布式版本控制系统(Distributed Version Control System,简称 DVCS )面世了。在这类系统中,像 Git,Mercurial,Bazaar 以及 Darcs 等,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份。

更进一步,许多这类系统都可以指定和若干不同的远端代码仓库进行交互。籍此,你就可以在同一个项目中,分别和不同工作小组的人相互协作。你可以根据需要设定不同的协作流程,比如层次模型式的工作流,而这在以前的集中式系统中是无法实现的。

思想

那么,简单地说,Git 究竟是怎样的一个系统呢?让我们来看看他映射出的思想。

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

Git 和其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异。这类系统(CVS,Subversion,Perforce,Bazaar 等等)每次记录有哪些文件作了更新,以及都更新了哪些行的什么内容。

Git 并不保存这些前后变化的差异数据。实际上,Git 更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一链接。

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

在 Git 中的绝大多数操作都只需要访问本地文件和资源,不用连网。但如果用 CVCS 的话,差不多所有操作都需要连接网络。因为 Git 在本地磁盘上就保存着所有当前项目的历史更新,所以处理起来速度飞快。

举个例子,如果要浏览项目的历史更新摘要,Git 不用跑到外面的服务器上去取数据回来,而直接从本地数据库读取后展示给你看。所以任何时候你都可以马上翻阅,无需等待。如果想要看当前版本的文件和一个月前的版本之间有何差异,Git 会取出一个月前的快照和当前文件作一次差异运算,而不用请求远程服务器来做这件事,或是把老版本的文件拉到本地来作比较。

用 CVCS 的话,没有网络或者断开 VPN 你就无法做任何事情。但用 Git 的话,就算你在飞机或者火车上,都可以非常愉快地频繁提交更新,等到了有网络的时候再上传到远程仓库。同样,在回家的路上,不用连接 VPN 你也可以继续工作。

  • 时刻保持数据完整性

在保存到 Git 之前,所有数据都要进行内容的校验和(checksum)计算,并将此结果作为数据的唯一标识和索引。换句话说,不可能在你修改了文件或目录之后,Git 一无所知。这项特性作为 Git 的设计哲学,建在整体架构的最底层。所以如果文件在传输时变得不完整,或者磁盘损坏导致文件数据缺失,Git 都能立即察觉。

Git 使用 SHA-1 算法计算数据的校验和,通过对文件的内容或目录的结构计算出一个 SHA-1 哈希值,作为指纹字符串。该字串由 40 个十六进制字符(0-9 及 a-f)组成。

Git 的工作完全依赖于这类指纹字串,所以你会经常看到这样的哈希值。实际上,所有保存在 Git 数据库中的东西都是用此哈希值来作索引的,而不是靠文件名。

  • 多数操作仅添加数据

常用的 Git 操作大多仅仅是把数据添加到数据库。因为任何一种不可逆的操作,比如删除数据,都会使回退或重现历史版本变得困难重重。在别的 VCS 中,若还未提交更新,就有可能丢失或者混淆一些修改的内容,但在 Git 里,一旦提交快照之后就完全不用担心丢失数据,特别是养成定期推送到其他仓库的习惯的话。

  • 文件的三种状态

对于任何一个文件,在 Git 内都只有三种状态:已提交(committed),已修改(modified)和已暂存(staged)。已提交表示该文件已经被安全地保存在本地数据库中了;已修改表示修改了某个文件,但还没有提交保存;已暂存表示把已修改的文件放在下次提交时要保存的清单中。

由此我们看到 Git 管理项目时,文件流转的三个工作区域:Git 的工作目录,暂存区域,以及本地仓库。

基本的 Git 工作流程如下:

  1. 在工作目录中修改某些文件。
  2. 对修改后的文件进行快照,然后保存到暂存区域。
  3. 提交更新,将保存在暂存区域的文件快照永久转储到 Git 目录中。

所以,我们可以从文件所处的位置来判断状态:如果是 Git 目录中保存着的特定版本文件,就属于已提交状态;如果作了修改并已放入暂存区域,就属于已暂存状态;如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。

感受

由于 Git 是在 Linux 下开发的,主要是作为开源系统 Linux 下的分布式版本控制系统。不过,由于一些大神的移植,使得 Windows 下的用户也可以使用。不过,对于兼容性来说,Windows 环境下的模拟 Git 还是稍微差一点的,但这并不意味着 Windows 下 Git 的功能缺失。只不过在 Windows 下,更容易出一些让人无法预料的问题。当然,这些问题还是可以解决的,就是有点麻烦而已。

比如,在 Windows 下的文件的权限因为无法和linux上完全一致,所以用Git检出的文件权限可能显示为被更改。 另外因为 Windows 下的换行和 Linux 上也不一样,协作开发时也容易出问题。所以在 Windows 上使用 Git 的同学需要加上以下2行配置参数:

git config --global core.filemode false

git config --global core.autocrlf true

第一句是忽略文件权限的改动。

第二句是将文件checkout时自动把LF转成CRLF,check in 时自动把CRLF转成LF

当然,如果在 Windows 平台上开发,建议使用图形界面的 TortoiseGit 客户端,而在 Java IDE 下也有相应的 Git 插件,比如在 Eclipse 下,可以通过安装插件的方式,安装 Git 。而在 IntelliJ IDEA 中,则默认安装了此插件,只要在设置中勾选激活,然后进行配置即可。

至于如何使用 Git,这里就不再多说了,网上有大把大把的教程。这里推荐一篇文章,讲的是如何在 Eclipse 下使用 Git,文章地址,讲的还是挺详细的,有需要的自己去看一下。

结束语

这篇文章主要讲了 Git 宏观上的一些东西,还有 Git 的基本原理。致力于让大家对 Git 有个基本的了解。当然,这是建立在使用过版本控制系统的基础之上的。而且,也不必纠结于到底使用 SVN 还是使用 Git 的问题上。个人觉得,如果是为了学习,那么最好是都了解一下。如果公司里有要求,那么就按照公司里的要求即可。没必要两款都使用,根据公司里具体的情况而定。如果,你以后打算向架构师的方向发展的话,那么就要多思考一些了,各种技术、各种工具的优势、劣势,你必须了然于胸,而且,这也是最基本的。

参考:

  1. http://git-scm.com/
  2. http://www.devtang.com/blog/2012/02/03/talk-about-svn-and-git/
时间: 2024-10-01 19:39:40

大话项目管理工具之Git篇的相关文章

大话项目管理工具之Confluence篇

前言 前面的两篇文章,讲的都是代码层次上的项目管理工具.这篇文章打算介绍一下关于知识管理的工具,当然,它也属于项目管理中的一部分.说到知识管理,你想到了什么呢?织网?找节点?不错,这是个人的知识管理.那么对于一个项目来说呢,或者对于一个企业来说呢?企业应该如何织网,如何找节点呢.你一定听说过 Wiki 这个词.而 Confluence 就是基于知识管理的企业 Wiki 软件. 一点序 开篇之前,已经构思了一段时间了,一直在考虑该怎样提笔才干讲的够透彻.在网上查了查相关的资料,感觉这一块的资料并非

大话项目管理工具之Maven篇 (转)

前言 相信只要做过 Java 开发的童鞋们,对 Ant 想必都不陌生,我们往往使用 Ant 来构建项目,尤其是涉及到特别繁杂的工作量,一个 build.xml 能够完成编译.测试.打包.部署等很多任务,这在很大的程度上解放了程序员们的双手.但同时也存在一些其他的问题,比如:jar 文件管理混乱,每次都需要自己去下载:build.xml 因项目结构的不同导致差异性较大. 概况 自从项目中引入 Maven 以后,以前 Ant 能解决的,Maven 提供了更加简洁的解决方案,而以前 Ant 解决不了的

大话项目管理工具之Maven篇

前言 相信只要做过 Java 开发的童鞋们,对 Ant 想必都不陌生,我们往往使用 Ant 来构建项目,尤其是涉及到特别繁杂的工作量,一个 build.xml 能够完成编译.测试.打包.部署等很多任务,这在很大的程度上解放了程序员们的双手.但同时也存在一些其他的问题,比如:jar 文件管理混乱,每次都需要自己去下载:build.xml 因项目结构的不同导致差异性较大. 概况 自从项目中引入 Maven 以后,以前 Ant 能解决的,Maven 提供了更加简洁的解决方案,而以前 Ant 解决不了的

大话项目管理工具之Jira篇

前言 上一篇文章谈的是知识管理工具 -- Confluence,它来自澳大利亚 Atlassian 公司.很凑巧的是,今天要介绍的 JIRA 也是来自 Atlassian 公司的.但他不再是知识管理工具了,而是项目与事务跟踪工具,被广泛应用于缺陷跟踪.客户服务.需求收集.流程审批.任务跟踪.项目跟踪和敏捷管理等工作领域. 背景 在谈 JIRA 之前,就不得不说说敏捷开发了.正式由于项目是基于敏捷开发进行的,因此才引入了 JIRA 这款适合于敏捷开发的项目管理工具.当然,这里不会大篇章的介绍敏捷开

版本管理工具介绍—Git篇

前篇 如题,提起版本管理工具相信做C#开发 还是对Git比较陌生  我们可能更熟悉vss.svn 记录此文的目的 更是为以后的前段学习做基础  现在的技术比如nodeJs  angularJs ==都少不了或多或少的跟Git有关,所以这里简单说明下是很有必要的 先来说明两个概念 1.GitHub 是一个程序员社区网站 可以托管软件的库 2. Git 版本管理工具软件 你可以移步到http://www.imooc.com/learn/208 这里去学习视频的详细介绍  这里只是简单总结 下载安装

项目管理工具之Git使用说明

1.下载Git客户端工具 http://msysgit.github.com/ 2.安装msysgit 下一步 同意GNU协议 选择安装位置 选择TrueType  Front,下一步 不创建启动文件夹 默认Git Bash,就可以了 选择默认的Checkout Style 安装完成了 3.配置本地的Git 就这样安装好msysgit后,就可以开始配置开发环境了,在你的工作目录建立一个新的文件夹Git,比如我的 选择Git文件夹,右键,选择Git Bash Here,会弹出shell命令行界面

项目管理工具篇(一、Maven)

一.什么是Maven(定义) Maven是一个项目管理工具,它包含了: 一个项目对象模型(POM:Project Object Model), 一组标准集合, 一个项目生命周期(Project Lifecycle):(清理,编译,测试,报告,打包,部署), 一个依赖管理系统(Dependency Management System), 和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑. 理解: 1. Maven是基于项目对象模型(POM)的,可以通过一小段描

Web项目管理工具精选(上)

原文:Web项目管理工具精选(上) 随着新兴科技公司的蓬勃发展,不少Web应用和浏览器工具在开发者.设计者.自由职业者和项目经理中间流行开来.这些工具在不断发展,我们也看到越来越多的桌面应用.移动应用被开发出来. 本文中,我搜集了一些不同方面的在线资源,开发人员可以从中找到有用的工具.这些工具比较适合Web项目开发,也可以用在几乎所有的技术型的项目开 发中.你们将会看到用于电子邮件营销.任务管理.cloud IDE等等方面的应用.这些应用增长势头迅猛,非常期待它们能在未来的纪念时间里发展得更好.

Web项目管理工具精选(下)

原文:Web项目管理工具精选(下) 我们在上篇中已推介『代码管理.任务管理.支付工具.数据记录.Dashboard Analytics.客户支持』六个方面的工具.本文将介绍剩下七类工具. A/B测试 A/B对比测试技术已经使用好多年了,但是执行这种测试任务的工具才刚出现.我觉得并不是所有网站布局都需要对比测试的.但是在你设计出来的布局上捣鼓捣鼓也许能发掘出一些你以前从未想过的UI/UX风格. Visual Website Optimizer 我花了些时间阅读了Visual Website Opt