安路的技术博客

Nothing in life is to be feared. It is only to be understood

Git起步

| Comments

背景

当今世界,难以想象有创意的人会在没有备份策略的情况下启动一个项目。数据是短暂的,容易丢失,例如,通过一次错误的代码变更或者一次灾难性的硬盘崩溃。所以说,在整个工作中持续性的备份和存档是非常明智的。

Git就是一个功能强劲的版本管理工具,它比svn要优秀很多。

  • 有助于分布式开发
  • 能够胜任上千开发人员协同工作
  • 性能优异
  • 保持完整性和可靠性
  • 强化责任
  • 原子事务
  • 支持并且鼓励基于分支的开发
  • 免费自由

我用的是Mac电脑,系统默认已经安装了Git,如果是其它系统,请百度安装。

安装好了之后,打开终端,输入git,Git就会不带任何参数的列出常用的命令

$git

如图:

如果想要得到Git版本号,输入

$ git --version

Git快速入门

为了学习Git,让我们新建一个版本库,添加一些内容。 有两种建立Git版本库的基础技术,可以从头开始创建,用现有的内容填充它,或者可以clong一个已有的版本库。从一个空的版本库开始比较简单,让我们开始吧。

创建初始版本库

在~/learnGit目录创建你的文件,并把它放到Git版本库中。如果你没有learnGit目录,那就新建一个

mkdir learnGit
cd learnGit
echo "Hello world" > index.html

执行 git init,将learnGit目录转化为版本库,为了显示目录是一个Git版本库,git init命令创建了一个隐藏目录,在项目的顶层目录,名为.git.

将文件添加到版本库

$git add index.html

在add之后,git知道index.html这个文件是要留在版本库里的,然后到目前为止,git还只是暂存(staged)了这个文件,这是提交之前的中间步骤.Git将add和commit这两步分开,试想一下,如果在你的每一次添加,移除或更改一个文件的时候都要更新版本库,那该多么频繁啊和费时啊。相反,多次临时的步骤,可以 批处理,来保持版本库是稳定和一致的。 远行 git status命令,显示当前git 状态

  git status
1
2
3
4
5
6
7
8
9
10
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

  index.html

nothing added to commit but untracked files present (use "git add" to track)

这个命令显示新文件 index.html将在下一次提交的时候添加到版本库中,除了目录和文件内容的实际变化,git还会在每次提交的时候记录其它一些元数据,包括日志消息和作出变更的作者。

配置提交作者

在对版本库做多次提交之前,你应该建立一些基本的环境和配置选项。最为基本的命令,Git必须知道你的名字和email.

你可以用git config命令配置文件里的保存你的身份

1
2
$ git config user.name "Jony"
$ git config user.email "jdl@example.com"

再次提交

为了显示更多Git特性,让我们做一些修改,在这个版本库创建一个复杂的变更历史。 来提交一次对index.html文件的修改,

$ cd learnGit
#编辑index.html
$ cat index.html
1
2
3
 <html>
  chnia !
  </html>
$ git commit index.html

因为这个文件已经添加到版本库中了,所以不用再次 add file.此外挡在命令行里直接提交一个命名的文件时,文件的变更会自动捕获。当你提交成功之后,版本库里有两个版本的index.html了。

查看提交

git log 命名会产生版本库里一系列单独的提交的历史

    $ git log

版本库内文件的删除和重命名

从版本库里删除一个文件和添加一个文件是类似的,除了使用的命令是 git rm.假设你的版本中有个 readme.txt,你可以这样做

    $ git rm readme.txt
    git commit -m "remove a file"

删除需要两步:git rm表示你想要删除这个文件的意图并暂存这个变更,接着git commit在版本库里实现这个变更。

重命名文件语法是这样的:

$ git mv foo.html bar.html
$ git commit -m "Moved foo to bar"

创建版本库副本

1
2
$ cd ~
$ git clone learnGit gitDemo

使用clone命名就能克隆一个版本库副本,后面的位置可以自定义。一旦复制版本库,就可以修改这个复制版本,做出新的提交,查看它的日志和历史等。这是一个有着完整历史的版本库。

Git基本概念

版本库

Git版本库只是一个简单的数据库,其中包含所有用来维护与管理项目的修订版本和历史的信息,在版本库中,Git维护两个主要的数据结构:对象库和索引,所有这些版本数据库存放在工作目录根目录下一个名为.git的隐藏的目录中。对象库在复制操作的时候进行有效的复制,这也是用来支持完全分布式VCS的一种技术。索引的是暂时的信息,对版本库来说是私有的。

Git对象库

对象库是git版本库实现的心脏。它包含你的原始数据文件和所有的日志信息,作者信息,日期,以及所有的分支信息。

索引

索引是一个临时的,动态的二进制文件,它描述整个版本库的目录结构。更具体的说,索引捕获项目在某个时刻的整体结构的一个版本。索引使得开发的推进与提交的变更之间能够分离开来。 下面是它的工作原理

作为开发人员,你通过执行Git命令在索引中暂存(Stage)变更。变更通常是添加,删除或者编辑某个文件。索引会记住变更和保存文件,保障他们的安全直到你准备好提交了。因此索引支持一个有你主导的从复杂的版本库状态到一个可推测的更好的状态的过渡。

图解 这是我的工作目录

当我执行 git add命令的时候,它会提交到索引区,此时还没有到数据库

当我执行 git commit命名的时候,索引中的文件会从暂存区提交版本库中,此时目录是clean的。

Comments