七 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版本控制。

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

 常见的版本控制系统

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

把备份命令加入 定时任务

 

恢复备份

 

原文地址:https://www.cnblogs.com/cqzhou/p/9268239.html