Git分布式版本控制系统(一)

一、Git简介

Git(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

听着版本控制系统很不明觉厉的一个东西,那到底是什么呢,我们接触过最原始,最典型的版本控制就是大学毕业写论文,论文是改了又改,反复好几个版本,总结特点有这么几个:

  • 各版本同时存在,并且每个版本都是单独的一个文件
  • 如果误删除就会永久失去
  • 如果想请多人帮忙修改,还需将文件打包分发

那下面学习的git就是很好的解决了版本控制上的一些麻烦,git是目前最有效,高速的从小到非常大的项目版本都可以很好控制。

主要有如下特点:

  • 版本控制
  • 分布式
  • 工作过程是将服务器上的代码下载到本地,本地开发完成后,在提交到服务器端

二、为什么说git是目前是好用的版本控制系统,我们来用svn和git做个比较就会发现

  1. git是分布式的,svn是集中式的。(最核心)
  2. git是每个历史版本都存储完整的文件,便于恢复,svn是存储差异文件,历史版本不可恢复。(核心)
  3. git可离线完成大部分操作,svn则不能。
  4. git有着更优雅的分支和合并实现。
  5. git有着更强的撤销修改和修改历史版本的能力
  6. git速度更快,效率更高。

基于以上区别,git有了很明显的优势,特别在于它具有的本地仓库。

三、Git中文件的三种状态

对于任何一个文件,在 Git 内都只有三种状态:已提交(committed),已修改(modified)和已暂存(staged)。已提交表示该文件已经被安全地保存在本地数据库中了;已修改表示修改了某个文件,但还没有提交保存;已暂存表示把已修改的文件放在下次提交时要保存的清单中。
在这里插入图片描述
由此我们看到 Git 管理项目时,文件流转的三个工作区域:Git 的工作目录,暂存区域,以及本地仓库。

基本的 Git 工作流程如下:
在工作目录中修改文件 > 暂存文件,将文件的快照放入暂存区域 > 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。

如果 Git 目录中保存着的特定版本文件,就属于已提交状态。如果作了修改并已放入暂存区域,就属于已暂存状态。如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态

四、安装 Git

1.yum安装Git
yum -y install git
2.编译安装
[root@ryan ~]# ls | grep git
git-2.7.4.zip

#解压
[root@ryan ~]# unzip git-2.7.4.zip 
[root@ryan ~]# ls | grep git               
git-2.7.4
git-2.7.4.zip
[root@ryan ~]# cd git-2.7.4

#安装依赖包
[root@ryan git-2.7.4]# yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker 

#编译安装
[root@ryan git-2.7.4]# make prefix=/usr/local/git all
[root@ryan git-2.7.4]# make prefix=/usr/local/git install
#导入二进制文件
[root@ryan git-2.7.4]# rm -rf /usr/bin/git
[root@ryan git-2.7.4]# ln -s /usr/local/git/bin/git /usr/bin/git
[root@ryan git-2.7.4]# git --version
git version 2.7.4
3.git常用选项介绍
  add        Add file contents to the index
  branch     List, create, or delete branches
  checkout   Checkout a branch or paths to the working tree
  clone      Clone a repository into a new directory
  commit     Record changes to the repository
  init       Create an empty Git repository or reinitialize an existing one
  log        Show commit logs
  merge      Join two or more development histories together
  mv         Move or rename a file, a directory, or a symlink
  pull       Fetch from and merge with another repository or a local branch
  push       Update remote refs along with associated objects
  reset      Reset current HEAD to the specified state
  rm         Remove files from the working tree and from the index
  show       Show various types of objects
  status     Show the working tree status

五、Git操作学习

1.简单操作学习

第一步:创建目录,并进入

[root@ryan ~]# mkdir /test
[root@ryan ~]# cd /test

第二步:初始化目录

[root@ryan test]# git init
Initialized empty Git repository in /test/.git/

第三步:创建一个测试文件并写入内容

[root@ryan test]# echo "1111" >> a.tt
[root@ryan test]# ls
a.tt

第四步:提交到暂存区再提交到库

[root@ryan test]# git add .      #提交当前所有文件到暂存区
[root@ryan test]# git commit -m "v1"   #提交到库文件版本v1
[master (root-commit) 95cb52f] v1
 1 file changed, 1 insertion(+)
 create mode 100644 a.tt

第五步:查看

[root@ryan test]# git log
commit 95cb52f8df998c13b4712279a77a55605588f8ae
Author: root <ryan@163.com>
Date:   Thu May 23 20:16:13 2019 +0800

    v1

第六步:往测试文件里面追加数据

[root@ryan test]# echo "2222" >> a.tt

第七步:提交

[root@ryan test]# git commit -m "v2"
[master 73a8608] v2
 1 file changed, 1 insertion(+)

第八步:在次查看

[root@ryan test]# git log
commit 73a8608b5afeeaa8c8b003b2f308c110ec3d1016
Author: root <ryan@163.com>
Date:   Thu May 23 20:21:18 2019 +0800

    v2

commit 95cb52f8df998c13b4712279a77a55605588f8ae
Author: root <ryan@163.com>
Date:   Thu May 23 20:16:13 2019 +0800

    v1

第九步:恢复到第v1版本

[root@ryan test]# git reset --hard HEAD~1
HEAD is now at 95cb52f v1
[root@ryan test]# git log
commit 95cb52f8df998c13b4712279a77a55605588f8ae
Author: root <ryan@163.com>
Date:   Thu May 23 20:16:13 2019 +0800

    v1

第十步:恢复到v2版本

[root@ryan test]# git reflog           #首先使用git reflog可以查看commit值
95cb52f HEAD@{0}: reset: moving to HEAD~1
73a8608 HEAD@{1}: commit: v2
95cb52f HEAD@{2}: commit (initial): v1
[root@ryan test]# git reset --hard 73a8608   #恢复的时候指定commit值
HEAD is now at 73a8608 v2
[root@ryan test]# git log         #查看发现   已经恢复到v2版本
commit 73a8608b5afeeaa8c8b003b2f308c110ec3d1016
Author: root <ryan@163.com>
Date:   Thu May 23 20:21:18 2019 +0800

    v2

commit 95cb52f8df998c13b4712279a77a55605588f8ae
Author: root <ryan@163.com>
Date:   Thu May 23 20:16:13 2019 +0800

    v1

2.撤销工作区的内容

第一步:创建一个文件并写入内容
[root@ryan test]# echo "test1" >> b.tt
[root@ryan test]# echo "test2" >> b.tt
[root@ryan test]# cat b.tt 
test1
test2

第二步:把这个文件添加到缓存区

[root@ryan test]# git add b.tt 

第三步:向文件追加内容
在包含.git的目录中,只要当前目录下的文件有修改都会自动进入工作区(该文件必须被commit过,否则无法追踪)
所以下面当往文件e.tt中添加test3的时候。b.tt这个文件就进入到了工作区了

  1. 文件进入工作区:包含.git隐藏文件的目录中,文件修改就会自动进入
  2. 文件进入缓存区:git add .
  3. 文件进入仓库:git commit -m ‘v1’
[root@ryan test]# echo "test3">>b.tt

第四步:查看工作区

[root@ryan test]# git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   b.tt

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:   b.tt

第五步:撤销工作区的内容

使用命令git checkout --filename 即可进行回滚

[root@ryan test]# cat b.tt 
test1
test2
test3
[root@ryan test]# git checkout -- b.tt   #数据回滚
[root@ryan test]# git status             #查看状态
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   b.tt

[root@ryan test]# cat b.tt              #查看文件内容,发现test3没了
test1
test2

3.撤销暂存区的内容
第一步:创建文件并进行提交

[root@ryan test]# echo "aaaa" > c.tt
[root@ryan test]# git add c.tt 
[root@ryan test]# git commit -m "v3"
[master 8cf843c] v3
 2 files changed, 3 insertions(+)
 create mode 100644 b.tt
 create mode 100644 c.tt
[root@ryan test]# git log
commit 8cf843c8b48f1791309fb162f59775119e4e11de
Author: root <ryan@163.com>
Date:   Thu May 23 20:50:00 2019 +0800

    v3

第二步:修改文件并加入到暂存区中
第一步一定要提交,才能看到效果

[root@ryan test]# echo "bbb">>c.tt
[root@ryan test]# echo "ccc">>c.tt
[root@ryan test]# git add c.tt 
[root@ryan test]# git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   c.tt

第三步:暂存区进行回退

[root@ryan test]# git reset HEAD c.tt 
Unstaged changes after reset:
M       c.tt
[root@ryan test]# 

第四步:工作区进行回滚
其实现在就已经回到了演示2中了
回退完成之后可以发现之前写的222和333 已经没有了

[root@ryan test]# git checkout -- c.tt 
[root@ryan test]# git status
On branch master
nothing to commit, working directory clean
[root@ryan test]# cat c.tt 
aaaa

4.撤销仓库中的内容
第一步:查看历史版本
我们现在处于v3中,现在希望回到v2中

[root@ryan test]# git log
commit 8cf843c8b48f1791309fb162f59775119e4e11de
Author: root <ryan@163.com>
Date:   Thu May 23 20:50:00 2019 +0800

    v3

commit 73a8608b5afeeaa8c8b003b2f308c110ec3d1016
Author: root <ryan@163.com>
Date:   Thu May 23 20:21:18 2019 +0800

    v2

commit 95cb52f8df998c13b4712279a77a55605588f8ae
Author: root <ryan@163.com>
Date:   Thu May 23 20:16:13 2019 +0800

    v1

第二步:查看所需要回滚的版本的commit值
查看到v2的commit值为73a8608b5afeeaa8c8b003b2f308c110ec3d1016

第三步:执行回滚操作

[root@ryan test]# git reset --hard 73a8608b
HEAD is now at 73a8608 v2

第四步:查看版本状态

[root@ryan test]# git log
commit 73a8608b5afeeaa8c8b003b2f308c110ec3d1016
Author: root <ryan@163.com>
Date:   Thu May 23 20:21:18 2019 +0800

    v2

commit 95cb52f8df998c13b4712279a77a55605588f8ae
Author: root <ryan@163.com>
Date:   Thu May 23 20:16:13 2019 +0800

    v1

第五步:回退到k.tt版本中
我们需要commit值才能回到v3版本
可以通过git reflog 查看所有的历史版本
找到v3的值即可

[root@ryan test]# git reflog
73a8608 HEAD@{0}: reset: moving to 73a8608b
8cf843c HEAD@{1}: commit: v3
73a8608 HEAD@{2}: reset: moving to 73a8608
95cb52f HEAD@{3}: reset: moving to HEAD~1
73a8608 HEAD@{4}: commit: v2
95cb52f HEAD@{5}: commit (initial): v1

回滚:

[root@ryan test]# git reset --hard 8cf843c
HEAD is now at 8cf843c v3
[root@ryan test]# git log
commit 8cf843c8b48f1791309fb162f59775119e4e11de
Author: root <ryan@163.com>
Date:   Thu May 23 20:50:00 2019 +0800

    v3

commit 73a8608b5afeeaa8c8b003b2f308c110ec3d1016
Author: root <ryan@163.com>
Date:   Thu May 23 20:21:18 2019 +0800

    v2

commit 95cb52f8df998c13b4712279a77a55605588f8ae
Author: root <ryan@163.com>
Date:   Thu May 23 20:16:13 2019 +0800

    v1
5.Git分支使用演示

第一步:准备git目录

[root@ryan ~]# mkdir /ryan
[root@ryan ~]# cd /ryan/

第二步:初始化git目录

[root@ryan ryan]# git init
Initialized empty Git repository in /ryan/.git/

第三步:查看git分支

[root@ryan ryan]# git branch
[root@ryan ryan]# 

显示为空

第四步:创建文件并提交才能看到主分支

[root@ryan ryan]# touch test
[root@ryan ryan]# git add .     
[root@ryan ryan]# git branch       #提交到暂存区看不到主分支
[root@ryan ryan]# git   commit -m "v1"
[master (root-commit) c489471] v1
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 test
[root@ryan ryan]# git branch
* master

切换分支操作
第一步:查看分支

[root@ryan ~]# cd /test
[root@ryan test]# ls
a.tt  b.tt  c.tt
[root@ryan test]# git branch
* master

第二步:创建分支

[root@ryan test]# git branch test1
[root@ryan test]# git branch
* master
  test1

第三步:切换分支

[root@ryan test]# git checkout test1
Switched to branch 'test1'
[root@ryan test]# git branch
  master
* test1

第四步:在分支里操作test

[root@ryan test]# ls
a.tt  b.tt  c.tt
[root@ryan test]# echo "55555">> c.tt 
[root@ryan test]# cat c.tt 
aaaa
bbbb
cccc
dddd
55555

第五步:提交

[root@ryan test]# git add .
[root@ryan test]# git commit -m "test for branch"
[test1 e452d76] test for branch
 1 file changed, 1 insertions(+)

第六步:切换回主分支并查看文件

[root@ryan test]# git checkout master
Switched to branch 'master'
[root@ryan test]# git branch
* master
  test1
[root@ryan test]# cat c.tt 
aaaa
bbbb
cccc
dddd

第七步:合并子分支

合并之后发现现在主分支也可以看到刚才子分支添加的内容了
[root@ryan test]# git merge test1
Updating 8cf843c..e452d76
Fast-forward
 c.tt | 1 +
 1 file changed, 1 insertions(+)
[root@ryan test]# cat c.tt 
aaaa
bbbb
cccc
dddd
55555
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值