Git 版本控制器
1 概述
持续集成第一步就是开发人员将代码进行提交并推送到代码仓库,比如git、svn。
2 版本控制器种类
版本控制器种类分为分布式版本控制器与集中式版本控制器。
GIT:分布式版本控制器
Git 是一款开源的分布式版本控制系统,可以有效、高效的处理从很小到非常大的项目版本管理。Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源代码的版本控制软件。
分布式版本控制器是不需要“中央服务器”的,每个人的电脑上都是一个完整的版本库,这样在工作时就不需要联网了,因为版本库就在自己的 电脑上,在多人协作时,只需要把各自的修改推送给对方,就可以互相看到对方的修改了。
分布式版本控制器和集中式版本控制器相比,分布式版本控制器的安全性显然是比较好的,因为每个人的电脑都有完整的版本库,当一台电脑损坏不要紧只需要从别人电脑在复制一份就行,但是集中式的版本控制器一旦损坏,代码就会丢失。
在实际使用分布式版本控制器时,很少在两人之间互相推送版本库,因为可能两个人不在一个局域网内,所以分布式版本控制器也有一个“中 央服务器”,但是这个中央服务器仅仅是用来方便交换大家的修改,并不像集中式版本控制器那样中央服务器一坏数据就丢失。
SVN:集中式版本控制器
CVS和SVN都是集中式的版本控制系统,集中式版本控制系统的版本库是集中存放在中央服务器的,但是因为工作使用的是自己的电脑,所以在工作之前需要从中央服务器获取最新的代码,并且在工作完成后需要再上传到中央服务器
集中式版本控制器的最大缺点就是需要联网才能工作,如果是局域网还行,带宽大,速度够大,可是如果在互联网上,遇到网速慢的话传一个10M的文件可能都需要五分钟,工作效率太慢,尤其是都是下班的时候 才会上传代码,在下班点上传的请求更多,导致上传速度更慢
3 Git特点
Git优点:
适合分布式开发,强调个体;
公共服务器压力和数据量都不会太大;
速度快、灵活;
离线工作;
Git缺点:
代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码 和版本信息;
权限控制不友好;如果需要对开发者限制各种权限的建议使用 SVN。
4 Git环境部署
主机名:git
IP地址:192.168.1.100
操作系统:Centos7.6
hostnamectl set-hostname git
yum -y install git
git --version
5 Git命令学习
准备一个空目录当git仓库:
[root@git ~]# mkdir /data
[root@git ~]# cd /data
配置git用户以及邮箱: 因为每次Git提交都会使用该用户信息。
格式:git config --global user.name '用户名'
[root@git data]# git config --global user.name "yesir"
提示:使用了 --global 选项,这些信息将被写入 ${HOME}/.gitconfig 中; 如果在特定的项目中, 要使用其他的用户名或者Email地址,只需重新配置时去掉 --global选项,新的信息将被写入 .git/config 中
配置git用户邮箱:
格式:git config –global user.email '邮箱'
[root@git data]# git config --global user.email "yesir@163.com"
配置高亮颜色显示(增加体验感) 如果这个信息不配置,那么你与Git交互时,所有字体的颜色都将是默认系统的一个颜色。
[root@git ~]# git config --global color.ui true
查看配置信息:
格式:git config -l,--list 用于列出~./config配置文件中的一些变量信息,以及${HOME}/.gitconfig中的用户与邮箱。
[root@git data]# git config -l
初始化代码仓库 (将一个目录初始化为git仓库)
格式: git init
[root@git data]# git init
#查看工作目录(初始化的目录被称为工作目录)
[root@git data]# ls -a
. .. .git #该目录为Git版本库
#查看仓库目录结构树
[root@git data]# tree .git/
branches #分支项目
config #定义项目特有的配置选项
description #仅供git web程序使用
HEAD #提示当前的分支
hooks #包含git钩子文件
info #包含一个全局排除文件(exclude文件)
objects #存放所有数据内容,里边包含info pack两个目录
refs #存放指向数据(分支)的提交对象的指针
index #保存暂存区信息,在执行git init的时候,这个文件还没有
6. Git 核心概念
对于任何一个文件,Git对其都有四种状态,
工作目录:就是你平常存放项目代码的地方。 暂存区:用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息。 本地仓库(版本库):就是安全存放数据的位置,这里面都是你提交的所有代码信息。 远程仓库:就是托管代码的服务器,类似于 FTP 服务,能够共享数据。
7. Git工作流程
自己创建编写的文件是工作区,在此编写代码,这个文件会上传到暂存区,紧接着会上传到本地仓库,也是可以随时取消。最后是可以把代码上传到远程仓库,分享供大家访问且使用。
8. Git快速入门
在工作区创建项目文件:
[root@git data]# touch a.txt b.txt c.txt
查看工作区文件状态:
格式:git status
[root@git date]# git status
提交工作区文件到暂存区(所有的项目文件都需要经过暂存区才可以被提交到git仓库中)
格式:git add 文件名
[root@git data]# git add t1.txt
#暂存区的文件被临时存储在.git/index文件内
[root@git data]# tree .git
将工作目录所有文件提交到暂存区的方式:
格式:git add . 或者 git add *
[root@git date]# git add .
[root@git date]# git status
将文件从暂存区删除:
格式:git rm --cached 文件名
[root@git data]# git rm --cached a.txt
[root@git date]# git status
提示:只是将文件从暂存区删除了,并没有删除源文件。
同时删除暂存区文件与源文件:
格式:git rm -f 文件名
[root@git data]# git rm -f b.txt
[root@git date]# git status
提交文件到仓库:
格式:git commit -m "提交说明" #说明自定义且支持中文
[root@git date]# git commit -m "第一次提交:a.txt"
提示:提交到仓库中的文件才会被版本控制系统管理。每一次的commit代码提交相当于虚拟机的一次快照功能。随后可恢复到任意位置。
再次查看暂存区(文件已经被提交)
[root@git date]# git status
查看仓库中历史提交信息:
格式:git log
[root@git date]# git log
commit 提交的哈希值
Author: 作者信息
Date: 提交时间
提交描述
简要查看历史提交信息:
git log --oneline
[root@git date]# git log --oneline
4dacc84 a.xx #哈希值的前7位与描述信息
小结:上述操作简单演示了一个开发人员使用git提交自己的项目文件到版本库中。
9. Git 文件改名
已提交到仓库的文件如果后期被改名,会出现如下问题:
[root@git data]# mv a.txt a.xxx
[root@git date]# git status
由于名字变更,git无法识别。此时文件被退回到暂存区。
删除暂存区文件/重新提交新文件到暂存区
[root@git data]# git rm --cached a.txt
[root@git data]# git add a.xxx
[root@git date]# git status
提交文件到仓库:
[root@git data]# git commit -m '第二次提交:a.txt重命名为a.xxx'
[root@git data]# git log
如果需要修改文件名字,可直接使用git命令改名,这样git可以识别到变化:
格式:git mv 源名称 新名称
[root@git data]# git mv a.xxx a.jsp
[root@git date]# git status
提交文件到仓库:
[root@git data]# git commit -m '第三次提交:a.xxx 重命名为 a.jsp'
[root@git data]# git log
删除仓库文件:
[root@git data]# git rm c.txt
[root@git data]# git status
[root@git data]# git commit -m '删除c.txt'
10. Git 文件比对
文件比对可以显示工作区文件和暂存区文件的差异、暂存区文件和仓库文件之间的差异
比对工作区与暂存区文件差异:
格式:git diff
[root@git date]# git diff
提示:如没有任何信息,表示没有差异。
向文件中添加内容提交至暂存区:
[root@git data]# echo hello > a.jsp
[root@git data]# git add a.jsp
向文件中增加内容不要提交至暂存区:
[root@git data]# echo abcd >> a.jsp
再次比对应该可以发现工作区与暂存区文件的差异:
[root@git data]# git diff
提示:此时暂存区文件与本地仓库文件也不一致。
比对暂存区与本地仓库文件差异:
格式:git diff --cached
[root@git date]# git diff --cached
提交暂存区文件到本地仓库:
[root@git data]# git commit -m '第四次提交:a.jsp增加内容hello'
如果文件已经被仓库管理,再次更改此文件,可直接通过"-am"直接提交到仓库中。
[root@git data]# git commit -am '第五次提交:a.jsp增加内容abcd'
小结:上述演示是当开发人员对项目文件内容更新后,如何进行比对,如何再次提交到仓库。
11. Git 查看历史记录
在使用 Git 提交了若干更新之后,又或者克隆了某个项目,想回顾下提交历史,我们可以使用下边命令查看。
命令格式:
格式1:git log #最详细(上下键查看)、q(退出));
格式2:git log --pretty=oneline #会以一个漂亮的格式显示(每条日志只显示一行);
格式3:git log --oneline #相对于第二种方式的哈希值只会显示一部分;
查看详细历史记录:
[root@git date]# git log
commit 提交的哈希值
Author: 作者信息
Date: 提交时间
提交描述
查看简要历史记录:
[root@git data]# git log --pretty=oneline
查看简要历史记录:
[root@git date]# git log --oneline
12. Git HEAD概念
HEAD 是当前分支引用的指针,它总是指向某次commit,默认最新一次的commit。
通常可以把 HEAD 看做你的上一次提交的快照,当然HEAD的指向是可以改变的,比如你提交了commit,切换了仓库,分支,或者回滚了版本,切换了tag等。
查看指针:在查看历史记录之上通过 --decorate 查看
格式1:git log --decorate
格式2:git log --pretty=oneline --decorate
格式3:git log --oneline --decorate
[root@git data]# git log --decorate
[root@git date]# git log --oneline --decorate
[root@git data]# git log --pretty=oneline --decorate
13. Git版本恢复
在实现多人合作程序开发的过程中,我们有时会出现错误提交的情况,此时我们希望能撤销提交操作,让程序回到提交前的样子,这时候就可以通过版本回退(reset)来实现。
原理: git reset的作用是修改HEAD的位置,即将HEAD指向的位置改变为之前存在的某个版本,假设我们要回退到版本一,回退之后只保留版本一。
适用场景: 如果想恢复到之前某个提交的版本,且那个版本之后提交的版本我们都不要了,就可以用这种方法。
重置当前HEAD指针到指定版本:
格式:git reset --hard 哈希值
#恢复到第一个版本
[root@git date]# git reset --hard 1fd81198
#查看当前HEAD指向的版本
[root@git data]# git log --oneline --decorate
#查看历史提交信息(会发现历史提交过的信息已消失,只保留了当前版本记录)
[root@git date]# git log
#查看历史提交的所有信息:reflog
[root@git date]# git reflog
#再次回滚至最后一次的提交版本
[root@git date]# git reset --hard 4dacc84
评论区