Linux进阶之Git分布式版本控制系统篇
一、Git介绍
Git(读音为/gɪt/。)是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,所以,工作的时候就不需要联网了,因为版本库都是在自己的电脑 上。现在每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
主要有如下特点:
1. 版本控制(可以根据需要随意切换到任何版本)
2. 分布式
3. 工作过程是将服务器上的代码下载到本地,本地开发完成后,在提交到服务器端
git相比于svn功能更加的强大,命令也很多。本篇博客将详细介绍一些常用命令的使用操作。
二、Git和SVN的对比
1. git是分布式的,svn是集中式的。(最核心)
2. git是每个历史版本都存储完整的文件,便于恢复,svn是存储差异文件,历史版本不可恢复。(核心)
3. git可离线完成大部分操作,svn则不能。
4. git有着更优雅的分支和合并实现。
5. git有着更强的撤销修改和修改历史版本的能力
6. git速度更快,效率更高。
基于以上区别,git有了很明显的优势,特别在于它具有的本地仓库。
三、Git几个概念
1、工作目录
工作目录是对项目的某个版本独立提取出来的内容。这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。
2、暂存区域
是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。有时候也被称作`‘索引’',不过一般说法还是叫暂存区域。
3、Git 仓库目录
是Git 用来保存项目的元数据和对象数据库的地方。这是 Git 中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。
四、Git工作流程
基本的 Git 工作流程如下:
在工作目录中修改文件 > 暂存文件,将文件的快照放入暂存区域 > 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。
如果 Git 目录中保存着的特定版本文件,就属于已提交状态。如果作了修改并已放入暂存区域,就属于已暂存状态。如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。
五、Git的安装
第一种安装方式:yum进行安装
[root@ren ~]# yum install git -y
第二种安装方式:编译安装
第一步:上传安装包并解压
[root@ren ~]# rz
[root@ren ~]# ls | grep git
git-v2.7.4.zip
[root@ren ~]# unzip git-v2.7.4.zip
第二步:安装依赖
[root@ren git-2.7.4]# yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker -y
第三步:进入解压下目录下并执行编译
[root@ren git-2.7.4]# make prefix=/usr/local/git all
[root@ren git-2.7.4]# make prefix=/usr/local/git install
第四步:导入二进制程序
[root@ren git-2.7.4]# rm -rf /usr/bin/git
[root@ren git-2.7.4]# ln -s /usr/local/git/bin/git /usr/bin/git
[root@ren git-2.7.4]# git --version
git version 2.7.4
六、git常用选项
add 把工作目录中的内容添加到暂存区域
branch 查看和创建分支
checkout 切换分支和撤销(暂存区域的版本回滚)
clone 克隆远程仓库
commit 把暂存区域的内容提交到仓库
init 初始化工作目录(初始化完成会生成一个隐藏目录.git)
log 查看版本提交信息(日志)
merge 合并分支内容
pull 拉取远程仓库
push 把本地内容推送到远程仓库
reset 撤销操作(重置)(仓库的版本回滚)
status 查看当前文件所处的状态
reflog 查看所有版本commitID
七、Git使用演示
第一步:创建和初始化git工作目录
[root@ren5 ~]# mkdir /ren #创建工作目录
[root@ren5 ~]# cd /ren
[root@ren5 ren]# git init #初始化工作目录
初始化空的 Git 版本库于 /ren/.git/
[root@ren5 ren]# ls -a
. .. .git
第二步:创建文件进行测试
[root@ren5 ren]# echo "123123123" > test #创建测试文本
[root@ren5 ren]# ls
test
[root@ren5 ren]# git add . #把工作目录下的所有文件提交到暂存区域
[root@ren5 ren]# git commit -m "version1" #把暂存区域的内容提交到仓库并标识为version1版本(-m为message)
[root@ren5 ren]# git config --global user.email "you@example.com" #根据提示进行认证
[root@ren5 ren]# git config --global user.name "Your Name"
[root@ren5 ren]# git commit -m "version1" #再次进行提交
[master(根提交) 07cc74c] version1
1 file changed, 1 insertion(+)
create mode 100644 test
第三步:查看版本信息
[root@ren5 ren]# git log
commit 07cc74cca27f37439bdbd9551559156a5135ebb6
Author: Your Name <you@example.com>
Date: Fri Aug 16 18:54:39 2019 +0800
version1
第四步:再次提交不同内容
[root@ren5 ren]# echo "456456" >> test
[root@ren5 ren]# git add .
[root@ren5 ren]# git commit -m "version2"
[master 5290ec9] version2
1 file changed, 1 insertion(+)
[root@ren5 ren]# echo "789789" >> test
[root@ren5 ren]# git add .
[root@ren5 ren]# git commit -m "version3"
[master 5651405] version3
1 file changed, 1 insertion(+)
[root@ren5 ren]# git log
commit 5651405f5af1a8663e90cb09d342393e8b3d1cda
Author: Your Name <you@example.com>
Date: Fri Aug 16 19:04:35 2019 +0800
version3
commit 5290ec95b3f66981c0e9944db246caa2e79490ef
Author: Your Name <you@example.com>
Date: Fri Aug 16 19:04:05 2019 +0800
version2
commit 07cc74cca27f37439bdbd9551559156a5135ebb6
Author: Your Name <you@example.com>
Date: Fri Aug 16 18:54:39 2019 +0800
version1
第五步:切换至test及version1版本
[root@ren5 ren]# cat test #现在位于version3版本
123123123
456456
789789
[root@ren5 ren]# git reset --hard 07cc74cca27f37439 #切换至版本1,hard后面的是版本1的commit的值(可以复制一部分)
HEAD 现在位于 07cc74c version1
[root@ren5 ren]# cat test #已切换至版本1
123123123
[root@ren5 ren]# git log
commit 07cc74cca27f37439bdbd9551559156a5135ebb6
Author: Your Name <you@example.com>
Date: Fri Aug 16 18:54:39 2019 +0800
version1
第六步:恢复至版本2(version2)
[root@ren5 ren]# git reflog #首先使用git reflog可以查看commit值(reflog回流)
07cc74c HEAD@{0}: reset: moving to 07cc74cca27f37439
5651405 HEAD@{1}: commit: version3
5290ec9 HEAD@{2}: commit: version2
07cc74c HEAD@{3}: commit (initial): version1
[root@ren5 ren]# git reset --hard 5290ec9 #恢复的时候指定conmit值
HEAD 现在位于 5290ec9 version2
[root@ren5 ren]# git log #查看发现已经恢复到v2版本
commit 5290ec95b3f66981c0e9944db246caa2e79490ef
Author: Your Name <you@example.com>
Date: Fri Aug 16 19:04:05 2019 +0800
version2
commit 07cc74cca27f37439bdbd9551559156a5135ebb6
Author: Your Name <you@example.com>
Date: Fri Aug 16 18:54:39 2019 +0800
version1
[root@ren5 ren]# cat test
123123123
456456
八、不同阶段的回滚(撤销)
1、工作目录回滚
[root@ren5 ren]# cat test
123123123
[root@ren5 ren]# git log #目前处于版本1
commit 07cc74cca27f37439bdbd9551559156a5135ebb6
Author: Your Name <you@example.com>
Date: Fri Aug 16 18:54:39 2019 +0800
version1
[root@ren5 ren]# echo "你好,GIT" >> test #写入内容
[root@ren5 ren]# git status #查看文件状态
# 位于分支 master
# 尚未暂存以备提交的变更:
# (使用 "git add <file>..." 更新要提交的内容)
# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
# 修改: test
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@ren5 ren]# git checkout -- test #进行工作目录状态撤销
[root@ren5 ren]# cat test #再次查看文本发现写入内容已经没有
123123123
2、暂存区域回滚
[root@ren5 ren]# echo "你好,GIT" >> test #写入内容
[root@ren5 ren]# git add . #提交至暂存区域
[root@ren5 ren]# git status #查看文件状态
# 位于分支 master
# 要提交的变更:
# (使用 "git reset HEAD <file>..." 撤出暂存区)
# 修改: test
[root@ren5 ren]# git reset HEAD test #不提交至仓库
重置后撤出暂存区的变更:
M test
[root@ren5 ren]# git status #文件被退回到工作目录中
# 位于分支 master
# 尚未暂存以备提交的变更:
# (使用 "git add <file>..." 更新要提交的内容)
# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
# 修改: test
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@ren5 ren]# git checkout -- test #从工作目录中撤销
[root@ren5 ren]# cat test
123123123
3、版本管理
我们知道回退版本需要用到commit值但是现在通过git log已经看不到v4的commit值了,现在怎么办呐?
可以通过git reflog查看所有的历史操作找到v4前面的值即可
九、Git分支
几乎所有的版本控制系统都以某种形式支持分支。使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。
Git 处理分支的方式可谓是难以置信的轻量,创建新分支这一操作几乎能在瞬间完成,并且在不同分支之间的切换操作也是一样便捷。与许多其它版本控制系统不同,Git 鼓励在工作流程中频繁地使用分支与合并,哪怕一天之内进行许多次。
第一步:查看分支
[root@ren5 ren]# git branch
* master # *表示当前所处的分支位置(在提交过文件之后才会有分支)
第二步:创建新分支
[root@ren5 ren]# git branch ren
[root@ren5 ren]# git branch
* master
ren
第三步:切换分支
[root@ren5 ren]# git checkout ren
切换到分支 'ren'
[root@ren5 ren]# git branch
master
* ren
第四步:写入内容至文件并提交(必须提交)
[root@ren5 ren]# echo "hello,hello" >> test
[root@ren5 ren]# git add .
[root@ren5 ren]# git commit -m "version4"
[ren ec98de6] version4
1 file changed, 1 insertion(+)
[root@ren5 ren]# cat test
123123123
456456
789789
hello,hello
第五步:切换至主分支
[root@ren5 ren]# git checkout master
切换到分支 'master'
[root@ren5 ren]# git branch
* master
ren
[root@ren5 ren]# cat test #查看文件内容,并没有子分支刚才提交的内容
123123123
[root@ren5 ren]# git log
commit 07cc74cca27f37439bdbd9551559156a5135ebb6
Author: Your Name <you@example.com>
Date: Fri Aug 16 18:54:39 2019 +0800
version1
第六步:合并分支(合并的是各个分支的内容)
[root@ren5 ren]# git merge ren (默认会将merge后跟的分支合并到当前所处的分支下)
更新 07cc74c..ec98de6
Fast-forward
test | 3 +++
1 file changed, 3 insertions(+)
[root@ren5 ren]# cat test #合并之后发现现在主分支也可以看到刚才子分支添加的内容了
123123123
456456
789789
hello,hello
[root@ren5 ren]# git log
commit ec98de6da776dfedfd7c2baf05388bfe26906c2d
Author: Your Name <you@example.com>
Date: Fri Aug 16 20:13:43 2019 +0800
version4
Linux进阶之Git分布式版本控制系统篇的更多相关文章
- g4e基础篇#2 Git分布式版本控制系统的优势
g4e 是 Git for Enterprise Developer的简写,这个系列文章会统一使用g4e作为标识,便于大家查看和搜索. 章节目录 前言 1. 基础篇: 为什么要使用版本控制系统 Git ...
- 《Linux就该这么学》自学笔记_ch21_使用Git分布式版本控制系统
<Linux就该这么学>自学笔记_ch21_使用Git分布式版本控制系统 文章主要内容: 分布式版本控制系统 使用Git服务程序 提交数据 移除数据 移动数据 历史记录 还原数据 管理标签 ...
- 开发效率优化之Git分布式版本控制系统(一)
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680本篇文章将先从Git分布式版本控制系统来阐述开发效率优化 一,企业 ...
- GIT分布式版本控制系统
Git诞生历史 我想大家还记得Linus torvalds在1991年时发布了Linux操作系统吧,从那以后Linux系统变不断发展壮大,因为Linux系统开源的特性,所以一直接受着来自全球Linux ...
- Git ——分布式版本控制系统
Git ——分布式版本控制系统 本人git主页地址:https://github.com/lendoon/test.git git使用心得:初次接触git在课堂上,老师给我们提供了一个代码托管的场所, ...
- 手把手教你玩转Git分布式版本控制系统! (转载)
目录 Git诞生历史 Git环境准备 Git安装部署 Git常用命令 Git基本操作 Git管理分支结构 Git管理标签 GitLab安装部署 GitHub托管服务 Git客户端工具 Git诞生历史 ...
- 手把手教你玩转Git分布式版本控制系统!
目录 Git诞生历史 Git环境准备 Git安装部署 Git常用命令 Git基本操作 Git管理分支结构 Git管理标签 GitLab安装部署 GitHub托管服务 Git客户端工具 1 Git诞生历 ...
- GIT 分布式版本控制系统的简单使用介绍
GIT 分布式版本控制系统的简单使用介绍 1.GIT的概念Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git 与 SVN 区别:1. GIT不仅仅是个版本控制系统,它 ...
- Git分布式版本控制系统(下)
Git分布式版本控制系统(下) 链接:https://pan.baidu.com/s/1CgaEv12cwfbs5RxcNpxdAg 提取码:fytm 复制这段内容后打开百度网盘手机App,操作更方便 ...
随机推荐
- html页面自定义文字水印效果案例
在系统开发过程中,一些数据或页面比较敏感的地方,客户会要求实现水印效果,防止内部人员截图或拍照泄露信息. 自定义文字水印顾名思义就是利用js在完成页面渲染的同时,往页面的最底层动态生成多个带水印信息的 ...
- Spring(一)简介和配置
知识补充: 那么什么是xmlns呢?xmlns其实是XML Namespace的缩写,可译为"XML命名空间",但个人觉得,翻译后的名字反而不好理解,所以我们就叫它为XML Nam ...
- 华为分析+App Linking:一站式解决拉新、留存、促活难
移动互联网时代,用户注意力稀缺,"如何让用户一键直达APP特定页面"越来越受到产品和运营同学的关注. 比如在各个渠道投放了APP安装广告,希望新用户下载APP首次打开时直接进入活动 ...
- 安装电脑思考到了Java设计模式:建造者模式
目录 定义 意图 主要解决问题 何时使用 优缺点 结构 组装电脑的例子 定义 建造者模式是对象的创建型模式,可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表 ...
- 《剑指offer》刷题笔记
简介 此笔记为我在 leetcode 上的<剑指offer>专题刷题时的笔记整理. 在刷题时我尝试了 leetcode 上热门题解中的多种方法,这些不同方法的实现都列在了笔记中. leet ...
- java中的|=符号
今天看mybaits源码的时候,发现了这个特殊的符号用法,|=. for (ParameterMapping pm : boundSql.getParameterMappings()) { Strin ...
- Oralce注入 bypass waf出数据
发存货: 探测banner 版本号: ' and (SELECT banner FROM v$version where rownum=1) like 'O%' and '1'like'1 rownu ...
- C++ 2.0新特性
C++ standard之演化 C++ 98(1.0) C++ 03(TR1, technical Report 1) // 一个实验性的版本 C++ 11(2.0) C++ 14 此次记录涵盖了C+ ...
- [CTF]维吉尼亚密码(维基利亚密码)
[CTF]维吉尼亚密码(维基利亚密码) ----------------------百度百科 https://baike.baidu.com/item/维吉尼亚密码/4905472?fr=aladdi ...
- 浅谈持续集成(CI)、持续交付(CD)、持续部署(CD)
CI/CD是实现敏捷和Devops理念的一种方法,具体而言,CI/CD 可让持续自动化和持续监控贯穿于应用的 整个生命周期(从集成和测试阶段,到交付和部署).这些关联的事务通常被统称为"CI ...