版本控制 、 Git基础 、 Git进阶 、 RPM打包
1. 版本库
2.分布式版本控制
Git基本概念
1.Git仓库:
保存所有的数据的地方
2.工作区
从仓库中提取出来的文件,放在磁盘上共你使用或者修改
3.暂存区
就是一个文件,缩引文件,保存了下次将提交的文件列表
工作流
版本控制软件
1.集中式版本控制软件
- CVS
- SVN (Subversion)
2.分布式版本控制软件
- GIt
- BItKeeper (收费)
1 案例1:Git基本操作
1.1 问题
本案例要求先快速搭建好一台Git服务器,并测试该版本控制软件,要求如下:
安装Git软件
创建版本库
客户端克隆版本仓库到本地
本地工作目录修改数据
提交本地修改到服务器
1.2方案
实验拓扑如图-1所示,Git工作流如图-2所示。
1.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:部署Git服务器(192.168.2.100作为远程git服务器)
1)YUM安装Git软件。
[aaa@qq.com ~]# yum -y install git
2)初始化一个空仓库。
[aaa@qq.com ~]# mkdir /var/git
[aaa@qq.com ~]# git init /var/git/project --bare
[aaa@qq.com ~]# ls /var/git/project
config description HEAD hooks info objects refs
步骤二:客户端测试(192.168.2.200作为客户端主机)
使用git常用指令列表如表-1所示。
表-1 git常用指令列表
1) clone克隆服务器仓库到本地。
[aaa@qq.com ~]# yum -y install git
[aaa@qq.com ~]# git clone aaa@qq.com192.168.2.100:/var/git/project
[aaa@qq.com ~]# cd project
[aaa@qq.com ~]# ls
2) 修改git配置。
[aaa@qq.com project]# git config --global user.email "aaa@qq.com"
[aaa@qq.com project]# git config --global user.name "Your Name"
[aaa@qq.com project]# cat ~/.gitconfig
[user]
email = aaa@qq.com.com
name = Your Name
3) 本地工作区对数据进行增删改查(必须要先进入仓库再操作数据)。
[aaa@qq.com project]# echo "init date" > init.txt
[aaa@qq.com project]# mkdir demo
[aaa@qq.com project]# cp /etc/hosts demo
4) 查看仓库中数据的状态。
[aaa@qq.com project]# git status
5) 将工作区的修改提交到暂存区。
[aaa@qq.com project]# git add .
6) 将暂存区修改提交到本地仓库。
[
aaa@qq.com project]# git commit -m "注释,可以为任意字符"
[aaa@qq.com project]# git status
7) 将本地仓库中的数据推送到远程服务器(web2将数据推送到web1)。
[aaa@qq.com project]# git config --global push.default simple
[aaa@qq.com project]# git push
aaa@qq.com192.168.2.100's password: 输入服务器root密码
[aaa@qq.com project]# git status
8) 将服务器上的数据更新到本地(web1的数据更新到web2)。
备注:可能其他人也在修改数据并提交服务器,就会导致自己的本地数据为旧数据,使用pull就可以将服务器上新的数据更新到本地。
[aaa@qq.com project]# git pull
9) 查看版本日志。
[aaa@qq.com project]# git log
[aaa@qq.com project]# git log --pretty=oneline
[aaa@qq.com project]# git log --oneline
[aaa@qq.com project]# git reflog
备注:客户端也可以使用图形程序访问服务器。
Windows需要安装git和tortoiseGit。如图-3、图-4所示。
2 案例2: HEAD指针操作
2.1 问题
沿用练习一,学习操作HEAD指针,具体要求如下:
查看Git版本信息
移动指针
通过移动HEAD指针恢复数据
2.2 方案
HEAD指针是一个可以在任何分支和版本移动的指针,通过移动指针我们可以将数据还原至任何版本。每做一次提交操作都会导致git更新一个版本,HEAD指针也跟着自动移动。
2.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:HEAD指针基本操作
1)准备工作(多对数据仓库进行修改、提交操作,以产生多个版本)。
[
aaa@qq.com project]# echo "new file" > new.txt
[aaa@qq.com project]# git add .
[aaa@qq.com project]# git commit -m "add new.txt"
[aaa@qq.com project]# echo "first" >> new.txt
[aaa@qq.com project]# git add .
[aaa@qq.com project]# git commit -m "new.txt:first line"
[aaa@qq.com project]# echo "second" >> new.txt
[aaa@qq.com project]# git add .
[aaa@qq.com project]# git commit -m "new.txt:second"
[aaa@qq.com project]# echo "third" >> new.txt
[aaa@qq.com project]# git add .
[aaa@qq.com project]# git commit -m "new.txt:third"
[aaa@qq.com project]# git push
[aaa@qq.com project]# echo "123" > num.txt
[aaa@qq.com project]# git add .
[aaa@qq.com project]# git commit -m "num.txt:123"
[aaa@qq.com project]# echo "456" > num.txt
[aaa@qq.com project]# git add .
[aaa@qq.com project]# git commit -m "num.txt:456"
[aaa@qq.com project]# echo "789" > num.txt
[aaa@qq.com project]# git add .
[aaa@qq.com project]# git commit -m "num.txt:789"
[aaa@qq.com project]# git push
2) 查看Git版本信息。
[aaa@qq.com project]# git reflog
[aaa@qq.com project]# git log --oneline
04ddc0f num.txt:789
7bba57b num.txt:456
301c090 num.txt:123
b427164 new.txt:third
0584949 new.txt:second
ece2dfd new.txt:first line
e1112ac add new.txt
1a0d908 初始化
3)移动HEAD指针,将数据还原到任意版本。
提示:当前HEAD指针为aaa@qq.com{0}。
[aaa@qq.com project]# git reset --hard 301c0
[aaa@qq.com project]# git reflog
301c090 aaa@qq.com{0}: reset: moving to 301c0
04ddc0f aaa@qq.com{1}: commit: num.txt:789
7bba57b aaa@qq.com{2}: commit: num.txt:456
301c090 aaa@qq.com{3}: commit: num.txt:123
b427164 aaa@qq.com{5}: commit: new.txt:third
0584949 aaa@qq.com{6}: commit: new.txt:second
ece2dfd aaa@qq.com{7}: commit: new.txt:first line
e1112ac aaa@qq.com{8}: commit: add new.txt
1a0d908 aaa@qq.com{9}: commit (initial): 初始化
[aaa@qq.com project]# cat num.txt #查看文件是否为123
123
[aaa@qq.com project]# git reset --hard 7bba57b
[aaa@qq.com project]# cat num.txt #查看文件是否为123,456
123
456
[aaa@qq.com project]# git reflog #查看指针移动历史
7bba57b aaa@qq.com{0}: reset: moving to 7bba57b
301c090 aaa@qq.com{1}: reset: moving to 301c0
… …
[aaa@qq.com project]# git reset --hard 04ddc0f #回到最后一次修改的版本
3 案例3:Git分支操作
3.1 问题
**沿用练习二,学习操作Git分支,具体要求如下:
查看分支
创建分支
切换分支
合并分支
解决分支的冲突
3.2 方案**
Git支持按功能模块、时间、版本等标准创建分支,分支可以让开发分多条主线同时进行,每条主线互不影响,分支效果如图-5所示。
常见的分支规范如下:
MASTER分支(MASTER是主分支,是代码的核心)。 DEVELOP分支(DEVELOP最新开发成果的分支)。 RELEASE分支(为发布新产品设置的分支)。 HOTFIX分支(为了修复软件BUG缺陷的分支)。 FEATURE分支(为开发新功能设置的分支)。
步骤一:查看并创建分支
1)查看当前分支。
[aaa@qq.com project]# git status
On branch master
nothing to commit, working directory clean
[aaa@qq.com project]# git branch -v
* master 0dc2b76 delete init.txt
2)创建分支。
[aaa@qq.com project]# git branch hotfix
[aaa@qq.com project]# git branch feature
[aaa@qq.com project]# git branch -v
feature 0dc2b76 delete init.txt
hotfix 0dc2b76 delete init.txt
* master 0dc2b76 delete init.txt
步骤二:切换与合并分支
1)切换分支。
[aaa@qq.com project]# git checkout hotfix
[aaa@qq.com project]# git branch -v
feature 0dc2b76 delete init.txt
* hotfix 0dc2b76 delete init.txt
master 0dc2b76 delete init.txt
2)在新的分支上可以继续进行数据操(增、删、改、查)。
[aaa@qq.com project]# echo "fix a bug" >> new.txt
[aaa@qq.com project]# git add .
[aaa@qq.com project]# git commit -m "fix a bug"
3)将hotfix修改的数据合并到master分支。
注意,合并前必须要先切换到master分支,然后再执行merge命令。
[aaa@qq.com project]# git checkout master
[aaa@qq.com project]# cat new.txt #默认master分支中没有hotfix分支中的数据
[aaa@qq.com project]# git merge hotfix
Updating 0dc2b76..5b4a755
Fast-forward
new.txt | 1 ++
1 file changed, 1 insertions(+)
步骤二:解决版本分支的冲突问题
1)在不同分支中修改相同文件的相同行数据,模拟数据冲突。
[aaa@qq.com project]# git checkout hotfix
[aaa@qq.com project]# echo "AAA" > a.txt
[aaa@qq.com project]# git add .
[aaa@qq.com project]# git commit -m "add a.txt by hotfix"
[aaa@qq.com project]# git checkout master
[aaa@qq.com project]# echo "BBB" > a.txt
[aaa@qq.com project]# git add .
[aaa@qq.com project]# git commit -m "add a.txt by master"
[aaa@qq.com project]# git merge hotfix
自动合并 a.txt
冲突(添加/添加):合并冲突于 a.txt
自动合并失败,修正冲突然后提交修正的结果。
2)查看有冲突的文件内容,修改文件为最终版本的数据,解决冲突。
[aaa@qq.com project]# cat a.txt #该文件中包含有冲突的内容
<<<<<<< HEAD
BBB
=======
AAA
>>>>>>> hotfix
[aaa@qq.com project]# vim a.txt #修改该文件,为最终需要的数据,解决冲突
BBB
[aaa@qq.com project]# git add .
[aaa@qq.com project]# git commit -m "resolved"
总结:
分支指针与HEAD指针的关系。
创建分支的本质是在当前提交上创建一个可以移动的指针
如何判断当前分支呢?答案是根据HEAD这个特殊指针
分支操作流程如图-6,图-7,图-8,图-9,图-10所示。
图-6 HEAD指针指向master分支
图-7 切换分支,HEAD指针指向testing分支
图-8 在testing分支中修改并提交代码
图-9 将分支切换回master分支
图-10 在master分支中修改数据,更新版本
4 案例4:Git服务器
4.1 问题
沿用练习三,学习Git不同的服务器形式,具体要求如下:
创建SSH协议服务器
创建Git协议服务器
创建HTTP协议服务器
4.2 方案
Git支持很多服务器协议形式,不同协议的Git服务器,客户端就可以使用不同的形式访问服务器。创建的服务器协议有SSH协议、Git协议、HTTP协议。
步骤一:SSH协议服务器(支持读写操作)
1)创建基于密码验证的SSH协议服务器(web1主机操作)。
[aaa@qq.com ~]# git init --bare /var/git/base_ssh
Initialized empty Git repository in /var/git/base_ssh/
2)客户端访问的方式(web2主机操作)。
[aaa@qq.com ~]# git clone aaa@qq.com:/var/git/base_ssh
[aaa@qq.com ~]# rm -rf base_ssh
3)客户端生成SSH**,实现免密码登陆git服务器(web2主机操作)。
[aaa@qq.com ~]# ssh-****** -f /root/.ssh/id_rsa -N ‘’
[aaa@qq.com ~]# ssh-copy-id 192.168.2.100
[aaa@qq.com ~]# git clone aaa@qq.com:/var/git/base_ssh
[aaa@qq.com ~]# git push
步骤二:Git协议服务器(只读操作的服务器)
1)安装git-daemon软件包(web1主机操作)。
[aaa@qq.com ~]# yum -y install git-daemon
2)创建版本库(web1主机操作)。
[aaa@qq.com ~]# git init --bare /var/git/base_git
Initialized empty Git repository in /var/git/base_git/
3)修改配置文件,启动git服务(web1主机操作)。
[aaa@qq.com ~]# vim /usr/lib/systemd/system/aaa@qq.com
修改前内容如下:
ExecStart=-/usr/libexec/git-core/git-daemon --base-path=/var/lib/git
–export-all --user-path=public_git --syslog --inetd –verbose
修改后内容如下:
ExecStart=-/usr/libexec/git-core/git-daemon --base-path=/var/git
–export-all --user-path=public_git --syslog --inetd –verbose
[aaa@qq.com ~]# systemctl start git.socket
4)客户端访问方式(web2主机操作)
[aaa@qq.com ~]# git clone git://192.168.2.100/base_git
步骤三:HTTP协议服务器(只读操作的服务器)
1)安装gitweb、httpd软件包(web1主机操作)。
[aaa@qq.com ~]# yum -y install httpd gitweb
2)修改配置文件,设置仓库根目录(web1主机操作)。
[aaa@qq.com ~]# vim +11 /etc/gitweb.conf
$projectroot = “/var/git”; #添加一行
3) 创建版本仓库(web1主机操作)
[aaa@qq.com ~]# git init --bare /var/git/base_http
4)启动httpd服务器
[aaa@qq.com ~]# systemctl start httpd
5)客户端访问方式(web2主机操作)
注意:调用虚拟机中的firefox浏览器,需要在远程时使用ssh -X 服务器IP,并且确保真实主机的firefox已经关闭。
[aaa@qq.com ~]# firefox http://192.168.2.100/git/
步骤四:课外扩展知识:注册使用Github
1.登陆网站https://github.com,点击Sign up(注册),如图-11所示。
图 -11
2.填写注册信息(用户名,邮箱,密码),如图-12所示。
图 -12
3. 初始化操作,如图-13和图-14所示。
图-13
图-14
注意,初始化完成后,到邮箱中去**Github账户。
4. 创建仓库、使用仓库
点击Start a project(如图-15所
图-15
填写项目名称(项目名称任意),如图-16所示。
图-16
往仓库中上传文件或新建文件,如图-17所示
图-17
下载仓库中的代码,如图-18所示。
5. 命令行操作(需要联网的主机,如真实机)
[aaa@qq.com ~]# yum -y install git
[aaa@qq.com ~]# git clone https://github.com/账户名称/仓库名称
#clone指令用于将服务器仓库中的资料打包下载到本地
[aaa@qq.com ~]# cd 仓库名称
[aaa@qq.com ~]# 任意修改文件,或新建文件
[aaa@qq.com ~]# git add .
#add添加新文件
[aaa@qq.com ~]# git commit -m "test"
[aaa@qq.com ~]# git push
#commit和push实现提交代码的功能
[aaa@qq.com ~]# git pull
#pull可以从githuab服务器拉取数据到本地
5 案例5:制作nginx的RPM包
5.1 问题
本案例使用nginx-1.12.2版本的源码软件,生成对应的RPM包软件,具体要求如下:
软件名称为nginx
软件版本为1.12.2
RPM软件包可以查询描述信息
RPM软件包可以安装及卸载
5.2 方案
安装rpm-build软件包,编写SPEC配置文件,创建新的RPM软件包。
配置文件中的描述信息如表-2:
表-2 SPEC描述信息
表-2 SPEC描述信息
5.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:安装rpm-build软件
1)安装rpm-build软件包
[aaa@qq.com ~]# yum -y install rpm-build
2)生成rpmbuild目录结构
[aaa@qq.com ~]# rpmbuild -ba nginx.spec //会报错,没有文件或目录
[aaa@qq.com ~]# ls /root/rpmbuild //自动生成的目录结构
BUILD BUILDROOT RPMS SOURCES SPECS SRPMS
3)准备工作,将源码软件复制到SOURCES目录
[aaa@qq.com ~]# cp nginx-1.12.2.tar.gz /root/rpmbuild/SOURCES/
4)创建并修改SPEC配置文件
[aaa@qq.com ~]# vim /root/rpmbuild/SPECS/nginx.spec
Name:nginx #源码包软件名称
Version:1.12.2 #源码包软件的版本号
Release: 10 #制作的RPM包版本号
Summary: Nginx is a web server software. #RPM软件的概述
License:GPL #软件的协议
URL: www.test.com #网址
Source0:nginx-1.12.2.tar.gz #源码包文件的全称
#BuildRequires: #制作RPM时的依赖关系
#Requires: #安装RPM时的依赖关系
%description
nginx [engine x] is an HTTP and reverse proxy server. #软件的详细描述
%post
useradd nginx #非必需操作:安装后脚本(创建账户)
%prep
%setup -q #自动解压源码包,并cd进入目录
%build
./configure
make %{?_smp_mflags}
%install
make install DESTDIR=%{buildroot}
%files
%doc
/usr/local/nginx/* #对哪些文件与目录打包
%changelog
步骤二:使用配置文件创建RPM包
1)安装依赖软件包
[aaa@qq.com ~]# yum -y install gcc pcre-devel openssl-devel
2)rpmbuild创建RPM软件包
[aaa@qq.com ~]# rpmbuild -ba /root/rpmbuild/SPECS/nginx.spec
[aaa@qq.com ~]# ls /root/rpmbuild/RPMS/x86_64/nginx-1.12.2-10.x86_64.rpm
步骤三:安装软件
[aaa@qq.com ~]# yum install /root/rpmbuild/RPMS/x86_64/nginx-1.12.2-10.x86_64.rpm
[aaa@qq.com ~]# rpm -qa |grep nginx
[aaa@qq.com ~]# ls /usr/local/nginx/
上一篇: 使用mock.js生成前端测试数据
下一篇: Spring MVC(六)拦截器