七 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
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 生成的备份文件
把备份命令加入 定时任务
恢复备份
七 Git版本控制的更多相关文章
- Git版本控制:Git查阅、撤销文件修改和撤销文件追踪
http://blog.csdn.net/pipisorry/article/details/47867097 查看文件的修改历史 git log --pretty=oneline 文件名 # 显示修 ...
- GIT 版本控制常用命令学习汇总
GIT 版本控制常用命令汇总 git version 查看当前git版本信息 git help 获取全部命令帮助信息 git help <command> 获取指定命令帮助信息 git c ...
- Git版本控制与工作流
基本概念 Git是什么? Git是分布式版本控制系统,与SVN类似的集中化版本控制系统相比,集中化版本控制系统虽然能够令多个团队成员一起协作开发,但有时如果中央服务器宕机的话,谁也无法在宕机期间提交更 ...
- Git版本控制教程
Git 版本控制入门 不了解Git请查看权威Git书籍 ProGit(中文版). 一份很好的 Git 入门教程,点击这里查看. Git客户端下载地址: 官方Git - TortoiseGit - So ...
- Git版本控制工具(三)----远程仓库GitHub的使用
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- git版本控制工具(二)----本地版本库的常用操作
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- Git版本控制工具(一)----git的安装及创建版本库
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- Git 版本控制工具(学习笔记)
GIT(分布式) 一.Git 初始版本控制工具 1. 安装Git Ubuntu系统下,打开shell界面,输入: sudo apt-get install git-core 之后回车输入密码,即可完 ...
- Git版本控制与工作流详解
这篇文章是针对git版本控制和工作流的总结,如果有些朋友之前还没使用过git,对git的基本概念和命令不是很熟悉,可以从以下基本教程入手: 专为设计师而写的GitHub快速入门教程 git – 简明指 ...
随机推荐
- 如何解决Redis中的key过期问题
最近我们在Redis集群中发现了一个有趣的问题.在花费大量时间进行调试和测试后,通过更改key过期,我们可以将某些集群中的Redis内存使用量减少25%. Twitter内部运行着多个缓存服务.其中一 ...
- PWN! 第一次测试答案及讲解
题目链接:https://vjudge.net/contest/279567#overview 题目密码:190118 1.A+B:(考察点:EOF输入.加法运算) Topic: Calculate ...
- yk-随记
$config = Loader::loadConfig('smarty');
- Educational Codeforces Round 62 (Rated for Div. 2)C
题目链接 :C. Playlist #include<bits/stdc++.h> using namespace std; #define maxn 300005 #define LL ...
- mac下安装maven
在mac下 使用 brew安装,brew install maven 查看maven版本 mvn -version 打开Terminal,输入以下命令,设置Maven classpath 添加下列两行 ...
- 码云报错:fatal: remote origin already exists.解决方法
今天在提交Git的时候,遇到了几个问题,记录一下,方便以后查找O(∩_∩)O 第一个问题 git remote add origin************** fatal: remote origi ...
- ref、out参数
ref和out都是表示按引用传递.与指针类似,直接指向同一内存. 按值传递参数的方法永远不可能改变方法外的变量,需要改变方法外的变量就必须按引用传递参数. 传递参数的方法,在C语言里,用指针.在C#里 ...
- 转载:curl 模拟请求
一般情况下我们会在网页上请求后台接口,但是对于需要进行多次测试的人来说,每一次都要在网页上模拟请求,是存在很大局限性的.因此,我们需要学会模拟请求,以达到跟实际请求一样的效果. 1. curl的用法 ...
- Django web编程1 -- 创建项目和应用
python:3.7.2 Django:2.1.7 1.创建虚拟环境 虚拟环境是系统的一个位置,可以在其中安装包,并将其与其他python包隔离. 创建目录,命名为learning_log,并切换到这 ...
- Python解析xml文档实战案例
xml文档 <?xml version="1.0" ?> <!DOCTYPE PubmedArticleSet PUBLIC "-//NLM//DTD ...