Git的原理与使用(一)

目录

Git初始

Git安装

Git基本操作

创建git本地仓库

配置git

工作区,暂存区,版本库

添加文件,提交文件

查看.git文件

修改文件

版本回退

小结


Git初始

git是一个非常强大的版本控制工具.可以快速的将我们的文档和代码等进行版本管理.

下面这个实例看理解下为什么需要版本控制

在工作或者学习中,我们可能经常会遇到这样的场景,例如当我们需要给领导提供一份资料的时候,我们先写出了一个版本,交给领导,但是领导看完不满意,让重新写,于是我们又写了第二个版本,领导还是不满意,于是又写了第三个版本,领导看完之后说还不如第二个版本的文档,于是就要第二个版本的文档.

这种情况下我们想要恢复到第二个版本的文档是不是就比较麻烦了.

但是如果我们将文档交给git进行管理之后,那个问题就不在是问题了.

对于Git这个工具,不管是在企业中还是学习中,适用频率都是很高的一个工具,在企业中我们需要合作开发项目,那么合作完成项目,git是必不可少的一个工具.

Git安装

工欲善其事必先利其器,接下来我们先安装git.

我们安装git环境是在CentOs.

后续的操作也是在CentOS上进行操作.

由于我们的系统上是没有git的,我们需要安装git.

在没有安装git之前,我们在控制台上输入git之后,会出现这样的场景:

git
-bash: git: command not found

上述情况只是系统提示我们没有安装git.

其实在linux上安装git非常简单,只需要一个命令即可:

 yum -y install git

当操作这个命令之后,我们可以在控制台输入 git --version来查看我们安装的版本.

目前为止我们的git已经安装完成了.可以看出git的安装是非常简单的,可以说是傻瓜式安装.

Git基本操作

接下来我们将介绍git的一些基本操作.这些基本操作一般使用频率最高.

创建git本地仓库

Git的原理与使用(一)_第1张图片

上述图片中的命令就是在我们本地创建一个新的git仓库.

git init 命令就是创建本地仓库的命令.

当我们创建完成之后,我们在当前仓库发现了一个.git的隐藏目录.这个目录就是用来管理这个仓库下的所有东西的.

以下就是.git目录下的所有东西.

Git的原理与使用(一)_第2张图片

关于这个.git目录中的东西我们在后面会详细进行介绍.

配置git

接下来就需要对git进行配置,这个配置是非常重要的,主要就是配置用户名和email地址,这个配置用来区分是那个用户进行提交的.

配置命令:

git config user.name "Your Name" 
git config user.email "[email protected]" 

 需要把user.name和user.email 换成自己的即可.

可以使用git config -l进行查看Git的原理与使用(一)_第3张图片

--global 是⼀个可选项。如果使⽤了该选项,表⽰这台机器上所有的 Git 仓库都会使⽤这个 配置。如果你希望在不同仓库中使⽤不同的 name 或 e-mail ,可以不要 --global 选项,但要 注意的是,执⾏命令时必须要在仓库⾥。

删除对应的配置命令:

git config  --unset user.name

git config  --unset user.email

如果需要删除全局的配置,只需要将 --global选项即可.

工作区,暂存区,版本库

工作区:工作区就是在git仓库下进行编写代码和文档的地方.

暂存区:英⽂叫 stage 或 index。⼀般存放在 .git ⽬录下的 index ⽂件(.git/index)中,我们 把暂存区有时也叫作索引(index)。

版本库:⼜名仓库,英⽂名 repository 。⼯作区有⼀个隐藏⽬录 .git ,它不算⼯作区,⽽ 是 Git 的版本库。这个版本库⾥⾯的所有⽂件都可以被 Git 管理起来,每个⽂件的修改、删除,Git 都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

Git的原理与使用(一)_第4张图片

图中左侧为⼯作区,右侧为版本库。

Git 的版本库⾥存了很多东西,其中最重要的就是暂存区。

在创建 Git 版本库时,Git 会为我们⾃动创建⼀个唯⼀的 master 分⽀,以及指向 master 的⼀个指 针叫 HEAD。(分⽀和HEAD的概念后⾯再说)

当对⼯作区修改(或新增)的⽂件执⾏ git add 命令时,暂存区⽬录树的⽂件索引会被更新。

当执⾏提交操作 git commit 时,master 分⽀会做相应的更新,可以简单理解为暂存区的⽬录树才会被真正写到版本库中。

由上述描述我们便能得知:通过新建或粘贴进⽬录的⽂件,并不能称之为向仓库中新增⽂件,⽽只是在⼯作区新增了⽂件。必须要通过使⽤ git add 和 git commit 命令才能将⽂件添加到仓库中 进⾏管理!!!

添加文件,提交文件

我们在包含.git目录的下新建一个文件,我们可以使用git add 命令将工作区的文件添加到暂存区.

  • 添加一个或多个文件到暂存区                    git add [file1] [file2] ...
  • 添加一个目录到暂存区                               git add [dir]
  • 添加当前目录下所用改动的文件到暂存区   git add

再使用git commit命令将暂存区中的文件提交的本地仓库中.

  • 提交暂存区全部内容到本地仓库中: git commit -m "message" 
  • 提交暂存区的指定⽂件到仓库区: git commit [file1] [file2] ... -m "message"

注意:git commit -m选项要跟上这次提交的描述信息.这个不能缺少.用来记录你提交的细节,要好好描述.

[root@VM-8-9-centos TestGit]# git init
初始化空的 Git 版本库于 /root/TestGit/.git/
[root@VM-8-9-centos TestGit]# ls -a
.  ..  .git
[root@VM-8-9-centos TestGit]# touch 1.txt
[root@VM-8-9-centos TestGit]# touch 2.txt 3.txt
[root@VM-8-9-centos TestGit]# ls
1.txt  2.txt  3.txt
[root@VM-8-9-centos TestGit]# git add 1.txt
[root@VM-8-9-centos TestGit]# git add 2.txt 3.txt
[root@VM-8-9-centos TestGit]# git commit 1.txt -m "提交一个文件"
[master(根提交) da0d6e8] 提交一个文件
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 1.txt
[root@VM-8-9-centos TestGit]# git commit -m "将暂存区中所有文件都提交"
[master 890a29d] 将暂存区中所有文件都提交
 2 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 2.txt
 create mode 100644 3.txt
[root@VM-8-9-centos TestGit]# ^C
[root@VM-8-9-centos TestGit]# 

Git的原理与使用(一)_第5张图片 此时我们可以使用git log命令来查看提交记录:

Git的原理与使用(一)_第6张图片

该命令显示的是从进到远的日志.

 如果嫌输出信息太多,看得眼花缭乱的,可以试试加上 --pretty=oneline 参数:

我们发现在上面都会有一些数字比如890a29.................,这个数字的话是我们每次进行提交的commit Id(版本号),git的commit id是通过一系列计算出来的16进制的数字.

要搞明白这些数字的含义,就需要进入.git目录.

查看.git文件

  • index就是暂存区,我们进行add的文件和代码都是在这个目录下
  • HEAD就是我们默认指向的master分支的指针

其实所谓的master分支就是: 可以看到master分支打印 了一串数字,其实这个数字就是我们最近提交的commit id

我们可以通过打印日志来看看:

[root@VM-8-9-centos TestGit]# git log --pretty=oneline
890a29d9bdb4b08ce1a6c62cb2f9686ca9c0e451 将暂存区中所有文件都提交
da0d6e8dbbda2503b782b862bb1d332dc2a6a5a1 提交一个文件
[root@VM-8-9-centos TestGit]# 

可以看到完全一致.也就是说我们现在是将文档提交到master分支上的.

  • objects 为 Git 的对象库,⾥⾯包含了创建的各种版本库对象及内容

当执⾏ git add 命令 时,暂存区的⽬录树被更新,同时⼯作区修改(或新增)的⽂件内容被写⼊到对象库中的⼀个新的对象中,就位于 ".git/objects" ⽬录下,让我们来看看这些对象有何⽤处.

我们发现里面有很多的目录,查找 object 时要将 commit id 分成2部分,其前2位是⽂件夹名称,后38位是⽂件名称。

找到这个⽂件之后,⼀般不能直接看到⾥⾯是什么,该类⽂件是经过 sha (安全哈希算法)加密过的 ⽂件,好在我们可以使⽤ git cat-file 命令来查看版本库对象的内容:

Git的原理与使用(一)_第7张图片

 我们所有对本地仓库目录下的所有操作,都会被git记录下来,也就是在objects目录下,这里记录了所有对本地仓库的操作.

修改文件

Git ⽐其他版本控制系统设计得优秀,因为 Git 跟踪并管理的是修改,⽽⾮⽂件。

什么是修改?⽐如你新增了⼀⾏,这就是⼀个修改,删除了⼀⾏,也是⼀个修改,更改了某些字符, 也是⼀个修改,删了⼀些⼜加了⼀些,也是⼀个修改,甚⾄创建⼀个新⽂件,也算⼀个修改。

我们可以将我们前面提交的文件进行修改,

我们使用vim 1.txt打开文件,在里面写入hello world,然后保存退出.

此时,仓库中的1.txt文件和我们工作区的1.txt文件是不同的.我们可以使用git status命令查看在你上次提交之后是否有对⽂件进⾏再次修改

Git的原理与使用(一)_第8张图片

 上述结果已经告诉我们了,1.txt已经被修改,但是还没有进行添加和提交.

此时我们是知道1.txt文件已经被修改了,但是并不知道修改了那些内容.我们可以使用命令:

git diff 1.txt 来查看修改了那些内容.

Git的原理与使用(一)_第9张图片

这里我们就能看到我们添加了一行hello world .

当我们知道我们修改了那些内容的时候,我们就可以进行添加和提交操作了.

Git的原理与使用(一)_第10张图片

当我们进行了add 之后再次查看的时候,就会发现他会提示你要提交的变更是那个了.然后我们进行提交就可以了.

Git的原理与使用(一)_第11张图片

版本回退

之前我们也提到过,Git 能够管理⽂件的历史版本,这也是版本控制器重要的能⼒。如果有⼀天你发现 之前前的⼯作做的出现了很⼤的问题,需要在某个特定的历史版本重新开始,这个时候,就需要版本回退的功能了。

执⾏ git reset 命令⽤于回退版本,可以指定退回某⼀次提交的版本。

要解释⼀下“回退”本质是 要将版本库中的内容进⾏回退,⼯作区或暂存区是否回退由命令参数决定:

git reset 命令语法格式为: git reset [--soft | --mixed | --hard] [HEAD]

  •  --mixed 为默认选项,使⽤时可以不⽤带该参数。该参数将暂存区的内容退回为指定提交版本内 容,⼯作区⽂件保持不变。
  •  --soft 参数对于⼯作区和暂存区的内容都不变,只是将版本库回退到某个指定版本。
  •  --hard 参数将暂存区与⼯作区都退回到指定版本。切记⼯作区有未提交的代码时不要⽤这个命 令,因为⼯作区会回滚,你没有提交的代码就再也找不回了,所以使⽤该参数前⼀定要慎重。
  •  HEAD 说明:

可直接写成 commit id,表⽰指定退回的版本

HEAD 表⽰当前版本

HEAD^ 上⼀个版本

HEAD^^ 上上⼀个版本

以此类推...

可以使⽤ 〜数字表⽰:  

HEAD~0 表⽰当前版本

HEAD~1 上⼀个版本

HEAD^2 上上⼀个版本

以此类推..

为了方便测试,我们对1.txt文件进行三次修改 添加 和提交操作.

第一次:Git的原理与使用(一)_第12张图片

第二次:

Git的原理与使用(一)_第13张图片

第三次:

Git的原理与使用(一)_第14张图片

查看历史的提交记录:

Git的原理与使用(一)_第15张图片 现在,如果我们在提交完 version3 后, 发现 version 3 编写错误,想回退到 version2,重新基于 version 2 开始编写。由于我们在这⾥希望的是将⼯作区的内容也回退到 version 2 版本,所以需 要⽤到 --hard 参数,⽰例如下:

Git的原理与使用(一)_第16张图片

我们这里的回退是直接的commit Id进行回退的.

现在我们发现工作区的1.txt文件已经回退到了version2的版本了.同时也发现head已经指向了version2了

值得说的是,Git 的版本回退速度⾮常快,因为 Git 在内部有个指向当前分⽀(此处是master)的 HEAD 指针, refs/heads/master ⽂件⾥保存当前 master 分⽀的最新 commit id 。当我们 在回退版本的时候,Git 仅仅是给 refs/heads/master 中存储⼀个特定的version,可以简单理解 成如下⽰意图:

Git的原理与使用(一)_第17张图片

Git的原理与使用(一)_第18张图片 

小结

本篇文章为git的基础篇,后续会持续更新git的其他操作以及高级的特性. 

你可能感兴趣的:(Git,学习,Linux,git)