技术流ken

运维拯救世界

Git介绍及常用操作演示(一)–技术流ken

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 有三种状态,你的文件可能处于其中之一:已提交(committed)、已修改(modified)和已暂存(staged)。 已提交表示数据已经安全的保存在本地数据库中。 已修改表示修改了文件,但还没保存到数据库中。 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。

 

Git几个概念

 

一. 工作目录

工作目录是对项目的某个版本独立提取出来的内容。这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。

二. 暂存区域

是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。有时候也被称作`‘索引’’,不过一般说法还是叫暂存区域。

三. Git 仓库目录

是Git 用来保存项目的元数据和对象数据库的地方。这是 Git 中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。

 

Git工作流程

 

基本的 Git 工作流程如下:

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

 

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

 

获取 Git 仓库

有两种取得 Git 项目仓库的方法。 第一种是在现有项目或目录下导入所有文件到 Git 中; 第二种是从一个服务器克隆一个现有的 Git 仓库。

 

Git的安装

 

第一种安装方式:yum进行安装

[root@ken ~]# yum install git -y

 

第二种安装方式:编译安装

第一步:上传安装包并解压

[root@ken ~]# rz
[root@ken ~]# ls | grep git
git-v2.7.4.zip
[root@ken ~]# unzip git-v2.7.4.zip

 

第二步:安装依赖

[root@ken git-2.7.4]# yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker -y

 

第三步:进入解压下目录下并执行编译

 

[root@ken git-2.7.4]# make prefix=/usr/local/git all
[root@ken git-2.7.4]# make prefix=/usr/local/git install

 

第四步:导入二进制程序

[root@ken git-2.7.4]# rm -rf /usr/bin/git
[root@ken git-2.7.4]# ln -s /usr/local/git/bin/git /usr/bin/git
[root@ken git-2.7.4]# git --version
git version 2.7.4

 

git常用选项介绍

   [root@ken html]# git 
   add        Add file contents to the index
   bisect     Find by binary search the change that introduced a bug
   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
   diff       Show changes between commits, commit and working tree, etc
   fetch      Download objects and refs from another repository
   grep       Print lines matching a pattern
   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
   rebase     Forward-port local commits to the updated upstream head
   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
   tag        Create, list, delete or verify a tag object signed with GPG

 

 

演示1:简单基础演示

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

[root@ken ~]# mkdir /kenken
[root@ken ~]# cd /kenken

 

第二步:初始化目录

[root@ken kenken]# git init

 

第三步:创建一个测试文件

[root@ken kenken]# echo  "this is ken">>a.tt

 

第四步:提交

[root@ken kenken]# git add a.tt
[root@ken kenken]# git commit -m "v1"

 

第五步:查看

[root@ken kenken]# git log
commit 15370fed2791ba4c978018f840caed22fd38221f
Author: ken <1614833@qq.com>
Date:   Tue Nov 20 10:17:18 2018 +0800

    v1

 

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

[root@ken kenken]# echo "new data" >>a.tt

 

第七步:提交

[root@ken kenken]# git add a.tt
[root@ken kenken]# git commit -m "v2"

 

第八步:再次查看

复制代码
[root@ken kenken]# git log
commit d1f52146b390c95c614e8ae7acc922da0f7e2d0d
Author: ken <1614833@qq.com>
Date:   Tue Nov 20 10:34:11 2018 +0800

    v2

commit 15370fed2791ba4c978018f840caed22fd38221f
Author: ken <1614833@qq.com>
Date:   Tue Nov 20 10:17:18 2018 +0800

    v1
复制代码

 

第九步:恢复到第v1版本

复制代码
[root@ken kenken]# git reset --hard HEAD~1
HEAD is now at 15370fe v1
[root@ken kenken]# git log
commit 15370fed2791ba4c978018f840caed22fd38221f
Author: ken <1614833@qq.com>
Date:   Tue Nov 20 10:17:18 2018 +0800

    v1
复制代码

 

第十步:恢复到v2版本

复制代码
[root@ken kenken]# git reflog               #首先使用git reflog可以查看commit值
15370fe HEAD@{0}: reset: moving to HEAD~1
d1f5214 HEAD@{1}: commit: v2
15370fe HEAD@{2}: reset: moving to HEAD~1
22d39cb HEAD@{3}: commit: v2
15370fe HEAD@{4}: commit (initial): v1
[root@ken kenken]# git reset --hard d1f5214    #恢复的时候指定conmit值
HEAD is now at d1f5214 v2
[root@ken kenken]# git log                    #查看发现已经恢复到v2版本
commit d1f52146b390c95c614e8ae7acc922da0f7e2d0d
Author: ken <1614833@qq.com>
Date:   Tue Nov 20 10:34:11 2018 +0800

    v2

commit 15370fed2791ba4c978018f840caed22fd38221f
Author: ken <1614833@qq.com>
Date:   Tue Nov 20 10:17:18 2018 +0800

    v1
复制代码

 

演示2:撤销工作区的内容

第一步:创建一个文件

[root@ken kenken]# echo "test1">>e.tt
[root@ken kenken]# echo "test2">>e.tt

 

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

[root@ken kenken]# git add e.tt

 

第三步:在文件追加内容

在包含.git的目录中,只要当前目录下的文件有修改都会自动进入工作区(该文件必须被commit过,否则无法追踪)

所以下面当往文件e.tt中添加test3的时候。e.tt这个文件就进入到了工作区了

 

1.文件进入工作区:包含.git隐藏文件的目录中,文件修改就会自动进入

2.文件进入缓存区:git add .

3.文件进入仓库:git commit -m ‘v1’

[root@ken kenken]# echo "test3">>e.tt

 

第四步:查看工作区

复制代码
[root@ken kenken]# git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#    new file:   e.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:   e.tt
#
复制代码

 

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

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

复制代码
[root@ken kenken]# git checkout -- e.tt   #数据回滚
[root@ken kenken]# git status             #查看状态
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#    new file:   e.tt
#
[root@ken kenken]# cat e.tt                #查看文件内容,发现test3内容已经没有了
test1
test2
复制代码

 

演示3:撤销缓存区的内容

第一步:创建文件并进行提交

复制代码
[root@ken kenken]# echo "1111">k.tt
[root@ken kenken]# git add k.tt
[root@ken kenken]# git commit -m "k.tt"
[root@ken kenken]# git log
commit c5f46907ce0dfd6722b091fa7a7053ff48507ace
Author: ken <1614833@qq.com>
Date:   Tue Nov 20 12:42:30 2018 +0800

    k.tt
复制代码

 

第二步:修改文件并加入到缓存区中

第一步一定要提交,才能看到效果

复制代码
[root@ken kenken]# echo "222">>k.tt
[root@ken kenken]# echo "333">>k.tt
[root@ken kenken]# git add k.tt
[root@ken kenken]# git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#    modified:   k.tt
#
复制代码

 

第三步:缓存区进行回退

[root@ken kenken]# git reset HEAD k.tt
Unstaged changes after reset:
M    k.tt

 

第四步:缓存区进行回退

复制代码
[root@ken kenken]# git status
# 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:   k.tt
#
no changes added to commit (use "git add" and/or "git commit -a")
复制代码

 

第五步:工作区进行回滚

其实现在就已经回到了演示2中了

回退完成之后可以发现之前写的222和333 已经没有了

[root@ken kenken]# git checkout -- k.tt
[root@ken kenken]# git status
# On branch master
nothing to commit, working directory clean
[root@ken kenken]# cat k.tt 
1111

 

演示4:撤销仓库中的内容

第一步:查看历史版本

我们现在处于k.tt中,现在希望回到v3中

复制代码
[root@ken kenken]# git log
commit c5f46907ce0dfd6722b091fa7a7053ff48507ace
Author: ken <1614833@qq.com>
Date:   Tue Nov 20 12:42:30 2018 +0800

    k.tt

commit ec9c03a48c816aa08fdd2216effdd2f124f1b4e3
Author: ken <1614833@qq.com>
Date:   Tue Nov 20 12:40:07 2018 +0800

    v4

commit 1334466fd86ba0ba4ec95147809d71cb21345e95
Author: ken <1614833@qq.com>
Date:   Tue Nov 20 12:28:11 2018 +0800

    v3

commit 15370fed2791ba4c978018f840caed22fd38221f
Author: ken <1614833@qq.com>
Date:   Tue Nov 20 10:17:18 2018 +0800

    v1
复制代码

 

第二步:查看所需要回滚的版本的commit值

通过上面我们可以看到v3的commit值为1334466fd86ba0ba4ec95147809d71cb21345e95

 

第三步:执行回滚操作

commit值没有必要全部写出来,只要写一部分就可以了

[root@ken kenken]# git reset --hard 1334466f

 

第四步:查看版本状态

现在我们处于v3版本之中

复制代码
[root@ken kenken]# git log
commit 1334466fd86ba0ba4ec95147809d71cb21345e95
Author: ken <1614833@qq.com>
Date:   Tue Nov 20 12:28:11 2018 +0800

    v3

commit 15370fed2791ba4c978018f840caed22fd38221f
Author: ken <1614833@qq.com>
Date:   Tue Nov 20 10:17:18 2018 +0800

    v1
复制代码

 

第五步:回退到v4版本中

我们知道回退版本需要用到commit值

但是现在通过git log已经看不到v4的commit值了,现在怎么办呐?

可以通过git reflog查看所有的历史操作

找到v4前面的值即可

复制代码
[root@ken kenken]# git reflog
1334466 HEAD@{0}: reset: moving to 1334466f
c5f4690 HEAD@{1}: commit: k.tt
ec9c03a HEAD@{2}: commit: v4
1334466 HEAD@{3}: commit: v3
15370fe HEAD@{4}: reset: moving to HEAD~1
d1f5214 HEAD@{5}: reset: moving to d1f5214
15370fe HEAD@{6}: reset: moving to HEAD~1
d1f5214 HEAD@{7}: commit: v2
15370fe HEAD@{8}: reset: moving to HEAD~1
22d39cb HEAD@{9}: commit: v2
15370fe HEAD@{10}: commit (initial): v1
复制代码

 

第六步:回滚到v4版本

复制代码
[root@ken kenken]# git reset --hard ec9c03a 
HEAD is now at ec9c03a v4
[root@ken kenken]# git log
commit ec9c03a48c816aa08fdd2216effdd2f124f1b4e3
Author: ken <1614833@qq.com>
Date:   Tue Nov 20 12:40:07 2018 +0800

    v4

commit 1334466fd86ba0ba4ec95147809d71cb21345e95
Author: ken <1614833@qq.com>
Date:   Tue Nov 20 12:28:11 2018 +0800

    v3

commit 15370fed2791ba4c978018f840caed22fd38221f
Author: ken <1614833@qq.com>
Date:   Tue Nov 20 10:17:18 2018 +0800

    v1
复制代码

 

Git分支介绍

 

几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。

Git 处理分支的方式可谓是难以置信的轻量,创建新分支这一操作几乎能在瞬间完成,并且在不同分支之间的切换操作也是一样便捷。 与许多其它版本控制系统不同,Git 鼓励在工作流程中频繁地使用分支与合并,哪怕一天之内进行许多次。

 

Git分支使用演示

 

准备:

第一步:准备git目录

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

 

第二步:初始化git目录

[root@ken test]# git init

 

第三步:查看git分支

发现显示为空

[root@ken test]# git branch
[root@ken test]#

 

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

[root@ken test]# git branch
[root@ken test]# touch test
[root@ken test]# git add .
[root@ken test]# git branch
[root@ken test]# git commit -m “v1”
[master (root-commit) 18a1f53] v1
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 test
[root@ken test]# git branch
* master

 

第一步:查看分支

*表示当前所处的分支位置

[root@ken kenken]# git branch
* master

 

第二步:创建分支

[root@ken kenken]# git branch ken
[root@ken kenken]# git branch
  ken
* master

 

第三步:切换分支

[root@ken kenken]# git checkout ken
Switched to branch 'ken'
[root@ken kenken]# git branch
* ken
  master

 

第四步:在分支里面操作e.tt

复制代码
[root@ken kenken]# ls
a.tt  c.tt  d.tt  e.tt
[root@ken kenken]# echo "888888">>e.tt
[root@ken kenken]# cat e.tt 
test1
test2
test3
test4
test5
888888
复制代码

 

第五步:提交

git add .表示提交全部

[root@ken kenken]# git add .
[root@ken kenken]# git commit -m "test for branch"
[ken b621584] test for branch
 1 file changed, 1 insertion(+)

 

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

现在查看e.tt并没有看到刚才子分支提交的内容

复制代码
[root@ken kenken]# git checkout master 
Switched to branch 'master'
[root@ken kenken]# git branch 
  ken
* master
[root@ken kenken]# cat e.tt 
test1
test2
test3
test4
test5
复制代码

 

第七步:合并子分支

合并之后发现现在主分支也可以看到刚才子分支添加的内容了

复制代码
[root@ken kenken]# git merge ken 
Updating ec9c03a..b621584
Fast-forward
 e.tt | 1 +
 1 file changed, 1 insertion(+)
[root@ken kenken]# cat e.tt 
test1
test2
test3
test4
test5
888888
复制代码

发表评论

电子邮件地址不会被公开。