Git学习之路(1)——Git的基本用法

就是多学学对自己有用的东西吧

水一章为敬!

什么是Git

WIKI:

在程序设计中,分布式版本控制(英语:distributed revision control 或 distributed version control,又译为分布式版本控制),又称去中心化版本控制(decentralized version control),是一种版本控制的方式,它允许软件开发者可以共同参与一个软件开发项目,但是不必在相同的网络系统下工作。其作法是在每个开发者电脑中复制一份完整的代码库以及完整历史[1]。因此在无法连接网络时,仍可以进行软件的分支及合并,可以加速大部分的作业,增加此情形可以进行的工作,而且系统的代码库可以在多家电脑上备份,不需靠单一位置的备份。而多个位置的代码库再透过其他机制来达到同步。

以分布式版本控制方法,作出的软件版本控制系统,称为分布式版本控制系统(distributed revision control system,缩写为DRCS,或是distributed version control system,缩写为DVCS)。著名的分布式版本控制系统有Monotone、Git等。

为什么需要版本控制

  1. 备份
  2. 团队开发

发展历史

很多人都知道,Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了。

Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为Linux编写代码,那Linux的代码是如何管理的呢?

事实是,在2002年以前,世界各地的志愿者把源代码文件通过 diff 的方式发给 Linus,然后由 Linus 本人通过手工方式合并代码!

你也许会想,为什么 Linus 不把 Linux 代码放到版本控制系统里呢?不是有 CVS、SVN 这些免费的版本控制系统吗?因为 Linus 坚定地反对CVS和SVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。有一些商用的版本控制系统,虽然比CVS、SVN好用,但那是付费的,和 Linux 的开源精神不符。

不过,到了2002年,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满,于是Linus选择了一个商业的版本控制系统BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。

安定团结的大好局面在2005年就被打破了,原因是Linux社区牛人聚集,不免沾染了一些梁山好汉的江湖习气。开发Samba的Andrew试图破解 BitKeeper 的协议(这么干的其实也不只他一个),被 BitMover 公司发现了(监控工作做得不错!),于是 BitMover 公司怒了,要收回 Linux 社区的免费使用权。

Linus 花了两周时间自己用 C 写了一个分布式版本控制系统,这就是 Git!一个月之内,Linux 系统的源码已经由Git管理了!牛是怎么定义的呢?大家可以体会一下。

Git 迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub 网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至 GitHub,包括 jQuery,PHP,Ruby 等等。

历史就是这么偶然,如果不是当年 BitMover 公司威胁 Linux 社区,可能现在我们就没有免费而超级好用的 Git 了。

安装

Linux 好像是自带的,如果不自带用 apt 或者 yum 应该是能安装的。

windows系统可以去 https://git-scm.com/ 下载安装。

Git的四个工作区

Git本地有四个工作区域:工作录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory),git仓库(Remote Directory)。文件在这四个区域之间的转换关系如下:

  • Workspace:工作区,就是你平时存放项目代码的地方
  • Index/Stage:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
  • Repository:仓库区(或版本库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
  • Remote:远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换

在一个目录中,使用 git init 命令将此目录初始化为一个 git 工作目录。

我们此时在此目录新建文件或者删除文件并不会直接影响到仓库的实际状态,但是我们使用 git status 可以查看仓库代码和我们工作目录代码的区别。

git add 用于往缓存区添加文件,再通过 git commit 去提交文件到本地仓库。

git commit 的一般形式为 git commit -m 'commit Message' files

提交上去了之后此时再执行 git status 就会显示 nothing to commit, working tree clean,表示工作区和仓库区的文件已经完全一致。

工作区和版本库之间紧密联系,除了我们可以提交工作区的代码以外,如果我们无法恢复当前工作区的代码,我们还可以使用 git restore 或者 git checkout来恢复之前版本的一些文件。

Git文件的四种状态

管理文件的三种状态

Git的工作流程一般是这样的:

  • 在工作目录中添加、修改文件。
  • 将需要进行版本管理的文件放入暂存区域。
  • 将暂存区域的文件提交到Git仓库。

因此,Git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)

文件的四种状态

版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上。

GIT不关心文件两个版本之间的具体差别,而是关心文件的整体是否有改变,若文件被改变,在添加提交时就生成文件新版本的快照,而判断文件整体是否改变的方法就是用SHA-1算法计算文件的校验和。

  1. Untracked:未跟踪,此文件在文件夹中,但并没有加入到git库,不参与版本控制.通过 git add 状态变为Staged
  2. Unmodify:文件已经入库,未修改,即版本库中的文件快照内容与文件夹中完全一致.这种类型的文件有两种去处,如果它被修改,而变为Modified,如果使用 git rm 移出版本库,则成为Untracked文件
  3. Modified:文件已修改,仅仅是修改,并没有进行其他的操作.这个文件也有两个去处,通过git add可进入暂存staged状态,使用git checkout则丢弃修改过,返回到unmodify状态,这个git checkout即从库中取出文件,覆盖当前修改
  4. Staged:暂存状态.执行git commit则将修改同步到库中,这时库中的文件和本地文件又变为一致,文件为Unmodify状态,执行 git reset HEAD filename 取消暂存,文件状态为Modified

如下图所示就很清晰地描述了文件创建到被添加到仓库一个状态的变化。

  1. 新建文件—>Untracked
  2. 使用add命令将新建的文件加入到暂存区—>Staged
  3. 使用commit命令将暂存区的文件提交到本地仓库—>Unmodified
  4. 如果对Unmodified状态的文件进行修改—> modified
  5. 如果对Unmodified状态的文件进行remove操作—>Untracked