Management,简称SCM)是一种记录一个或多个文件的内容修订历史,以便将来查阅特定版本文件修订情况的软件系统。
采用版本控制系统(VCS)是个明智的选择。有了它你就可以将某个文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态。你可以比较文件的变化细节,查出是谁最后修改了什么地方从而造成某些怪异问题,又是谁在何时报告了某个功能缺陷,等等。使用版本控制系统通常还意味着,就算你胡来搞砸了整个项目,把文件改的改,删的删,你也可以轻松恢复到原先的样子。而由此额外增加的工作量却微乎其微。
虽然有多种可供选择的版本控制系统,但 Rails社区对Git情有独钟。Git起初由Linus Torvalds(Linux操作系统之父)开发,用来管理Linux内核代码。把我们的Rails代码置于版本控制系统Git的管理之下是非常有必要的,这几乎是Rails世界中的普遍做法,这样做可以让你更容易地管理、共享和发布应用程序。
6.2.1 Git安装和设置
一、安装Git
二、初次运行 Git 前的配置
安装好GIT后,应该先对Git做一些系统设置,这些设置是全局性的,每台电脑做一次就行了。
$ git config --global user.name "Shen Huafeng" |
$ git config --global user.email shenhuafeng@sxvtc.com |
这两行命令分别用于设置开发者的姓名和电子邮件地址。
当我们确认提交变更之后,Git会要求提交者输入变更确认信息,用于对变更情况进行说明。如果我们已经习惯于使用某个编辑器,我们可以设置下面的选项:
$ git config --global core.editor "mate -w" |
Textmate是MAC中最著名的文本编辑器,这里 -w 选项的作用是让编辑器与shell保持附着关系而不是立即脱离。在 Ubuntu中,我们可以设置默认使用 gedit 来输入确认信息。
$ git config --global core.editor gedit |
默认情况下,Git全局配置信息存放在用户主目录中的.gitconfig 文件中。
要检查已有的配置信息,可以使用 git config --list 命令:
user.email=shenhuafeng@sxvtc.com |
6.2.2 使用 Git
下面我们先创建一个博客项目 blog,把项目的初始代码加入到 git 仓库中。转移到工作目录works,运行rails命令创建blog项目。
通过rails命令,我们创建了博客系统的初始版本。Git系统的 init 命令用来初始化一个新的git版本库,版本库初始化完成后,会在当前目录下会建立一个名为 .git 的隐藏目录,所有 Git 需要的数据和资源都存放在这个目录中。
一、git init 初始化版本库
Initialized empty Git repository in /home/student/works/blog/.git/ |
git init 命令执行完成后的提示信息说明在 /Users/shenhf/works/blog/.git/ 中初始化了一个空的git版本库。现在,我们已经在blog项目主目录中创建了一个git版本库。不过目前仅仅是完成了版本库的初始化,我们还没有开始跟踪、管理项目中的任何一个文件。
注意: Rails项目的git版本库都建立在 Rails项目的主目录中且每个项目建立一个独立的版本库。在linux或Mac操作系统中,文件名或者目录名前的 ‘.’ 表示隐藏文件或目录。ls 命令的 -a 选项用于显示系统隐藏的文件或目录。
二、.gitignore 文件
接下来需要把项目文件纳入到版本控制库中。Git默认跟踪项目中所有文件的变更,但是有一些文件(如Rails日志文件等)我们不希望对它进行跟踪,怎么样让Git忽略这些文件?Git使用一个简单的方法,在项目根目录中建立一个.gitignore的文件,让.gitignore文件告诉Git哪些文件需要被忽略。如我们希望忽略 log/ 目录中所有 .log 为扩展名的日志文件,需要在.gitignore文件中包含一行 log/*.log(*号是通配符,在此表示所有.log为扩展名的文件)。其它需要忽略的文件也需要这样设置。
在blog项目目录中按上面的内容建立一个 .gitignore 文件。
三、建立blog项目的初始版本
对于任何一个文件,在 Git 内都只有三种状态:已提交(committed),已修改(modified)和已暂存(staged)。已提交表示该文件已经被安全地保存在本地数据库中了;已修改表示修改了某个文件,但还没有提交保存;已暂存表示把已修改的文件放在下次提交时要保存的清单中。
图 6.2.2-1 Git基本流程
基本的 Git 工作流程:
- 在工作目录中修改某些文件
- 使用 git add 命令对这些修改了的文件作快照,并保存到缓冲区中。
- 使用 git commit 命令提交更新,将保存在暂存区域的文件快照转储到 git 本地仓库中。
所以,我们可以从文件所处的位置来判断状态:如果是 git 仓库中保存着的特定版本文件,就属于已提交状态;如果作了修改并已放入缓冲区,就属于已暂存状态;如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。
git status 命令用来检查当前工作目录中的文件修改状态并提示用户如何操作。下面我们来检查一下 blog 项目的文件状态。
nothing added to commit but untracked files present (use "git add" to track) |
提示我们没有加入git版本控制系统的文件或目录。
(use "git add <file>..." to include in what will be committed) |
告诉我们使用 git add 命令把这些文件和目录加入到缓冲区以便将来提交到git仓库。下面我们用 git add . 命令告诉 Git 把这些文件和目录加入到缓冲区开始 blog 项目进行跟踪。
在这里 ‘.’ 表示当前目录,Git非常聪明,能自动递归添加文件并包含所有的子目录。git add 命令把项目文件(去掉 .gitignore 中定义的文件)添加到git 缓冲区中。现在我们再次运行git status命令观察有什么变化。
提示我们下面的这些文件可以提交到git仓库了。
(use "git rm --cached <file>..." to unstage) |
则提示我们使用 git rm --cached 命令可以把这些文件从缓冲区中移走。
接下来我们可以通过 git commit 命令把我们 blog 项目的初始代码提交到 git 仓库中了。
$ git commit -m "Initial commit" |
[master (root-commit) 46eda76] Initial commit |
42 files changed, 8487 insertions(+), 0 deletions(-) |
create mode 100644 README |
create mode 100644 Rakefile |
create mode 100644 app/controllers/application_controller.rb |
create mode 100644 app/helpers/application_helper.rb |
create mode 100644 config/boot.rb |
-m "Initial commit" 用来设置提交说明信息,Git 要求每次提交文件到版本库都要输入说明信息,这是非常重要的,这些信息能够告诉你自己和项目的其它成员项目发生了哪些改变。如果忽略 -m选项,git会自动打开前面 git config --global core.editor 命令中设定的编辑器,请你在编辑器中输入提交信息。
现在我们可以使用 git log命令来查看一下所有提交确认信息了。
commit d137739e7163d90c7ff98fd45b6290e2e21193ce |
Author: Shen Huafeng <shenhuafeng@sxvtc.com> |
Date: Tue Jun 8 19:30:15 2010 +0800 |
git log 命令会告诉我们谁在什么时候进行了commit操作以及文件变更的说明。