版本库
----版本库是版本控制中心的核心
----任意数量客户端
----客户端通过写数据库分享代码
分布式版本控制系统
----开发者之间共用一个仓库(repository)
----所有操作需要联网
----每个开发者都是一个仓库的完整克隆,每个人都是服务器
----支持断网操作
版本控制软件
----CVS
----SVN(Subversion)
----Git
----BitKeeper(收费)
Git基本概念
Git作用
当我们把一个文件上传到git里,让git帮我们去管理,只要你把文件放到git里了,以后你对这个文件不管怎么修改,它都会把你的文件所有修改的历史记录全部备份下来,可以随意的还原历史版本,简单来说git的作用就是帮你管理文件,对于git来说,这个文件有很多的版本,每修改一次就产生一个版本.
Git工作流程
Git基本操作
问题
要求先快速搭建好一台Git服务器,并测试该版本控制软件,要求如下:
方案
实验拓扑如图-1所示,Git工作流如图-2所示。
步骤一:部署Git服务器(192.168.2.100作为远程git服务器)
1.YUM安装Git软件
[root@web1 ~]# yum -y install git
2.初始化一个空仓库
[root@web1 ~]# mkdir /var/git
[root@web1 ~]# git init /var/git/project --bare
初始化空的 Git 版本库于 /var/git/project/
[root@web1 ~]# ls /var/git/project
config description HEAD hooks info objects refs
步骤二:客户端测试(192.168.2.200作为客户端主机)
客户端访问方式
----git clone file:///var/git
----git clone root@服务器IP:/var/git
----服务器需要额外配置Web服务器
----客户端可以浏览器访问
----git clone http://服务器IP/git仓库
----Git clone https://服务器IP/git仓库
客户端命令行工具:使用git常用指令列表如表-1所示
1.clone克隆服务器仓库到本地
[root@web2 ~]# yum -y install git #首先查看是否有git软件
[root@web2 ~]# git clone [email protected]:/var/git/project
正克隆到 'project'...
Warning: Permanently added '192.168.2.100' (ECDSA) to the list of known hosts.
[email protected]'s password:
warning: 您似乎克隆了一个空版本库。
[root@web2 ~]# ls #当前多了一个空的project目录,project即为工作区
Desktop lnmp_soft lnmp_soft.tar.gz nginx-1.12.2 nginx-1.12.2.tar.gz project
[root@web2 ~]# cd project/
[root@web2 project]# ls
[root@web2 project]# ls -a #隐藏的仓库,存放所有历史版本
. .. .git
!!!做git有关的任何操作一定要先cd进git的工作区
2. 本地工作区对数据进行增删改查(必须要先进入仓库再操作数据)。
[root@web2 project]# echo "init data" > init.txt
[root@web2 project]# mkdir demo
[root@web2 project]# cp /etc/hosts demo
[root@web2 project]# ls
demo init.txt
3. 查看仓库中数据的状态。
[root@web2 project]# git status
# 位于分支 master
#
# 初始提交
#
# 未跟踪的文件:
# (使用 "git add ..." 以包含要提交的内容)
#
# demo/
# init.txt
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
4. 将工作区的修改提交到暂存区
[root@web2 project]# git add . #.代表当前,所有的文件都提交到暂存区
5 . 修改git配置
[root@web2 project]# git commit -m "注释" #提交,报错
[master(根提交) 3ef2e08] 注释
Committer: root
您的姓名和邮件地址基于登录名和主机名进行了自动设置。请检查它们正确
与否。您可以通过下面的命令对其进行明确地设置以免再出现本提示信息:
git config --global user.name "Your Name"
git config --global user.email [email protected]
设置完毕后,您可以用下面的命令来修正本次提交所使用的用户身份:
git commit --amend --reset-author
2 files changed, 3 insertions(+)
create mode 100644 demo/hosts
create mode 100644 init.txt
[root@web2 project]# git config --global user.name "Your Name" #config永久生效
[root@web2 project]# git config --global user.email [email protected]
[root@web2 project]# cat ~/.gitconfig
[user]
name = Your Name
email = [email protected]
[root@web2 project]# git status #再次查看服务状态
位于分支 master
无文件要提交,干净的工作区
6.将本地仓库中的数据推送到远程服务器(web2将数据推送到web1)
[root@web2 project]# git config --global push.default simple
[root@web2 project]# git push
[email protected]'s password: 输入服务器root密码
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (5/5), 358 bytes | 0 bytes/s, done.
Total 5 (delta 0), reused 0 (delta 0)
To [email protected]:/var/git/project
* [new branch] master -> master
[root@web2 project]# git status
位于分支 master
无文件要提交,干净的工作区
可以在web1上面查看
[root@web1 ~]# cd /var/git/project/
[root@web1 project]# du -sh /var/git/project/ #没有推送到服务器时的大小
56K /var/git/project/
[root@web1 project]# du -sh /var/git/project/ #已经推送到服务器时的大小变化
80K /var/git/project/
7. 将服务器上的数据更新到本地(web1的数据更新到web2)
备注:可能其他人也在修改数据并提交服务器,就会导致自己的本地数据为旧数据,使用pull就可以将服务器上新的数据更新到本地。
[root@web2 project]# git pull
[email protected]'s password:
Already up-to-date.
8 . 查看版本日志
[root@web2 project]# git log #git会以UUID作为版本号,"注释"为commit -m后面定义的名字
commit 3ef2e08e4cabc885025f397bbcf11910b67476f3
Author: root
Date: Fri Jan 17 10:49:07 2020 +0800
注释
[root@web2 project]# git log --pretty=oneline
3ef2e08e4cabc885025f397bbcf11910b67476f3 注释
[root@web2 project]# git log --oneline
3ef2e08 注释
[root@web2 project]# git reflog
3ef2e08 HEAD@{0}: commit (initial): 注释
Windows客户端软件
备注:客户端也可以使用图形程序访问服务器。
Windows需要安装git和tortoiseGit。如图-3、图-4所示。
HEAD指针概述
HEAD指针操作
问题
学习操作HEAD指针,具体要求如下:
方案
HEAD指针是一个可以在任何分支和版本移动的指针,通过移动指针我们可以将数据还原至任何版本。每做一次提交操作都会导致git更新一个版本,HEAD指针也跟着自动移动。
步骤一:HEAD指针基本操作
1.准备工作(多对数据仓库进行修改、提交操作,以产生多个版本)
[root@web2 project]# echo "first" > new.txt
[root@web2 project]# git add .
[root@web2 project]# git commit -m "new.txt:first"
[master 2c87f61] add first
1 file changed, 1 insertion(+)
create mode 100644 first
[root@web2 project]# echo "first" >> new.txt
[root@web2 project]# git add .
[root@web2 project]# git commit -m "new.txt:first line"
[master a0480de] new.txt:first line
1 file changed, 2 insertions(+), 1 deletion(-)
[root@web2 project]# echo "second" >> new.txt
[root@web2 project]# git add .
[root@web2 project]# git commit -m "new.txt:second line"
[master 5d777e6] new.txt:second line
1 file changed, 1 insertion(+)
[root@web2 project]# echo "thrid" >> new.txt
[root@web2 project]# git add .
[root@web2 project]# git commit -m "new.txt:thrid"
[master 9e6746d] new.txt:thrid
1 file changed, 1 insertion(+)
[root@web2 project]# git push
[email protected] password:
[root@web2 project]# echo 123 > num.txt
[root@web2 project]# git add .
[root@web2 project]# git commit -m "num.txt:123"
[master e7db9a7] num.txt:123
1 file changed, 1 insertion(+)
create mode 100644 num.txt
[root@web2 project]# echo 456 > num.txt
[root@web2 project]# git add .
[root@web2 project]# git commit -m "num.txt:456"
[master ead3f5d] num.txt:456
1 file changed, 1 insertion(+), 1 deletion(-)
[root@web2 project]# echo 789 > num.txt
[root@web2 project]# git add .
[root@web2 project]# git commit -m "num.txt:789"
[master 553a0eb] num.txt:789
1 file changed, 1 insertion(+), 1 deletion(-)
[root@web2 project]# git push
[email protected]'s password:
Counting objects: 10, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (9/9), 673 bytes | 0 bytes/s, done.
Total 9 (delta 3), reused 0 (delta 0)
To [email protected]:/var/git/project
9e6746d..553a0eb master -> master
2.查看Git版本信息
[root@web2 project]# git log --oneline
553a0eb num.txt:789
ead3f5d num.txt:456
e7db9a7 num.txt:123
9e6746d new.txt:thrid
5d777e6 new.txt:second line
a0480de new.txt:first line
2c87f61 add new.txt
3ef2e08 注释
3.移动HEAD指针,将数据还原到任意版本
提示:当前HEAD指针为HEAD@{0}。
分支的基本概念
分支可以让开发分多条主线同时进行,每条主线互不影响
Git分支操作
问题
操作Git分支,具体要求如下:
方案
Git支持按功能模块、时间、版本等标准创建分支,分支可以让开发分多条主线同时进行,每条主线互不影响,分支效果如图所示
步骤一:查看并创建分支
1.查看当前分支
[root@web2 project]# git status
# 位于分支 master
无文件要提交,干净的工作区
nothing to commit, working directory clean
[root@web2 project]# git branch -v
* master 553a0eb num.txt:789
2.创建分支
[root@web2 project]# git branch hotfix
[root@web2 project]# git branch feature
[root@web2 project]# git branch -v
feature 553a0eb num.txt:789
hotfix 553a0eb num.txt:789
* master 553a0eb num.txt:789
步骤二:切换与合并分支
1.切换分支
[root@web2 project]# git checkout hotfix
切换到分支 'hotfix'
[root@web2 project]# ls #此时查看并没有任何变化
demo init.txt new.txt num.txt
[root@web2 project]# git branch -v
feature 553a0eb num.txt:789
* hotfix 553a0eb num.txt:789
master 553a0eb num.txt:789
在新的分支上就可以继续修改代码
2.在新的分支上可以继续进行数据操作(增、删、改、查)
[root@web2 project]# echo "fix a new txt" >> new.txt
[root@web2 project]# git add .
[root@web2 project]# git commit -m "fix a new txt"
[hotfix 4cab02f] fix a new txt
1 file changed, 1 insertion(+)
[root@web2 project]# cat new.txt
first
first
second
thrid
fix a new txt
[root@web2 project]# git checkout master
切换到分支 'master'
[root@web2 project]# cat new.txt
first
first
second
thrid
3.将hotfix修改的数据合并到master分支
注意,合并前必须要先切换到master分支,然后再执行merge命令。
[root@web2 project]# git branch -v #首先查看当前处于哪个分支
feature 553a0eb num.txt:789
hotfix 4cab02f fix a new txt
* master 553a0eb num.txt:789
[root@web2 project]# git merge hotfix #合并分支,有时会产生版本分支冲突
更新 553a0eb..4cab02f
Fast-forward
new.txt | 1 +
1 file changed, 1 insertion(+)
[root@web2 project]# cat new.txt #再次查看文件
first
first
second
thrid
fix a new txt
[root@web2 project]# git branch -v
feature 553a0eb num.txt:789
hotfix 4cab02f fix a new txt
* master 4cab02f [领先 1] fix a new txt
步骤二:解决版本分支的冲突问题
1.在不同分支中修改相同文件的相同行数据,模拟数据冲突
[root@web2 project]# git checkout hotfix
切换到分支 'hotfix'
[root@web2 project]# echo "AAAA" > a.txt
[root@web2 project]# git add .
[root@web2 project]# git commit -m "a.txt by hot"
[hotfix cfbfd1f] a.txt by hot
1 file changed, 1 insertion(+)
create mode 100644 a.txt
[root@web2 project]# git checkout master
切换到分支 'master'
[root@web2 project]# echo "BBBB" > a.txt
[root@web2 project]# git add .
[root@web2 project]# git commit -m "a.txt by mas"
[master 108106c] a.txt by mas
1 file changed, 1 insertion(+)
create mode 100644 a.txt
[root@web2 project]# git merge hotfix
自动合并 a.txt
冲突(添加/添加):合并冲突于 a.txt
自动合并失败,修正冲突然后提交修正的结果。
2.查看有冲突的文件内容,修改文件为最终版本的数据,解决冲突
[root@web2 project]# cat a.txt #该文件中包含有冲突的内容
<<<<<<< HEAD
BBBB
=======
AAAA
>>>>>>> hotfix
[root@web2 project]# vim a.txt #修改该文件,为最终需要的数据,解决冲突
AAAA
[root@web2 project]# git add .
[root@web2 project]# git commit -m "fin a.txt" #改为最终版本
[master 87e3f8e] fin a.txt
总结:分支指针与HEAD指针的关系。
创建分支的本质是在当前提交上创建一个可以移动的指针
如何判断当前分支呢?答案是根据HEAD这个特殊指针
分支操作流程如图1,图2,图3,图4,图5所示。
HEAD指针指向master分支
切换分支,HEAD指针指向testing分支
在testing分支中修改并提交代码
将分支切换回master分支
在master分支中修改数据,更新版本
Git服务器
问题
Git不同的服务器形式,具体要求如下:
方案
Git支持很多服务器协议形式,不同协议的Git服务器,客户端就可以使用不同的形式访问服务器。创建的服务器协议有SSH协议、Git协议、HTTP协议。
步骤一:SSH协议服务器(支持读写操作)
1.创建基于密码验证的SSH协议服务器(web1主机操作)
[root@web1 ~]# git init --bare /var/git/base_ssh
Initialized empty Git repository in /var/git/base_ssh/
2.客户端访问的方式(web2主机操作)
[root@web2 ~]# git clone [email protected]:/var/git/base_ssh
[root@web2 ~]# rm -rf base_ssh
3.客户端生成SSH密钥,实现免密码登陆git服务器(web2主机操作)
[root@web2 ~]# ssh-keygen -f /root/.ssh/id_rsa -N ''
[root@web2 ~]# ssh-copy-id 192.168.2.100
[root@web2 ~]# git clone [email protected]:/var/git/base_ssh
[root@web2 ~]# git push
步骤二:Git协议服务器(只读操作的服务器)
1.安装git-daemon软件包(web1主机操作)
[root@web1 ~]# yum -y install git-daemon
2.创建版本库(web1主机操作)
[root@web1 ~]# git init --bare /var/git/qaqa
初始化空的 Git 版本库于 /var/git/qaqa/
3.修改配置文件,启动git服务(web1主机操作)
[root@web1 ~]# vim /usr/lib/systemd/system/[email protected]
修改前内容如下:
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
[root@web1 ~]# systemctl start git.socket #起服务
4.客户端访问方式(web2主机操作)
[root@web2 project]# cd
[root@web2 ~]# git clone git://192.168.2.100/haha
[root@web2 ~]# ls
Desktop haha lnmp_soft lnmp_soft.tar.gz nginx-1.12.2 nginx-1.12.2.tar.gz project
步骤三:HTTP协议服务器(只读操作的服务器)
1.安装gitweb、httpd软件包(web1主机操作)
[root@web1 ~]# yum -y install httpd gitweb
2.修改配置文件,设置仓库根目录(web1主机操作)
[root@web1 ~]# vim +11 /etc/gitweb.conf #+11可以直接跳转到第11行
10 #our $projectroot = "/var/lib/git";
11 $projectroot = "/var/git"; #以第十行为模板书写git仓库的路径
12 # Set the list of git base URLs used for URL to where fetch project from, i.e.
3.启动httpd服务器
[root@web1 ~]# systemctl restart httpd
4.客户端访问方式(web2主机操作)
注意:调用虚拟机中的firefox浏览器,需要在远程时使用ssh -X 服务器IP,并且确保真实主机的firefox已经关闭。
[root@web2 ~]# firefox http://192.168.2.100/git/
基本概念
PM(Redhat Package Manager)是用于Redhat、CentOS、Fedora等Linux 分发版(distribution)的常见的软件包管理器。因为它允许分发已编译的软件,所以用户只用一个命令就可以安装软件。
应用场景
打包流程
制作nginx的RPM包
问题
使用nginx-1.12.2版本的源码软件,生成对应的RPM包软件,具体要求如下:代码段 小部件
方案
安装rpm-build软件包,编写SPEC配置文件,创建新的RPM软件包。
配置文件中的描述信息如表-2:
步骤一:安装rpm-build软件
1.安装rpm-build软件包
[root@web1 ~]# yum -y install rpm-build
2.生成rpmbuild目录结构
[root@web1 ~]# rpmbuild -ba xiaotiantian
错误:stat /root/xiaotiantian 失败:没有那个文件或目录
[root@web1 ~]# ls /root/rpmbuild/ //自动生成的目录结构
BUILD BUILDROOT RPMS SOURCES SPECS SRPMS
#SOURCES目录下存放源码
#RPMS目录,生成的RPM包存放在这里
#SPECS目录下写将源码变成RPM包的配置文件
3.准备工作,将源码软件复制到SOURCES目录
[root@web1 ~]# cp /root/lnmp_soft/nginx-1.12.2.tar.gz /root/rpmbuild/SOURCES/
4.创建并修改SPEC配置文件
[root@web1 ~]# cd /root/rpmbuild/SPECS/
[root@web1 SPECS]# vim nginx.spec #扩展名必须要以spec结尾
Name:nginx #源码包软件名称
Version:1.12.2 #源码包软件的版本号
Release: 1%{?dist} #制作的RPM包版本号
Summary:this is a web server. #RPM软件的概述
#Group: #软件包组
License:GPL #软件的协议
URL:www.tiantian.com #网址
Source0:nginx-1.12.2.tar.gz #源码包软件的全称
#BuildRequires: #制作RPM时的依赖关系
#Requires: #安装RPM时的依赖关系
%description
this is xiao tian tian ohouhouhouhohu #软件的详细描述
%post #非必要操作:安装后脚本(创建账户)
useradd nginx
echo nginx > /tmp/a.txt
%prep
%setup -q #自动解压源码包,并cd进入目录
%build
./configure --with-http_ssl_module --user=nginx #./configure源码安装
make %{?_sm
步骤二:使用配置文件创建RPM包
[root@web1 SPECS]# ls
nginx.spec
[root@web1 SPECS]# rpmbuild -ba nginx.spec
[root@web1 SPECS]# ls /root/rpmbuild/RPMS/
x86_64
[root@web1 SPECS]# ls /root/rpmbuild/RPMS/x86_64/
nginx-1.12.2-1.el7.centos.x86_64.rpm nginx-debuginfo-1.12.2-1.el7.centos.x86_64.rpm
步骤三:安装软件
[root@web1 ~]# yum install /root/rpmbuild/RPMS/x86_64/nginx-1.12.2-1.el7.centos.x86_64.rpm
nginx.x86_64 0:1.12.2-1.el7.centos
完毕!
[root@web1 ~]# rpm -qa | grep nginx
nginx-1.12.2-1.el7.centos.x86_64
[root@web1 ~]# ls /usr/local/nginx/
conf html logs sbin
[root@web1 ~]# yum info nginx.x86_64
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
已安装的软件包
名称 :nginx
架构 :x86_64
版本 :1.12.2
发布 :1.el7.centos
大小 :797 k
源 :installed
简介 : this is a web server.
网址 :www.tiantian.com
协议 : GPL
描述 : this is xiao tian tian ohouhouhouhohu