七 Git版本控制
把环境准备
主机名 node1 ip地址10.0.0.11
node2 10.0.0.12
node3 10.0.0.13
操作系统centos7
在node1中设置主机解析
10.0.0.11 node1
10.0.0.12 node2
10.0.0.13 node3
文件下载 https://pan.baidu.com/share/init?surl=6m5BVuhBSgtw1-_XTaJdmw 密码 pct9
=================================================================
为什么需要做git版本控制
我们在做某件事的时候,需要很多次才能完成,为了避免不必要的风险在下一次继续做的时候都会
手动做个一备份,方便有问题时能回滚、对比 找出问题。
但这样比较麻烦,所以有了git版本控制。
他可以自动生成备份、知道改动的地方、随时回滚
常见的版本控制系统
1
SVN
集中式的版本控制系统,只有一个中央数据仓库,如果中央数据仓库挂了或者不可访问,
所有的使用者无法使用SVN,无法进行提交或备份文件。
2
Git
分布式的版本控制系统,在每个使用者电脑上就有一个完整的数据仓库,没有网络依然可以使用Git。
当然为了习惯及团队协作,会将本地数据同步到Git服务器或者GitHub等代码仓库。
==========================================================
git安装与配置
Git分布式版本控制系统最佳实践 - 老男孩教育博客 http://blog.oldboyedu.com/git/
系统环境
CentOS7.4 防火墙和selinux关闭
安装Git
yum -y install git
[root@node1 ~]# git --version
git version 1.8.3.1
Git全局配置
git config --global user.name "zyc" #配置git使用用户
git config --global user.email "zhangyao@oldboyedu.com" #配置git使用邮箱
git config --global color.ui true #语法高亮
git config --list # 查看全局配置
初始化Git工作目录
需要管理一个目录需要先初始化
mkdir git_data
cd git_data/
# 初始化 会在目录中生成一个.git的隐藏目录
git init
# 查看工作区状态
git status
git_data工作目录 工作目录里的.git/ 目录是本地仓库 本地仓库里的index是暂存区
touch a.txt
git status
文件未被跟踪
git add a.txt 把文件传到了暂存区 由未跟踪状态到已跟踪状态
git status
# git rm --cached a.txt 从缓存区删除 变为未跟踪状态
# git status
git commit -m 'first commit' #→git commit提交暂存文件至版本库 从以跟踪状态变为未被修改状态
以源文件的形式存储 被git管理
删除暂存区数据
没有添加到暂存区的数据直接rm删除即可。
已经添加到暂存区数据:
git rm --cached database
#→将文件从git暂存区域的追踪列表移除(并不会删除当前工作目录内的数据文件)
git rm -f database
#→将文件数据从git暂存区和工作目录一起删除
==========================================
# rm -f b.txt 先删除工作目录的文件
# git rm --cached b.txt 从追踪列表中移除
# git commit -m 'delete b.txt' 提交生效 从本地仓库删除
重命名暂存区数据
没有添加到暂存区的数据直接mv/rename改名即可。
已经添加到暂存区数据:
git mv a.txt ab.txt
git commit -m "rename a.txt ab.txt" 提交生效
查看历史记录
git log #→查看提交历史记录
git log -2 #→查看最近几条记录
git log -p -1 #→-p显示每次提交的内容差异,例如仅查看最近一次差异
git log --stat -2 #→--stat简要显示数据增改行数,这样能够看到提交中修改过的内容,
对文件添加或移动的行数,并在最后列出所有增减行的概要信息
git log --pretty=oneline #→--pretty根据不同的格式展示提交的历史信息
git log --pretty=fuller -2 #→以更详细的模式输出提交的历史记录
git log --pretty=fomat:"%h %cn" #→查看当前所有提交记录的简短SHA-1哈希字串与提交者的姓名,其他格式见备注。
还原历史数据
1 # echo "333">>ab.txt 修改工作目录的文件
看状态 可以提交到缓存目录生效,也可以用缓存区的覆盖工作目录进行恢复
# git checkout -- ab.txt 根据提示覆盖
# cat ab.txt 恢复到了之前的状态
123
222
2 # echo "333" >>ab.txt
# git add . 提交到缓存目录
现在就只有本地仓库的数据是原来的,那就通过仓库进行还原
# git log --oneline 查看提交仓库的记录
# git reset --hard 8af7b39 利用版本指针恢复到了最后一次的提交
Git服务程序中有一个叫做HEAD的版本指针,当用户申请还原数据时,
其实就是将HEAD指针指向到某个特定的提交版本,但是因为Git是分布式版本控制系统,
为了避免历史记录冲突,故使用了SHA-1计算出十六进制的哈希字串来区分每个提交版本,
另外默认的HEAD版本指针会指向到最近的一次提交版本记录,而上一个提交版本会叫HEAD^,
上上一个版本则会叫做HEAD^^,当然一般会用HEAD~5来表示往上数第五个提交版本。
git reset --hard HEAD^ #→还原历史提交版本上一次
git reset --hard 3de15d4 #→找到历史还原点的SHA-1值后,就可以还原(值不写全,系统会自动匹配)
还原未来数据
什么是未来数据?就是你还原到历史数据了,但是你后悔了,
想撤销更改,但是git log已经找不到这个版本了。
git reflog #→查看未来历史更新点
然后利用 hard
标签使用
前面回滚使用的是一串字符串,又长又难记。
git tag v1.0 #→当前提交内容打一个标签(方便快速回滚),每次提交都可以打个tag。最近的一次提交打上标签
# git tag v2.0 9947d1bb245821 给指定的提交记录打上标签
git tag #→查看当前所有的标签
git show v1.0 #→查看当前1.0版本的详细信息
git tag v1.2 -m "version 1.2 release is test" #→创建带有说明的标签,-a指定标签名字,-m指定说明文字
git tag -d v1.0 #→我们为同一个提交版本设置了两次标签,删除之前的v1.0
[root@centos7 git_data]# git reset --hard 0bdf2e7
HEAD is now at 0bdf2e7 modified README file
[root@centos7 git_data]# git reset --hard V1.0
HEAD is now at a66370a add oldboy dir
对比数据
git diff可以对比当前文件与缓存区文件的区别,知道了对README作了什么修改
# echo '444' >>a.txt
# git diff
# gir diff --cached 查看缓存区文件于仓库文件的区别
确认没问题 就提交到仓库
# git commit -m "modify a.txt second"
分支结构
在实际的项目开发中,尽量保证master分支稳定,仅用于发布新版本,
平时不要随便直接修改里面的数据文件。
那在哪干活呢?干活都在dev分支上。每个人从dev分支创建自己个人分支,
开发完合并到dev分支,最后dev分支合并到master分支。
所以团队的合作分支看起来会像下图那样。
创建分支
# git status 默认安装好git时 都是在master分支上操作的
git branch linux #→创建分支 星号在那个分支上就是 当前分支
git branch dev
git checkout dev#→切换分支
git branch #→查看当前分支情况,当前分支前有*号
测试在dev分支修改文件并提交到git仓库,最后切换回master分支,你会发现什么呢?
最终都会指向同一个分支
合并分支
想把dev的工作成果合并到master分支上
先切换到master分支
git merge dev #→合并dev分支至master
查看合并的文件
git branch -d dev#→确认合并完成后,可以放心地删除dev分支。
分支冲突
合并分支后 两个分支对同一个文件进行修改再次合并就会报错
修改a.txt
vim a.txt 删掉多余的内容 然后提交到缓存和仓库
# git add .
# git commit -m "merge dev to master"
# git status
windows 客户端的使用
前面讲的都是linux客户端,在讲讲windows客户端使用,安装Git-2.10.0-64-bit。
windows的git,本质是windows上的linux系统
安装完成 桌面右键 Git Bash Here 进入命令行界面 操作与linux里的Git 操作一样
mkdir git_data
cd git_data
git config --global user.name "zhou"
git config --global user.email "44758635@qq.com"
git init
touch a.txt
git add .
git commit -m "commit a.txt"
或者右键Git GUI Here
TortoiseGit-2.2.0.0-64bit 给git加外壳,svn客户端的git版本
Git服务器 使用
前面我们已经知道Git人人都是中心,那他们怎么交互数据呢?
使用GitHub或者码云等公共代码仓库
使用GitLab私有仓库
GitHuB使用
Github顾名思义是一个Git版本库的托管服务,是目前全球最大的软件仓库,
拥有上百万的开发者用户,也是软件开发和寻找资源的最佳途径,
Github不仅可以托管各种Git版本仓库,还拥有了更美观的Web界面,
您的代码文件可以被任何人克隆,使得开发者为开源项贡献代码变得更加容易,
当然也可以付费购买私有库,这样高性价比的私有库真的是帮助到了很多团队和企业。
具体使用方法见博客http://blog.oldboyedu.com/git/
Git 常用命令
add #添加文件内容至索引
bisect #通过二分查找定位引入 bug 的变更
branch #列出、创建或删除分支
checkout #检出一个分支或路径到工作区
clone #克隆一个版本库到一个新目录
commit #记录变更到版本库
diff #显示提交之间、提交和工作区之间等的差异
fetch #从另外一个版本库下载对象和引用
grep #输出和模式匹配的行
init #创建一个空的 Git 版本库或重新初始化一个已存在的版本库
log #显示提交日志
merge #合并两个或更多开发历史
mv #移动或重命名一个文件、目录或符号链接
pull #获取并合并另外的版本库或一个本地分支
push #更新远程引用和相关的对象
rebase #本地提交转移至更新后的上游分支中
reset #重置当前HEAD到指定状态
rm #从工作区和索引中删除文件
show #显示各种类型的对象
status #显示工作区状态
tag #创建、列出、删除或校验一个GPG签名的 tag 对象
私有仓库GitLAB
安装文档 https://about.gitlab.com/downloads/#centos7
https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/
机器内存给大点
yum localinstall gitlab-ce-9.1.4-ce.0.el7.x86_64.rpm
gitlab-ctl reconfigure #→初始化,就执行一次
gitlab-ctl status/stop/start
通过浏览器访问页面,设置初始密码,其他操作类似GitHUB。
账户:root 密码自己设置为12345678
===============================
安装依赖
# yum install -y curl policycoreutils-python openssh-server
安装上传的rpm包
# rpm -ivh gitlab-ce-10.2.2-ce.0.el7.x86_64.rpm
安装完成 工作中尽量在全新的服务器上安装 避免端口冲突
配置
# vim /etc/gitlab/gitlab.rb
重新配置 生效
# gitlab-ctl reconfigure
查看状态
# gitlab-ctl status
13个服务
run: gitaly: (pid 24137) 299s; run: log: (pid 23849) 373s
run: gitlab-monitor: (pid 24163) 297s; run: log: (pid 23914) 361s
run: gitlab-workhorse: (pid 24126) 299s; run: log: (pid 23805) 387s
run: logrotate: (pid 23834) 379s; run: log: (pid 23833) 379s
run: nginx: (pid 23817) 385s; run: log: (pid 23816) 385s
run: node-exporter: (pid 23900) 367s; run: log: (pid 23899) 367s
run: postgres-exporter: (pid 24184) 295s; run: log: (pid 23999) 342s
run: postgresql: (pid 23585) 440s; run: log: (pid 23584) 440s
run: prometheus: (pid 24172) 296s; run: log: (pid 23978) 348s
run: redis: (pid 23525) 446s; run: log: (pid 23524) 446s
run: redis-exporter: (pid 23929) 355s; run: log: (pid 23928) 355s
run: sidekiq: (pid 23789) 393s; run: log: (pid 23788) 393s
run: unicorn: (pid 23751) 399s; run: log: (pid 23750) 399s
# netstat -lnupt 占用的端口挺多 所以建议部署在新的服务器上
Gitlab 常用命令
gitlab-ctl start 启动全部服务
gitlab-ctl restart 重启全部服务
gitlab-ctl stop 停止全部服务
gitlab-ctl reconfigure 生效配置文件
gitlab-ctl show-config 验证配置文件
gitlab-ctl uninstall 删除gitlab (保留数据)
gitlab-ctl cleanse 删除所有数据 重新开始
gitlab-ctl tail <查看服务的日志>
=========================================
gitlab使用
浏览器输入服务地址 10.0.0.11 访问Gitlab
进入登录界面设置密码 然后登录
linux客户端 生成秘钥 配置到gitlab上 基于ssh方式访问
# ssh-keygen -t dsa 生成 秘钥
设置 settings
把公钥 复制粘贴到 key 里 点击添加
创建项目
进入设置--dashboard仪表盘---new group新组---组名设置为oldboy 其他默认--点击创建
进入设置--dashboard仪表盘---new user新用户 其他默认
添加用户到之前创的oldboy组
组oldboy 用户dev 角色developer开发
进入设置--dashboard仪表盘---new project新项目
组lodboy 项目名web 描述不填 私有项目 添加
创建的项目加入到了oldboy组里 意味着oldboy组里的成员都能管理这个项目
根据成员的角色不同而权限也不同
====================================================================
项目操作命令等内容
Command line instructions
windows 客户端
同样 win的客户端也能使用linux简单的命令
创建ssh秘钥对不能用dsa 要用rsa
ssh-keygen -t rsa
登陆之前创建的dev用户 设置好密码,dev设置的开发权限所以没有管理员设置
给dev用户配置ssh的公钥
然后把web 仓库克隆到e盘
git clone git@10.0.0.11:oldboy/web.git
E盘 也就有了web的 本地仓库
进入web仓库 右键 Git Gui
建一个dev分支
在仓库创建一个文本文档
gui 刷新 追踪 commit 然后推到远程dev
现在进入web页面 web仓库就能看到 dev分支和里面的文件
gitlab 代码提交的流程
保护master 分支 用root用户 设置禁止dev用户推送数据到master分支
进入 web仓库 设置仓库保护 只允许master 有权限
现在master既是默认分支 又是 保护分支
测试 再次用dev用户往master分支上推送时失败 推送到dev分支 则正常
当开发完成 代码书写 就申请提交合并到master分支 然后有root用户受理
,实现项目的管理
gitlab 目录
gitlab_rails['backup_path'] = '/data/backup/gitlab'
gitlab_rails['backup_keep_time'] = 604800
mkdir /data/backup/gitlab -p
chown -R git.root gitlab/
/usr/bin/gitlab-rake gitlab:backup:create 备份命令
查看 backup 生成的备份文件
把备份命令加入 定时任务
恢复备份