Git
git简介
git是一个版本控制软件,目前主流的版本控制软件有git和svn
区别
集中式版本控制系统(svn)
- 开发者之间共用一个仓库(repository)
- 所有操作需要联网,一旦断网,无法保存操作
分布式版本控制系统(git)
- 每个开发者都是一个仓库的完整克隆,每个人都是服务器
- 支持断网操作
Git工作流图
git先建立一个共享目录,客户端上传文件,每次修改,都会在git服务器上保留各个版本
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-10QGurir-1631876698165)(E:\Typort\image-20210913214157795.png)]](https://img-blog.csdnimg.cn/d4f64f4dc1e6462ba317cb5c6473b264.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAaGFoYXhpeGkxMzE=,size_16,color_FFFFFF,t_70,g_se,x_16)
git使用共享目录正式名称为版本库
版本库
典型的客户/服务器系统
- 版本库是版本控制的核心
- 任意数量的客户端
- 客户端通过写数据库方向代码
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iyluvH5K-1631876698168)(E:\Typort\image-20210913213714080.png)]](https://img-blog.csdnimg.cn/0d93d000657e4c40bf420b90fca4d988.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAaGFoYXhpeGkxMzE=,size_10,color_FFFFFF,t_70,g_se,x_16)
Git的基本操作
问题:
要求先快速搭建好一台Git服务器,并测试该版本控制软件,要求如下
- 安装git软件
- 创建版本库
- 客户端克隆版本仓库到本地
- 本地工作目录修改数据
- 题交本地修改到服务器
方案:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9Z9RG8ch-1631876698170)(E:\Typort\image-20210913221131963.png)]](https://img-blog.csdnimg.cn/aa7e9724f3ea44e5994978373ccfc70d.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAaGFoYXhpeGkxMzE=,size_20,color_FFFFFF,t_70,g_se,x_16)
步骤
步骤一:部署git服务器
1)yum安装git软件
yum -y install git
git --version
2)初始化一个空仓库
mkdir /var/git
git init /var/git/project --bare
ls /var/git/project
步骤二:客户端测试
使用git常用指令列表
指令 | 使用 |
---|
clone | 将远程服务器的仓库克隆到本地 | config | 修改git配置 | add | 添加修改到暂存区 | commit | 提交修改到本地仓库 | push | 提交修改到远程服务器 |
1)clone克隆服务器仓库到本地
yum -y install git
git clone root@192.168.19.130:/var/git/project
cd project
ls -a
ls .git
2)修改git配置
git config --global user.name "your name"
git config --global user.email "131@163.com"
cat ~/.gitconfig
[user]
email = 131@163.com
name = your name
3)本地工作区对数据进行增删改查(必须进入仓库在进行操作)
这个project就是我们本地工作区(也是仓库)
echo "init date "> init.txt
mkdir demo
cp /etc/hosts demo
4)查看仓库中数据件的状态
git status
5)将工作区的修改提交到缓存区
git add .
6)将暂存区修改提交到本地仓库
git commit -m "注释"
多创建几个版本,方便接下来测试
7)将本地仓库中的数据推送到远程服务器(推送到git服务器)
git config --global push.default simple
git push
8)将服务器上的数据更新到本地
备注:可能其他人也在修改数据并提交服务器,就会导致自己的本地数据为旧数据,使用pull就可以将服务器上新的数据更新到本地
git pull
9)查看版本日志
git log
git log --pretty=oneline
git log --oneline
git reflog
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FtLUtOVh-1631876698173)(E:/Typort/image-20210917163705254.png)]](https://img-blog.csdnimg.cn/dbd9d4a807d94779a70eb1c932a2f6d4.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAaGFoYXhpeGkxMzE=,size_20,color_FFFFFF,t_70,g_se,x_16)
每一个commit 是一个版本
备注:客户端也可使用图形程序访问服务器,windows需要安装git和tortoisegit
在Linux中git的图形化软件包(git-gui)
git指针操作(head指针)
问题:
沿用上述练习,使用head指针,具体要求如下:
查看git版本信息
移动指针
通过移动head指针恢复数据
方案
head指针是一个可以在任何分支和版本移动的指针,通过移动指针我们可以将数据还原至任何版本,没做一次提交操作都会导致git更新一个版本,head指针也跟着自动移动
步骤:head指针基本操作
1)准备工作(多对数据仓库进行修改,提交操作,以产生多个版本)
echo "asdaweq" >> init.txt
git add .
git commit -m "v2"
echo "asdaweq" >> new.txt
git add .
git commit -m "v3"
echo "asdaw123eq" >> new.txt
git add .
git commit -m "v4"
git push
2)查看版本信息
git log --oneline
a0789a1 (HEAD -> master, origin/master) v4
a308d7d v3
1423449 v2
3759966 v1
2a88674 zhushu
也可使用git reflog来查看
git reflog
a0789a1 (HEAD -> master, origin/master) HEAD@{0}: commit: v4
a308d7d HEAD@{1}: commit: v3
1423449 HEAD@{2}: commit: v2
3759966 HEAD@{3}: commit: v1
2a88674 HEAD@{4}: commit (initial): zhushu
3)移动head指针,将数据还原到任意版本
git reset --hard 版本号
4)模拟误删除后的数据还原操作
删除数据并提交,然后移动指针到有这个数据的版本,复制,然后回到刚刚的版本,在进行粘贴
git rm init.txt
git commit -m "rm"
git reflog
git reset --hard 版本号
cp init.txt /tmp/
git reset --hard 版本号(最新版)
cp /tmp/init.txt .
git add .
git commit -m "还原"
git分支操作
问题:
沿用上述练习,使用git分支,具体要求如下
方案:
git支持按功能模块、时间、版本等标准创建分支,分支可以让开发分多条主线同时进行,每条主线互不影响,分支效果如图所示
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HLa8DeM2-1631876698175)(E:/Typort/image-20210917172107179.png)]](https://img-blog.csdnimg.cn/df47fd9313ee45519f3316ac1c770c6c.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAaGFoYXhpeGkxMzE=,size_20,color_FFFFFF,t_70,g_se,x_16)
一个圆圈代表一个版本,一般git服务器都是存放代码的
master分支(主分支,是代码的核心)
develop分支(develop最新开发成果的分支)
release分支(未发布新产品设置的分支)
hotfix分支(为了修复软件bug缺陷的分支)
feature分支(为开发新功能设置的分支)
步骤:
步骤一:查看并创建分支
1)查看当前分支
git status
git branch -v
2)创建分支
git branch hotfix
git branch feauture
git branch -v
feauture 3fc4c5d rm
hotfix 3fc4c5d rm
* master 3fc4c5d [ahead 1] rm
步骤二:切换与合并分支
1)切换分支
git checkout hotfix
git branch -v
git checkout hotfix
Switched to branch 'hotfix'
git branch -v
feauture 3fc4c5d rm
* hotfix 3fc4c5d rm
master 3fc4c5d [ahead 1] rm
2)在新的分支上可以继续进行数据操作(增删改查)
echo "fix" > fix.txt
git add .
git commit -m "fix"
3)将hotfix修改的数据合并到master分支
注意:在合并前必须要先切换到master分支,然后在执行merge命令
git checkout master
ls
git merge hotfix

4)将所有本地修改提交给远程服务器
git push
步骤三:解决版本分支的冲突问题
1)在不同分支中修改相同文件的相同行数据,模拟数据冲突
git checkout hotfix
echo "AAA" > a.txt
git add .
git commit -m "a"
git checkout master
echo "BBB" > a.txt
git add .
git commit -m "b"
git merge hotfix
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r2g5lfw1-1631876698177)(E:/Typort/image-20210917175416620.png)]](https://img-blog.csdnimg.cn/186e8c95cac04de1a8725d6c67a0e361.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAaGFoYXhpeGkxMzE=,size_20,color_FFFFFF,t_70,g_se,x_16)
自动合并失败,修正冲突然后提交修正的结果
2)查看有冲突的文件内容,修改文件为最终版本的数据,解决冲突
vim a.txt
<<<<<<< HEAD
BBB
=======
AAA
>>>>>>> hotfix
vim a.txt
BBB
git add .
git commit -m "resoled"
总结
分支指针与head指针的关系
- 创建分支的本质是当前提交上创建一个可以移动的指针
- 如何判断当前分支,答案是根据head这个特殊指针
分支操作流程如图5、6、7、8所示



git服务器
问题:
沿用上面练习,了解git不同的服务器模式,具体要求如下:
- 创建ssh协议服务器
- 创建git协议服务器
- 创建HTTP协议服务器
git是基于ssh协议来完成操作的
方案:
git支持很多服务器协议形式,不同协议的git服务器,客户端就可以使用不同的形式访问服务器,创建的服务器协议有ssh协议,git协议,HTTP协议
步骤:
步骤一:ssh协议服务器(支持读写操作)
1)创建基于密码验证的ssh协议服务器(git服务器操作)
git init --bare /var/git/base_ssh
2)客户端访问的方式(A操作)
git clone root@192.168.19.130:/var/git/base_ssh
rm -rf base_ssh/
3)客户端生成ssh密钥,实现免密码登录git服务器(客户机操作)
ssh-keygen -f /root/.ssh/id_rsa -N ''
ssh-copy-id 192.168.19.130
git clone root@192.168.19.130:/var/git/base_ssh
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MS08CRaU-1631876698182)(E:/Typort/image-20210917183036227.png)]](https://img-blog.csdnimg.cn/d3b3057d21e54a9c929cc785252a78f4.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAaGFoYXhpeGkxMzE=,size_20,color_FFFFFF,t_70,g_se,x_16)
再次克隆不再需要密码
步骤二:git协议服务器(只读操作的服务器)
如果服务器中没有ssh服务,可使用以下方法
1)安装git-daemon软件包(git服务器操作)
yum -y install git-daemon
2)创建版本库(git服务器操作)
git init --bare /var/git/base_git
3)修改配置文件,启动git服务(git服务器操作)
vim /usr/lib/systemd/system/git@.service
修改前
...
ExecStart=-/usr/libexec/git-core/git-daemon --base-path=/var/lib/git --export-all \
--user-path=public_git --inetd --log-destination=stderr --verbose
...
修改后
...
ExecStart=-/usr/libexec/git-core/git-daemon --base-path=/var/git --export-all \
--user-path=public_git --inetd --log-destination=stderr --verbose
...
启动服务
systemctl start git.socket
4)客户端访问
git clone git://192.168.19.130/base_git
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xR2CorVl-1631876698183)(E:/Typort/image-20210917184302294.png)]](https://img-blog.csdnimg.cn/f100a55d266f4a56a044d4333ed7bd08.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAaGFoYXhpeGkxMzE=,size_20,color_FFFFFF,t_70,g_se,x_16)
步骤三:HTTP协议的服务器(只读操作的服务器)
前两种方式要都要求客户端有git软件,才能进行操作,http不装软件,也能看到仓库
1)安装gitweb、httpd软件包(git服务器操作)
yum -y install httpd gitweb
2)修改配置文件,设置仓库根目录
vim +11 /etc/gitweb.conf
$projectroot = "/var/git";
3)创建版本仓库(git服务器操作)
git init --bare /var/git/base_http
4)启动httpd服务器
systemctl start httpd
5)客户端访问方式
http://192.168.19.130/git

|