七 Git版本控制

 

把环境准备node

主机名 node1  ip地址10.0.0.11 python

             node2             10.0.0.12linux

             node3             10.0.0.13nginx

操做系统centos7 git

在node1中设置主机解析web

10.0.0.11 node1redis

10.0.0.12 node2sql

10.0.0.13 node3vim

文件下载 https://pan.baidu.com/share/init?surl=6m5BVuhBSgtw1-_XTaJdmw 密码 pct9windows

=================================================================

为何须要作git版本控制

咱们在作某件事的时候,须要不少次才能完成,为了不没必要要的风险在下一次继续作的时候都会

手动作个一备份,方便有问题时能回滚、对比 找出问题。

但这样比较麻烦,因此有了git版本控制。

他能够自动生成备份、知道改动的地方、随时回滚

 常见的版本控制系统

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

Git global setup
git config --global user.name "Administrator"
git config --global user.email "admin@example.com"
Create a new repository  远程仓库克隆到本地仓库中
git clone git@10.0.0.11:oldboy/web.git 克隆仓库到本地
cd web 进入本地仓库
touch README.md  建立文件
git add README.md 提交到缓存
git commit -m "add README" 提交到仓库
git push -u origin master  推送到远程仓库
Existing folder
cd existing_folder
git init
git remote add origin git@10.0.0.11:oldboy/web.git
git add .
git commit -m "Initial commit"
git push -u origin master
Existing Git repository    把已经存在的本地仓库 git_data 推到 远程仓库中
cd existing_repo
git remote rename origin old-origin
git remote add origin git@10.0.0.11:oldboy/web.git 本地建立一个 远程仓库
# git push -u gitlab master 推送master 分支
git push -u origin --all git push -u origin --tags

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 生成的备份文件 

把备份命令加入 定时任务

 

恢复备份

 

相关文章
相关标签/搜索