版本的概念最早在印刷行业出现,由于编辑、印刷不同而衍生出不同样式和内容,产生了不同的成品,这就是版本。
版本控制技术是一种可以记录一个或多个文件在修改过程中的变化,使得后续可以查阅文件的历史版本的技术。
当一个项目的代码量达到一定规模时,对源代码的管理难度和重要性也会随即增加。使用版本控制可以有效地管理和维护软件的项目开发,因其保存了从项目研发开始到结束的所有历史提交和修改记录。
版本控制系统分为两类:集中式版本控制系统、分布式版本控制系统
集中式版本控制系统是指软件项目的所有代码的修改和提交都存储在一台中央服务器,本地的版本控制系统只保存最新的文件快照,所以每位开发人员在开始工作前,必须要从中央服务器同步最新的项目版本数据信息来避免版本冲突。集中式版本控制系统的缺点就是对中央服务器的依赖性很高,中央服务器的单点故障将会带来严重的后果。如果中央服务器出现宕机,所有人都无法进行文件更新的提交;如果中央服务器的硬盘出现损坏,那么就可能永久性地丢失所有的存储信息。
与集中式版本控制系统相对应的是分布式版本控制系统,这是指每个参与者都在本地有自己的版本库,而且也没有中央服务器,对代码的修改信息除了保存在远程仓库,每个参与者在本地都有自己的一份完整的镜像文件,即使服务器出现了巨大的损坏,也可以通过镜像文件进行恢复,而且,同时也支持着离线工作。
Git是一种典型的分布式版本控制系统,为了更好地管理Linux内核,在2005年由Linus Torvalds首次提出。Git具有使用简便、开源、速度快、保护数据完整性的特点,并且提供了对非线性开发模式的支持,有强大的分支管理能力,允许上千个分支同步并行开发,分支的开发不影响主分支。首先,软件项目的开发过程可能会经常出现功能和性能上的问题,漏洞是可追溯的,出现在某些版本中。使用Git的分支管理功能,通过检查不同版本,定位版本的漏洞的位置,再对这个版本的漏洞进行修复。其次,可以利用一个新的创建分支对软件进行测试性修改,用来验证本文设计的新算法是否可以让文中的软件项目给用户带来更好的使用体验,最后,可以利用Git的分支管理功能在不同的分支上给软件设计不同的功能,因此各个功能相互独立,如果后续研发中不再需要此项功能,可以回退到之前的版本,其它的功能分支也不会因此受到影响。Git采用快照模式,也就是说Git记录数据在某个时间点的映像,而不是记录提交前后数据的具体差异,并且采用校验和压缩,因此恢复起文件来要更为快速。Git再通过SHA-1算法对数据内容进行校验和计算,并将结果作为数据唯一的标识,所以,Git可以检测得到任何数据的修改和删除,这保证了数据的完整性。Git凭借自身的卓越性能,已广泛地应用于众多的著名开源项目,如Ruby on Rails、Perl、Eclipse等,是大型项目开发的首选工具。
Git 有三种状态:已提交(committed)、已修改(modified) 和 已暂存(staged)。
已修改表示修改了文件,但还没保存到数据库中。
已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
已提交表示数据已经安全地保存在本地数据库中。
这会让我们的 Git 项目拥有三个阶段:工作区、暂存区以及 Git 目录。
获取 Git 仓库通常有两种方式:
将尚未进行版本控制的本地目录转换为 Git 仓库。
从其它服务器克隆 一个已存在的 Git 仓库。比如: git clone
标记 | 释义 |
---|---|
?? | 新添加的未跟踪文件 |
A | 新添加到暂存区中的文件 |
M | 修改过的文件 |
右边的 M | 该文件被修改了但还没放入暂存区 |
左边的 M | 该文件被修改了并放入了暂存区 |
MM | 工作区被修改并提交到暂存区后又在工作区中被修改了,所以在暂存区和工作区都有该文件被修改了的记录 |
(1)初始化版本库
创建本地仓库,并且初始化
mkdir demo ##创建的版本库名字为demo
cd demo/
git init ##在版本库目录下进行初始化
.git目录是git跟踪管理版本库的,没事别瞎溜达!
(2)添加用户信息
设置用户名和邮件地址,每次Git提交都会附带这些信息,是仓库所有者的标签
(3)创建文件,查看仓库文件状态
??标志,表示没有添加到暂存区
标志A表示已经添加到暂存区了
提交更新,把暂存区的所有内容提交到当前分支
提交之后就会发现状态栏下没有文件
M在右 :该文件被修改了但还没放入暂存区
M在左 :该文件被修改了并放入了暂存区
MM出现:工作区被修改并提交到暂存区后又在工作区中被修改了,所以在暂存区和工作区都有该文件被修改了的记录
(4)忽略文件
cat .gitignore
.* //忽略所有隐藏文件
/test //只忽略当前目录下的test文件
build/ //忽略任何目录下名为 build 的文件夹
一般有些文件无需纳入 Git 的管理,不希望它们总出现在未跟踪文件列表
通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等
在这种情况下,我们可以创建一个名为 .gitignore 的文件,列出要忽略的文件模式
在demo目录下新建env目录,在demo目录和env目录下分别建立file文件,查看状态env目录和file文件均是??标记
删除demo目录下的file文件查看状态,只显示env目录是??标记
在demo目录下建立隐藏文件.file0,查看状态是??
在demo目录下新建.gitignore文件,编辑忽略所有隐藏文件和env文件,查看状态,状态栏下没有文件
(5)版本回退
git log ##显示从最近到最远的提交日志
git log --pretty=oneline ##查看简略日志信息
git reflog ##查看历史记录
不断对文件进行修改,然后不断提交修改到版本库里,当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit。
一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失
git reset --hard HEAD^ 回退到指定状态
(6) 撤消对文件的修改
git checkout – README.md
删除后没有提交,直接:git checkout – file即可
删除且提交后: git reset --hard 指定状态
移除文件
git rm PROJECTS.md
git rm --cached README
GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务
gitlab常用命令:
gitlab-ctl start # 启动所有 gitlab 组件
gitlab-ctl stop # 停止所有 gitlab 组件
gitlab-ctl restart # 重启所有 gitlab 组件
gitlab-ctl status # 查看服务状态
gitlab-ctl reconfigure # 重载服务
gitlab-ctl tail # 查看日志
(1)软件安装: (官方推荐至少4G内存)
yum install -y curl policycoreutils-python openssh-server
yum install -y gitlab-ce-12.9.7-ce.0.el7.x86_64.rpm
(2)编辑/etc/gitlab/gitlab.rb文件,更改访问gitlab的地址为本机ip
vim /etc/gitlab/gitlab.rb
external_url 'http://172.25.12.5' ##访问gitlab的地址
gitlab-ctl show-config ##显示gitlab的所有配置
gitlab-ctl reconfigure ##重载服务
(4)查看gitlab服务的状态
(5)关闭gitlab服务,关闭虚拟机server5,给server5添加内存
(6) 重新打开虚拟机server15,发现gitlab服务默认是开机自启的
(7)登录gitlab:
http://172.25.12.5 ##用户:root 第一次登录需要强制修改密码
进入gitlab,点击create a project
输入项目名称,在浏览器里面输入server5的ip
发现需要添加ssh key认证
在server5上生成ssh免密,将公钥添加到gitlab中的demo项目上
在gitlab里面做ssh key认证
(8)项目已创建好
(9)点击clone,选择clone with ssh,复制git地址链接
(10)之前的server5上已经存在demo库,与浏览器上的demo有冲突,这里demo里没有重要的信息,直接删除,克隆demo库成功
设置浏览器端gitlab显示为中文
测试:
本地建立文件,push到远程,在浏览器上可以查看到,传输成功