2.2 第一个Git项目
在这里,我们建议你最好能为接下来的Git测试单独开辟一个项目。总之应先从一个简单的小项目开始。在我们这个小小的示例项目中,first-steps目录下只有两个文本文件,如图2.1所示。
图2.1 我们的示例项目
在开始摆弄这个玩具项目之前,我们建议你最好先做一个备份!尽管在Git中,想要造成永久性的删除或破坏也不是件容易的事情,而且每当你要做某些“危险”动作的时候,Git通常也会发出相应的警告消息。但是,有备无患总是好的。
2.2.1 创建版本库
现在,我们首先需要创建一个版本库,用于存储该项目本身及其历史。为此,我们需要在该项目目录中使用init命令。对于一个带版本库的项目目录,我们通常称之为工作区。
> cd /projects/first-steps
> git init
Initialized empty Git repository in /projects/first-steps/.git/
init命令会在上述目录中创建一个名为.git的隐藏目录,并在其中创建一个版本库。但请注意,该目录在Windows资源管理器或Mac Finder中可能是不可见的。
图2.2 本地版本库所在的目录
2.2.2 首次提交
接下来,我们需要将foo.txt和bar.txt这两个文件添加到版本库中去。在Git中,我们通常将项目的一个版本称之为一次提交,但这要分两个步骤来实现。第一步,我们要先用add命令来确定哪些文件应被包含在下次提交中。第二步,再用commit命令将修改传送到版本库中,并赋予该提交一个散列值以便标识这次新提交。在这里,我们的散列值为2f43cd0,但可能会有所不同,因为该值取决于文件内容。
> git add foo.txt bar.txt
> git commit --message "Sample project imported."
master (root-commit) 2f43cd0] Sample project imported.
2 files changed, 2 insertions(+), 0 deletions(-)
create mode 100644 bar.txt
create mode 100644 foo.txt
2.2.3 检查状态
现在,我们来修改一下foo.txt文件的内容,先删除bar.txt文件,再添加一个名为bar.html的新文件。然后,status命令就会显示出该项目自上次提交以来所发生的所有修改。请注意,新文件bar.html在这里被标示成了未跟踪状态,这是因为我们还没有用add命令将其注册到版本库。
> git status
# On branch master
# Changed but not updated:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in
# working directory)
#
# deleted: bar.txt
# modified: foo.txt
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# bar.html
no changes added to commit (use "git add" and/or "git commit -a")
如果我们还想看到更多细节性的内容,也可以通过diff命令来显示其每个被修改的行。当然。有很多人可能会觉得diff的输出是个非常难读的东西。幸运的是,在这一领域,我们有许多工具和开发环境可用,它们可以将这一切显示得更为清晰(见图2.3)。
图2.3 图形工具(kdiff3)中的Diff报告
> git diff foo.txt
diff --git a/foo.txt b/foo.txt
index 1910281..090387f 100644
--- a/foo.txt
+++ b/foo.txt
@@ -1 +1 @@
-foo
\ No newline at end of file
+foo foo
\ No newline at end of file
2.2.4 提交修改
接下来,所有的修改都必须要先被归档成一次新的提交。我们要对修改过的文件和新文件执行add命令,并对要删除的文件使用rm命令。
> git add foo.txt bar.html
> git rm bar.txt
rm 'bar.txt'
现在再次调用status命令,我们会看到所有的修改已经被纳入了下一次提交中。
> git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: bar.html
# deleted: bar.txt
# modified: foo.txt
#
然后用commit命令提交这些修改。
> git commit --message "Some changes."
[master 7ac0f38] Some changes.
3 files changed, 2 insertions(+), 2 deletions(-)
create mode 100644 bar.html
delete mode 100644 bar.txt
2.2.5 显示历史
log命令可用来显示项目的历史,所有提交都会按时间顺序被降序排列出来。
> git log
commit 7ac0f38f575a60940ec93c98de11966d784e9e4f
Author: Rene Preissel <rp@eToSquare.de>
Date: Thu Dec 2 09:52:25 2010 +0100
Some changes.
commit 2f43cd047baadc1b52a8367b7cad2cb63bca05b7
Author: Rene Preissel <rp@eToSquare.de>
Date: Thu Dec 2 09:44:24 2010 +0100
Sample project imported.