版本控制
- 基本概念
* 版本库
* 分布式版本控制
- 常用软件
* 版本控制软件
版本库
典型的客户/服务器系统
* 版本库是版本控制的核心
* 任意数量客户端
* 客户端通过写数据库分享代码
分布式版本控制
- 集中式版本控制系统
* 开发者之间共用一个仓库(repository)
* 所有操作需要联网
- 分布式版本控制系统
* 每个开发者都是一个仓库的完整克隆, 每个人都是服务器
* 支持断网操作
- Git基本概念
* Git仓库 : 保存所有数据的地方
* 工作区 : 从仓库中提取出来的文件, 放在磁盘上供你使用或修改
* 暂存去 : 就是一个文件, 索引文件, 保存了下次将提交的文件列表信息
版本控制软件
- 集中式版本控制软件
* CVS
* SVN
- 分布式版本控制软件
* Git
* BitKeeper(收费)
git基础
- 服务器设置
* 安装Git
* 创建服务器版本仓库
- 服务器操作
* 客户端访问方式
* 客户端命令行工具
* Windows客户端软件
安装git
]#yum -y install git
]#git --version
创建服务器版本仓库
服务器是一台多人协作的中心服务器
init初始化
]#git init /var/git --bare
]#ls /var/git
常用git指令列表
指令 作用
clone 将远程服务器的仓库克隆到本地
config 修改git配置
add 添加修改到暂存区
commit 提交修改到本地仓库
push 提交修改到远程服务器
Git进阶
- HEAD指针
* HEAD指针概述
* 移动HEAD指针
- Git分支
* 分支的基本概念
* 管理多分支
* 解决分支冲突
* 分支与HEAD指针的关系
* 多分支提交的流程
- Git服务器
* SSH协议
* Git协议
* HTTP协议
- GitHub
* 简介
* 使用GitHub
HEAD指针概述
- HEAD指针是一个可以在任何分支和版本移动的指针
- 通过移动指针我们可以将数据还原至任何版本
移动HEAD指针
- 先使用log指令查看版本信息
git log --pretty=oneline
- 使用git reset --hard 版本号, 回到版本号的版本
- 在使用ls查看当前工作目录的资料是否还原
Tips:
HEAD^ #表示上一个版本
HEAD\~数字 #表示回归到前n个版本
默认log仅显示当前到之前的版本信息, --all
分支的基本概念
分支可以让开发分多条主线同时进行, 每条主线互不影响
- 按功能模块分支、按版本分支
- 分支也可以合并
常见的分支规范
- MASTER分支(MASTER是主分支,是代码的核心)
- DEVELOP分支(DEVELOP最新开发成果的分支)
- RELEASE分支(为发布新产品设置的分支)
- HOTFIX分支(为了修复软件BUG缺陷的分支)
- FEATURE分支(为开发新功能设置的分支)
管理多分支
- 查看当前分支
git status
git branch -v
- 创建分支
git branch 分支名
- 切换分支
git checkout 分支名
- 在新的分支上就可以继续修改代码
* 修改文件、创建文件等操作
* 正常add, commit提交版本库
- 合并分支
git checkout 分支名1 #切换到欲要合并到的分支
git merge 分支名2 #将分支2合并到分支1
解决分支冲突
修改了不同分支中相同文件的相同行
系统无法合并分支, 产生了冲突
git checkout hotfix #切换至hotfix分支
vim a.txt
git add a.txt #修改文件并提取
git commit -m "modify a.txt"
git checkout master #切换分支
vim a.txt
git add a,txt
git commit -m "modify a.txt"
git merge hotfix #合并时冲突
自动合并a.txt
冲突(内容) : 合并冲突于a.txt
自动合并失败, 修正冲突然后提交修正的结果
查看有冲突的文件
cat a.txt
<<<<<<< HEAD
one more line #当前分支内容
=======
new line #其他分支内容
>>>>>>> hotfix
直接修改有冲突的文件, 修改为最终需要的文件内容
修改完成后, 正常add, commit提交, 解决冲突
Git服务器
- SSH协议
密码认证访问:
* 服务器安装git
* 使用git命令初始化版本仓库
* 客户端使用SSH远程访问(可读写权限)
免密码远程Git服务器(密钥授权)
* 客户端生成SSH密钥
ssh-keygen -f /root/.ssh/id_rsa -N '' #不产生交互生成密钥
* 将密钥拷贝给Git服务器
ssh-copy-id Git服务器IP地址
* 测试上传、上传代码到远程服务器
git clone root@服务器IP:/var/git
git push
- Git协议
Git协议访问支持无授权访问(只读)
* 服务器安装git-daemon软件包
yum -y install git-daemon
* 服务器初始化仓库(必须要在/var/lib/git/目录建仓库)
git init --bare /var/lib/git/project
如果不在/var/lib/git下创建, 则要修改 /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 #--base-path后跟要分享的目录
--export-all --user-path=public_git --syslog --inetd –verbose
* 服务器启动Git服务
systemctl start git.socket
* 客户端使用git协议访问(只读)
git clone git://服务器IP/project
- HTTP协议
支持浏览器访问
* 服务器安装gitweb软件包
yum -y install httpd gitweb
* 修改配置文件, 设置仓库根目录
vim +11 /etc/gitweb.conf
$projectroot="/var/lib/git" #添加一行
* 启动httpd服务
systemctl start httpd
案例一 : Git基本操作
本案例要求先快速搭建好一台Git服务器,并测试该版本控制软件,要求如下:
* 安装Git软件
* 创建版本库
* 客户端克隆版本仓库到本地
* 本地工作目录修改数据
* 提交本地修改到服务器
步骤一 : 部署Git服务器(192.168.2.100作为远程git服务器)
1) YUM安装Git软件
yum -y install git
2) 初始化一个仓库
mkdir /var/git
git init /var/git/project --bare
ls /var/git/project
branches config description HEAD hooks info objects refs
步骤二 : 客户端测试(192.168.2.200作为客户端主机)
1) clone克隆服务器仓库到本地
yum -y install git
git clone [email protected]:/var/git/project
cd project
ls -A
.git #本地仓库
2) 修改git配置
git config --global user.email [email protected]
git config --global user.name "Touchl"
cat /root/.gitconfig
3) 本地工作区对数据进行增删改查(必须要进入仓库操作数据)
echo "init" > init.txt
mkdir demo
cp /etc/hosts demo
4) 查看仓库中的数据的状态
git status
5) 将工作区的修改提交到暂存区
git add .
6) 将暂存区修改提交到本地仓库
git commit -m "注释, 可为任意字符"
git status
7) 将本地仓库中的数据推送到远程服务器(web2数据推送到web1)
git config --global push.default simple
git push
git status
8) 将服务器上的数据更新到本地(web1的数据更新到web2)
备注 : 可能其他人也在修改数据并提交服务器,就会导致自己的本地数据为旧数据,使用pull就可以将服务器上新的数据更新到本地。
git pull
9) 查看版本日志
git log
git log --pretty=oneline
git log --oneline
git reflog
案例二 : HEAD指针操作
沿用案例一,学习操作HEAD指针,具体要求如下:
* 查看Git版本信息
* 移动指针
* 通过移动HEAD指针恢复数据
HEAD指针是一个可以在任何分支和版本移动的指针,通过移动指针我们可以将数据还原至任何版本。每做一次提交操作都会导致git更新一个版本,HEAD指针也跟着自动移动
步骤一 : HEAD指针基本操作
1) 准备工作(多对数据仓库进行修改、提交操作, 以产生多个版本)
echo "new file" > new.txt
git add .
git commit -m "add new.txt"
echo "first" >> new.txt
git add .
git commit -m "new.txt:first line"
echo "second" >> new.txt
git add .
git commit -m "new.txt:second"
echo "third" >> new.txt
git add .
git commit -m "new.txt:third"
git push
echo "123" > num.txt
git add .
git commit -m "num.txt:123"
echo "456" > num.txt
git add .
git commit -m "num.txt:456"
echo "789" > num.txt
git add .
git commit -m "num.txt:789"
git push
2) 查看Git版本信息
git reflog
91ca38a HEAD@{2}: commit: new.txt:789
54873e7 HEAD@{3}: commit: new.txt:456
5768d89 HEAD@{4}: commit: new.txt:123
15280ce HEAD@{5}: commit: new.txt:third
ae497ab HEAD@{6}: commit: new.txt: second
2f68e4f HEAD@{7}: commit: new.txt: first line
cf7aa2a HEAD@{8}: commit: add new.txt
e87537c HEAD@{9}: commit (initial): add some things
git log --oneline
91ca38a new.txt:789
54873e7 new.txt:456
5768d89 new.txt:123
15280ce new.txt:third
ae497ab new.txt: second
2f68e4f new.txt: first line
cf7aa2a add new.txt
e87537c add some things
3) 移动HEAD指针, 将数据还原到任意版本
提示 : 当前HEAD指针为HEAD@{0}
git reset --hard 301c0
git reflog
301c090 HEAD@{0}: reset: moving to 301c0
04ddc0f HEAD@{1}: commit: num.txt:789
7bba57b HEAD@{2}: commit: num.txt:456
301c090 HEAD@{3}: commit: num.txt:123
b427164 HEAD@{5}: commit: new.txt:third
0584949 HEAD@{6}: commit: new.txt:second
ece2dfd HEAD@{7}: commit: new.txt:first line
e1112ac HEAD@{8}: commit: add new.txt
1a0d908 HEAD@{9}: commit (initial): 初始化
cat num.txt #查看文件是否为123
123
git reset --hard 7bba57b
cat num.txt #查看文件是否为123,456
123
456
git reflog #查看指针移动历史
7bba57b HEAD@{0}: reset: moving to 7bba57b
301c090 HEAD@{1}: reset: moving to 301c0
… …
git reset --hard 04ddc0f #回到最后一次修改的版本
案例三 : Git分支操作
沿用案例二, 学习操作Git分支, 具体要求如下:
* 查看分支
* 创建分支
* 切换分支
* 合并分支
* 解决分支的冲突