Linux进阶之Git分布式版本控制系统篇
一、Git介绍
Git(读音为/gɪt/。)是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,所以,工作的时候就不需要联网了,因为版本库都是在自己的电脑 上。现在每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
主要有如下特点:
1. 版本控制(可以根据需要随意切换到任何版本)
2. 分布式
3. 工作过程是将服务器上的代码下载到本地,本地开发完成后,在提交到服务器端
git相比于svn功能更加的强大,命令也很多。本篇博客将详细介绍一些常用命令的使用操作。
二、Git和SVN的对比
1. git是分布式的,svn是集中式的。(最核心)
2. git是每个历史版本都存储完整的文件,便于恢复,svn是存储差异文件,历史版本不可恢复。(核心)
3. git可离线完成大部分操作,svn则不能。
4. git有着更优雅的分支和合并实现。
5. git有着更强的撤销修改和修改历史版本的能力
6. git速度更快,效率更高。
基于以上区别,git有了很明显的优势,特别在于它具有的本地仓库。
三、Git几个概念
1、工作目录
工作目录是对项目的某个版本独立提取出来的内容。这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。
2、暂存区域
是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。有时候也被称作`‘索引’',不过一般说法还是叫暂存区域。
3、Git 仓库目录
是Git 用来保存项目的元数据和对象数据库的地方。这是 Git 中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。
四、Git工作流程
基本的 Git 工作流程如下:
在工作目录中修改文件 > 暂存文件,将文件的快照放入暂存区域 > 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。
如果 Git 目录中保存着的特定版本文件,就属于已提交状态。如果作了修改并已放入暂存区域,就属于已暂存状态。如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。
五、Git的安装
第一种安装方式:yum进行安装
[root@ren ~]# yum install git -y
第二种安装方式:编译安装
第一步:上传安装包并解压
[root@ren ~]# rz
[root@ren ~]# ls | grep git
git-v2.7.4.zip
[root@ren ~]# unzip git-v2.7.4.zip
第二步:安装依赖
[root@ren git-2.7.4]# yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker -y
第三步:进入解压下目录下并执行编译
[root@ren git-2.7.4]# make prefix=/usr/local/git all
[root@ren git-2.7.4]# make prefix=/usr/local/git install
第四步:导入二进制程序
[root@ren git-2.7.4]# rm -rf /usr/bin/git
[root@ren git-2.7.4]# ln -s /usr/local/git/bin/git /usr/bin/git
[root@ren git-2.7.4]# git --version
git version 2.7.4
六、git常用选项
add 把工作目录中的内容添加到暂存区域
branch 查看和创建分支
checkout 切换分支和撤销(暂存区域的版本回滚)
clone 克隆远程仓库
commit 把暂存区域的内容提交到仓库
init 初始化工作目录(初始化完成会生成一个隐藏目录.git)
log 查看版本提交信息(日志)
merge 合并分支内容
pull 拉取远程仓库
push 把本地内容推送到远程仓库
reset 撤销操作(重置)(仓库的版本回滚)
status 查看当前文件所处的状态
reflog 查看所有版本commitID
七、Git使用演示
第一步:创建和初始化git工作目录
[root@ren5 ~]# mkdir /ren #创建工作目录
[root@ren5 ~]# cd /ren
[root@ren5 ren]# git init #初始化工作目录
初始化空的 Git 版本库于 /ren/.git/
[root@ren5 ren]# ls -a
. .. .git
第二步:创建文件进行测试
[root@ren5 ren]# echo "123123123" > test #创建测试文本
[root@ren5 ren]# ls
test
[root@ren5 ren]# git add . #把工作目录下的所有文件提交到暂存区域
[root@ren5 ren]# git commit -m "version1" #把暂存区域的内容提交到仓库并标识为version1版本(-m为message)
[root@ren5 ren]# git config --global user.email "you@example.com" #根据提示进行认证
[root@ren5 ren]# git config --global user.name "Your Name"
[root@ren5 ren]# git commit -m "version1" #再次进行提交
[master(根提交) 07cc74c] version1
1 file changed, 1 insertion(+)
create mode 100644 test
第三步:查看版本信息
[root@ren5 ren]# git log
commit 07cc74cca27f37439bdbd9551559156a5135ebb6
Author: Your Name <you@example.com>
Date: Fri Aug 16 18:54:39 2019 +0800
version1
第四步:再次提交不同内容
[root@ren5 ren]# echo "456456" >> test
[root@ren5 ren]# git add .
[root@ren5 ren]# git commit -m "version2"
[master 5290ec9] version2
1 file changed, 1 insertion(+)
[root@ren5 ren]# echo "789789" >> test
[root@ren5 ren]# git add .
[root@ren5 ren]# git commit -m "version3"
[master 5651405] version3
1 file changed, 1 insertion(+)
[root@ren5 ren]# git log
commit 5651405f5af1a8663e90cb09d342393e8b3d1cda
Author: Your Name <you@example.com>
Date: Fri Aug 16 19:04:35 2019 +0800
version3
commit 5290ec95b3f66981c0e9944db246caa2e79490ef
Author: Your Name <you@example.com>
Date: Fri Aug 16 19:04:05 2019 +0800
version2
commit 07cc74cca27f37439bdbd9551559156a5135ebb6
Author: Your Name <you@example.com>
Date: Fri Aug 16 18:54:39 2019 +0800
version1
第五步:切换至test及version1版本
[root@ren5 ren]# cat test #现在位于version3版本
123123123
456456
789789
[root@ren5 ren]# git reset --hard 07cc74cca27f37439 #切换至版本1,hard后面的是版本1的commit的值(可以复制一部分)
HEAD 现在位于 07cc74c version1
[root@ren5 ren]# cat test #已切换至版本1
123123123
[root@ren5 ren]# git log
commit 07cc74cca27f37439bdbd9551559156a5135ebb6
Author: Your Name <you@example.com>
Date: Fri Aug 16 18:54:39 2019 +0800
version1
第六步:恢复至版本2(version2)
[root@ren5 ren]# git reflog #首先使用git reflog可以查看commit值(reflog回流)
07cc74c HEAD@{0}: reset: moving to 07cc74cca27f37439
5651405 HEAD@{1}: commit: version3
5290ec9 HEAD@{2}: commit: version2
07cc74c HEAD@{3}: commit (initial): version1
[root@ren5 ren]# git reset --hard 5290ec9 #恢复的时候指定conmit值
HEAD 现在位于 5290ec9 version2
[root@ren5 ren]# git log #查看发现已经恢复到v2版本
commit 5290ec95b3f66981c0e9944db246caa2e79490ef
Author: Your Name <you@example.com>
Date: Fri Aug 16 19:04:05 2019 +0800
version2
commit 07cc74cca27f37439bdbd9551559156a5135ebb6
Author: Your Name <you@example.com>
Date: Fri Aug 16 18:54:39 2019 +0800
version1
[root@ren5 ren]# cat test
123123123
456456
八、不同阶段的回滚(撤销)
1、工作目录回滚
[root@ren5 ren]# cat test
123123123
[root@ren5 ren]# git log #目前处于版本1
commit 07cc74cca27f37439bdbd9551559156a5135ebb6
Author: Your Name <you@example.com>
Date: Fri Aug 16 18:54:39 2019 +0800
version1
[root@ren5 ren]# echo "你好,GIT" >> test #写入内容
[root@ren5 ren]# git status #查看文件状态
# 位于分支 master
# 尚未暂存以备提交的变更:
# (使用 "git add <file>..." 更新要提交的内容)
# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
# 修改: test
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@ren5 ren]# git checkout -- test #进行工作目录状态撤销
[root@ren5 ren]# cat test #再次查看文本发现写入内容已经没有
123123123
2、暂存区域回滚
[root@ren5 ren]# echo "你好,GIT" >> test #写入内容
[root@ren5 ren]# git add . #提交至暂存区域
[root@ren5 ren]# git status #查看文件状态
# 位于分支 master
# 要提交的变更:
# (使用 "git reset HEAD <file>..." 撤出暂存区)
# 修改: test
[root@ren5 ren]# git reset HEAD test #不提交至仓库
重置后撤出暂存区的变更:
M test
[root@ren5 ren]# git status #文件被退回到工作目录中
# 位于分支 master
# 尚未暂存以备提交的变更:
# (使用 "git add <file>..." 更新要提交的内容)
# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
# 修改: test
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@ren5 ren]# git checkout -- test #从工作目录中撤销
[root@ren5 ren]# cat test
123123123
3、版本管理
我们知道回退版本需要用到commit值但是现在通过git log已经看不到v4的commit值了,现在怎么办呐?
可以通过git reflog查看所有的历史操作找到v4前面的值即可
九、Git分支
几乎所有的版本控制系统都以某种形式支持分支。使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。
Git 处理分支的方式可谓是难以置信的轻量,创建新分支这一操作几乎能在瞬间完成,并且在不同分支之间的切换操作也是一样便捷。与许多其它版本控制系统不同,Git 鼓励在工作流程中频繁地使用分支与合并,哪怕一天之内进行许多次。
第一步:查看分支
[root@ren5 ren]# git branch
* master # *表示当前所处的分支位置(在提交过文件之后才会有分支)
第二步:创建新分支
[root@ren5 ren]# git branch ren
[root@ren5 ren]# git branch
* master
ren
第三步:切换分支
[root@ren5 ren]# git checkout ren
切换到分支 'ren'
[root@ren5 ren]# git branch
master
* ren
第四步:写入内容至文件并提交(必须提交)
[root@ren5 ren]# echo "hello,hello" >> test
[root@ren5 ren]# git add .
[root@ren5 ren]# git commit -m "version4"
[ren ec98de6] version4
1 file changed, 1 insertion(+)
[root@ren5 ren]# cat test
123123123
456456
789789
hello,hello
第五步:切换至主分支
[root@ren5 ren]# git checkout master
切换到分支 'master'
[root@ren5 ren]# git branch
* master
ren
[root@ren5 ren]# cat test #查看文件内容,并没有子分支刚才提交的内容
123123123
[root@ren5 ren]# git log
commit 07cc74cca27f37439bdbd9551559156a5135ebb6
Author: Your Name <you@example.com>
Date: Fri Aug 16 18:54:39 2019 +0800
version1
第六步:合并分支(合并的是各个分支的内容)
[root@ren5 ren]# git merge ren (默认会将merge后跟的分支合并到当前所处的分支下)
更新 07cc74c..ec98de6
Fast-forward
test | 3 +++
1 file changed, 3 insertions(+)
[root@ren5 ren]# cat test #合并之后发现现在主分支也可以看到刚才子分支添加的内容了
123123123
456456
789789
hello,hello
[root@ren5 ren]# git log
commit ec98de6da776dfedfd7c2baf05388bfe26906c2d
Author: Your Name <you@example.com>
Date: Fri Aug 16 20:13:43 2019 +0800
version4