GIT (分布式版本控制系统)
一.GIT简介:
Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
特点:
分布式相比于集中式的最大区别在于开发者可以提交到本地,每个开发者通过克隆(git clone),在本地机器上拷贝一个完整的Git仓库。
下图是经典的git开发过程。
近乎所有操作都是本地执行
在 Git 中的绝大多数操作都只需要访问本地文件和资源,一般不需要来自网络上其它计算机的信息。 如果你习惯于所有操作都有网络延时开销的集中式版本控制系统,Git 在这方面会让你感到速度之神赐给了 Git 超凡的能量。 因为你在本地磁盘上就有项目的完整历史,所以大部分操作看起来瞬间完成。
举个例子,要浏览项目的历史,Git 不需外连到服务器去获取历史,然后再显示出来——它只需直接从本地数据库中读取。 你能立即看到项目历史。 如果你想查看当前版本与一个月前的版本之间引入的修改,Git 会查找到一个月前的文件做一次本地的差异计算,而不是由远程服务器处理或从远程服务器拉回旧版本文件再来本地处理。
这也意味着你离线或者没有 v*n 时,几乎可以进行任何操作。 如你在飞机或火车上想做些工作,你能愉快地提交,直到有网络连接时再上传。 如你回家后 v*n 客户端不正常,你仍能工作。 使用其它系统,做到如此是不可能或很费力的。 比如,用 Perforce,你没有连接服务器时几乎不能做什么事;用 Subversion 和 CVS,你能修改文件,但不能向数据库提交修改(因为你的本地数据库离线了)。 这看起来不是大问题,但是你可能会惊喜地发现它带来的巨大的不同。
Git 保证完整性
Git 中所有数据在存储前都计算校验和,然后以校验和来引用。 这意味着不可能在 Git 不知情时更改任何文件内容或目录内容。 这个功能建构在 Git 底层,是构成 Git 哲学不可或缺的部分。 若你在传送过程中丢失信息或损坏文件,Git 就能发现。
Git 用以计算校验和的机制叫做 SHA-1 散列(hash,哈希)。 这是一个由 40 个十六进制字符(0-9 和 a-f)组成的字符串,基于 Git 中文件的内容或目录结构计算出来。 SHA-1 哈希看起来是这样:
24b9da6552252987aa493b52f8696cd6d3b00373
Git 中使用这种哈希值的情况很多,你将经常看到这种哈希值。 实际上,Git 数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。
Git 一般只添加数据
你执行的 Git 操作,几乎只往 Git 数据库中增加数据。 很难让 Git 执行任何不可逆操作,或者让它以任何方式清除数据。 同别的 VCS 一样,未提交更新时有可能丢失或弄乱修改的内容;但是一旦你提交快照到 Git 中,就难以再丢失数据,特别是如果你定期的推送数据库到其它仓库的话
三种状态
好,请注意。 如果你希望后面的学习更顺利,记住下面这些关于 Git 的概念。 Git 有三种状态,你的文件可能处于其中之一:
已提交(committed)
已修改(modified)
已暂存(staged)
已提交表示数据已经安全的保存在本地数据库中。 已修改表示修改了文件,但还没保存到数据库中。 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
由此引入 Git 项目的三个工作区域的概念:Git 仓库、工作目录以及暂存区域。
Git 仓库目录是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。
工作目录是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。
暂存区域是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。 有时候也被称作`‘索引’',不过一般说法还是叫暂存区域。
基本的 Git 工作流程如下:
-
在工作目录中修改文件。
-
暂存文件,将文件的快照放入暂存区域。
-
提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。
如果 Git 目录中保存着特定版本的文件,就属于已提交状态。 如果作了修改并已放入暂存区域,就属于已暂存状态。 如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。
Git的功能特性:
从一般开发者的角度来看,git有以下功能:
1、从服务器上克隆完整的Git仓库(包括代码和版本信息)到单机上。
2、在自己的机器上根据不同的开发目的,创建分支,修改代码。
3、在单机上自己创建的分支上提交代码。
4、在单机上合并分支。
5、把服务器上最新版的代码fetch下来,然后跟自己的主分支合并。
6、生成补丁(patch),把补丁发送给主开发者。
7、看主开发者的反馈,如果主开发者发现两个一般开发者之间有冲突(他们之间可以合作解决的冲突),就会要求他们先解决冲突,然后再由其中一个人提交。如果主开发者可以自己解决,或者没有冲突,就通过。
8、一般开发者之间解决冲突的方法,开发者之间可以使用pull 命令解决冲突,解决完冲突之后再向主开发者提交补丁。
从主开发者的角度(假设主开发者不用开发代码)看,git有以下功能:
1、查看邮件或者通过其它方式查看一般开发者的提交状态。
2、打上补丁,解决冲突(可以自己解决,也可以要求开发者之间解决以后再重新提交,如果是开源项目,还要决定哪些补丁有用,哪些不用)。
3、向公共服务器提交结果,然后通知所有开发人员。
优点:
1.适合分布式开发,强调个体。
2.公共服务器压力和数据量都不会太大。
3.速度快、灵活。
4.任意两个开发者之间可以很容易的解决冲突。
5.离线工作。
二.实验部署;
实验环境: 安装 git
[[email protected] ~]# yum install git -y
创建代码仓库:【初始化空的 Git 版本库于 /root/demo/.git/】
[[email protected] ~]# mkdir demo
[[email protected] ~]# cd demo/
[[email protected] demo]# git init
在现有目录中初始化仓库
如果你打算使用 Git 来对现有的项目进行管理,你只需要进入该项目目录并输入:
[[email protected] demo]# git init
Initialized empty Git repository in /root/demo/.git/
[初始化空的 Git 版本库于 /root/demo/.git/]
该命令将创建一个名为 .git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的骨干。 但是,在这个时候,我们仅仅是做了一个初始化的操作,你的项目里的文件还没有被跟踪
Git 自带一个 git config 的工具来帮助设置控制 Git 外观和行为的配置变量。 这些变量存储在三个不同的位置:
-
/etc/gitconfig文件: 包含系统上每一个用户及他们仓库的通用配置。 如果使用带有--system选项的git config时,它会从此文件读写配置变量。 -
~/.gitconfig或~/.config/git/config文件:只针对当前用户。 可以传递--global选项让 Git 读写此文件。 -
当前使用仓库的 Git 目录中的
config文件(就是.git/config):针对该仓库。
每一个级别覆盖上一级别的配置,所以 .git/config 的配置变量会覆盖 /etc/gitconfig 中的配置变量
检查配置信息
如果想要检查你的配置,可以使用 git config --list 命令来列出所有 Git 当时能找到的配置。
$ git config --list
user.name=John Doe
[email protected]
color.status=auto
color.branch=auto
color.interactive=auto
color.diff=auto
...
你可能会看到重复的变量名,因为 Git 会从不同的文件中读取同一个配置(例如:/etc/gitconfig 与 ~/.gitconfig)。 这种情况下,Git 会使用它找到的每一个变量的最后一个配置。
你可以通过输入 git config <key>: 来检查 Git 的某一项配置
$ git config user.name
John Doe
检查当前文件状态
要查看哪些文件处于什么状态,可以用 git status 命令。 此时说明没有在缓存区的文件,以及没有还未提交到马缓存区的文件。
$ git status
# On branch master
#
# Initial commit
#
nothing to commit (create/copy files and use "git add" to track)
[# 位于分支 master
#
# 初始提交
#
无文件要提交(创建/拷贝文件并使用 "git add" 建立跟踪)]
此时我们来创建一个文件并且写入内容:
[[email protected] demo]# touch file1
[[email protected] demo]# echo xys > file1
[[email protected] demo]# ls
file1
跟踪新文件
使用命令 git add 开始跟踪一个文件。例如;跟踪file1
[[email protected] demo]# git add file1
此时再运行 git status 命令,会看到 文件已被跟踪,并处于暂存状态:
[[email protected] demo]# git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: file1
#
精简输出状态; git status -s
状态说明;
git status -s
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt
新添加的未跟踪文件前面有 ?? 标记
新添加到暂存区中的文件前面有 A 标记
修改过的文件前面有 M 标记。 你可能注意到了 M 有两个可以出现的位置,
出现在右边的 M 表示该文件被修改了但是还没放入暂存区,
出现在靠左边的 M 表示该文件被修改了并放入了暂存区。
[[email protected] demo]# touch file2
[[email protected] demo]# echo xys > file2
[[email protected] demo]# git status -s file2
?? file2
[[email protected] demo]# git add file2
[[email protected] demo]# git status -s file2
A file2
[[email protected] demo]# echo 123 >> file2
[[email protected] demo]# git status -s file2
AM file2
[[email protected] demo]# git add file2
[[email protected] demo]# git status -s file2
A file2
[[email protected] demo]# touch file3
[[email protected] demo]# echo shaung > file3
[[email protected] demo]# git status -s file3
?? file3
[[email protected] demo]# git add file3
[[email protected] demo]# echo shuang >> file3
[[email protected] demo]# git status -s file3
AM file3
[[email protected] demo]# git commit -m "add file3"
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: file3
#
no changes added to commit (use "git add" and/or "git commit -a")
[[email protected] demo]# git status -s file3
M file3
[[email protected] demo]# git add file3
[[email protected] demo]# git status -s file3
M file3
[[email protected] demo]# echo shuangbao >> file3
[[email protected] demo]# git status -s file3
MM file3
[[email protected] demo]# git add file3
[[email protected] demo]# git commit -m "add file3"
[master 4fadda1] add file3
1 file changed, 1 insertion(+)
提交文件
git add 添加到版本库;
add 之后先进入暂存区域
commit 提交,默认提交所有在暂存储区域的文件 你也可以在 commit 命令后添加 -m 选项,将提交信息与命令放在同一行。
[[email protected] demo]# git commit -m "add file2"
[master (root-commit) dcfc53e] add file2
2 files changed, 3 insertions(+)
create mode 100644 file1
create mode 100644 file2
添加描述
--global 使用全局配置文件
内容可自行添加。
[[email protected] demo]# git config --global user.name "xys"
[[email protected] demo]# git config --global user.qq "1208478994"
必须加上邮箱和姓名:
[[email protected] demo]# git commit -m file2
*** Please tell me who you are.
Run
git config --global user.email "[email protected]"
git config --global user.name "Your Name"
to set your account's default identity.
Omit --global to set the identity only in this repository.
fatal: unable to auto-detect email address (got '[email protected](none)')
设置忽略文件:
编辑文件: .gitignore
[[email protected] ~]# cp .bashrc demo/
[[email protected] ~]# cd demo/
[[email protected] demo]# ls
file1
[[email protected] demo]# git status -s
?? .bashrc
[[email protected] demo]# ls
file1
[[email protected] demo]# vim .gitignore
.*
【忽略所有.文件】
[[email protected] demo]# git status -s