目录
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仓库.
git init 命令就是创建本地仓库的命令.
当我们创建完成之后,我们在当前仓库发现了一个.git的隐藏目录.这个目录就是用来管理这个仓库下的所有东西的.
以下就是.git目录下的所有东西.
关于这个.git目录中的东西我们在后面会详细进行介绍.
配置git
接下来就需要对git进行配置,这个配置是非常重要的,主要就是配置用户名和email地址,这个配置用来区分是那个用户进行提交的.
配置命令:
git config user.name "Your Name"
git config user.email "email@example.com"
需要把user.name和user.email 换成自己的即可.
可以使用git config -l进行查看
--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 的版本库⾥存了很多东西,其中最重要的就是暂存区。
在创建 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 log命令来查看提交记录:
该命令显示的是从进到远的日志.
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上 --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记录下来,也就是在objects目录下,这里记录了所有对本地仓库的操作.
修改文件
Git ⽐其他版本控制系统设计得优秀,因为 Git 跟踪并管理的是修改,⽽⾮⽂件。
什么是修改?⽐如你新增了⼀⾏,这就是⼀个修改,删除了⼀⾏,也是⼀个修改,更改了某些字符, 也是⼀个修改,删了⼀些⼜加了⼀些,也是⼀个修改,甚⾄创建⼀个新⽂件,也算⼀个修改。
我们可以将我们前面提交的文件进行修改,
我们使用vim 1.txt打开文件,在里面写入hello world,然后保存退出.
此时,仓库中的1.txt文件和我们工作区的1.txt文件是不同的.我们可以使用git status命令查看在你上次提交之后是否有对⽂件进⾏再次修改
上述结果已经告诉我们了,1.txt已经被修改,但是还没有进行添加和提交.
此时我们是知道1.txt文件已经被修改了,但是并不知道修改了那些内容.我们可以使用命令:
git diff 1.txt 来查看修改了那些内容.
这里我们就能看到我们添加了一行hello world .
当我们知道我们修改了那些内容的时候,我们就可以进行添加和提交操作了.
当我们进行了add 之后再次查看的时候,就会发现他会提示你要提交的变更是那个了.然后我们进行提交就可以了.
版本回退
之前我们也提到过,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文件进行三次修改 添加 和提交操作.
第一次:
第二次:
第三次:
查看历史的提交记录:
现在,如果我们在提交完 version3 后, 发现 version 3 编写错误,想回退到 version2,重新基于 version 2 开始编写。由于我们在这⾥希望的是将⼯作区的内容也回退到 version 2 版本,所以需 要⽤到 --hard 参数,⽰例如下:
我们这里的回退是直接的commit Id进行回退的.
现在我们发现工作区的1.txt文件已经回退到了version2的版本了.同时也发现head已经指向了version2了
值得说的是,Git 的版本回退速度⾮常快,因为 Git 在内部有个指向当前分⽀(此处是master)的 HEAD 指针, refs/heads/master ⽂件⾥保存当前 master 分⽀的最新 commit id 。当我们 在回退版本的时候,Git 仅仅是给 refs/heads/master 中存储⼀个特定的version,可以简单理解 成如下⽰意图:
小结
本篇文章为git的基础篇,后续会持续更新git的其他操作以及高级的特性.