文档章节

Git版本控制 —— 原理概述

啊哼哼
 啊哼哼
发布于 2017/09/04 10:31
字数 2102
阅读 59
收藏 1
点赞 0
评论 0

本文已被《Git版本控制 —— 原理简述》替换:https://my.oschina.net/u/3452433/blog/1796162

Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。

 

前言

关于git是什么,git的工作原理,网上的资料已经非常多了。本人菜鸟固然不会比各路大神写的好。

所以本篇博文只按照我自己最肤浅的理解,使用白话进行阐述。主要目的以后自己能看懂,水平不高的读者也能看懂。

 

分布式管理

所谓分布式管理就是所有参与git项目的人,在自己的本地都会有一套完整的版本库。而对于传统的svn类型的集中式版本管理而言完整的版本库只有一套在服务器上,参与的人只不过拷贝了某一分支的代码而已。

分布式管理目前被某些“信徒”鼓吹的好的不得了,但我看来也是要具体情况具体分析的。

1、项目组人员水平参差不齐,不是所有人都能够摆弄清楚分支管理的。svn时期我自己就能把版本库分支维护的利利索索。而这种本地任意管理分支的情况让一些水平较差的程序员管理的非常混乱,甚至导致丢失未提交的代码。

2、团队协作比较密切的时候提交代码是非常频繁的,往往我刚写完一个实体,同事马上就要求我提交。git的提交显然是比较繁琐的。

总结来说git对于开源项目是非常合适的。代码贡献者能够轻松地获取整个版本库,然后在开发完整块代码后申请合并。而在一个人员能力不足,团队代码提交频繁的项目中也不一定是最好的选择。

 

代码提交

git的代码提交要比svn来的繁琐,而且理念与svn也是不一样的。

先说一下git的本地代码提交,由于git在本地会有一个完整的版本库,所以本地其实就相当于拥有了一个原来的svn系统。所以在本地就可以完成所有的代码提交工作,至于核心仓库问题一会儿再说。

git会将代码放在“工作区”“暂存区”“分支”三个部分。代码提交工作其实就是把代码从“工作区”转移到“暂存区”再转移到“分支”的过程。

 

分支

git的分支使用上基本与svn一致,我们可以从一个分支(最开始是主分支master)创建出新的分支。

但是从原理上git的分支切换要比svn快速方便的多。

先说一下svn的分支使用。我们首先需要在svn仓库中创建一个分支(这个步骤是非常快的),然后我们需要把新建的分支检出到本地(这步就非常慢了)。由于检出需要使用互联网将分支下载下来,会非常的耽误事。曾经做过一个银行项目,公司要求无论改什么都要创建分支,项目挺大检出一次基本10分钟左右。

现在再来说一下git。在本地仓库中创建一个分支,然后直接切换到分支进行开发,这两个步骤都是秒完成。

下面介绍一下git分支原理来说明一下为什么这么快。

分支是指针

git的提交行为就是将当前文件保存,然后在创建一个最新的文件,就完成了一次提交。而分支其实就是一个指向某次提交的指针,提交一次,指针向后移动一次。

如下图所示,第一次提交的三个文件(文件1、文件2、文件3),分支指针指向第一次提交。第二次提交了一个文件(文件2),在提交中创建了新的文件二,指针移动指向第二次提交,文件1和文件3由于没有新的提交还是使用第一次提交的。以此类推第三次提交了两个文件(文件1、文件2),分支指针指向第三次提交。

 

分支之间的关系

分支就是不同的指针,分别指向了不同的提交。

如下图所示,一开始只有master分支。在提交2的时候创建了new分支。然后就按照各自的提交路线走下去了。

分支的切换

分支切换其实就是一个区分谁是当前分支的问题。这里又用到了一个指针HEAD,HEAD指向了当前分支,切换分支实际上就是改变了HEAD的指向。

 

分支的合并

当我们开始合并两个分支时,git会向前查找每次提交直至找到共同的起点。然后会比较两个分支修改了那些文件,最后将修改的文件进行合并。这里需要注意如果修改的是,不同文件则那个分支做出了修改就用那个分支的版本,如果修改了相同的文件我们就要手动处理冲突(之后再说)。

 

变基

当年被这个词吓得不轻。太高大上了“变鸡”听着就牛逼。其实说起来也没啥,挺简单一个概念。

变基操作时先找到两个分支共同的起点,然后把当前分支在这个起点之后所有的提交都做成补丁。最后将这些补丁在目标分支上重新执行一遍。

用图示说明一下,现在我们要将new分支采用变基的方式合并到master分支。他们共同的祖先是提交2,new分支变基时将提交2之后的提交,也就是提交4和提交5生成补丁。最后将这两个补丁在master分支进行执行。

 

冲突处理

当不同分支修改了同一个文件时,就会产生冲突。很少的情况下冲突是可以自动解决的,比如都在文件结尾处新增了一部分内容。大部分的情况需要我们手动处理冲突。

手动合并时git会提示那些文件有冲突,并比较出冲突的代码进行提示。我们手动决定保留哪些代码后再进行一次提交从而解决冲突。

如下图文件1要从new分支合并到master分支,出现冲突手动解决并提交。

最后总结一下,看没看见git所有的分支操作都是创建文件和移动指针,这也就是快的原因。

 

远程分支

为了能够进行团队合作,开发人员会通过远程分支管理和交换代码。远程跟踪分支是远程分支状态的引用。 它们是你不能移动的本地引用,当你做任何网络通信操作时,它们会自动移动。 远程跟踪分支像是你上次连接到远程仓库时,那些分支所处状态的书签。它们以 (remote)/(branch) 形式命名。 例如,如果你想要看你最后一次与远程仓库 origin 通信时master 分支的状态,你可以查看 origin/master 分支。 

 

跟踪分支

从一个远程跟踪分支检出一个本地分支会自动创建一个叫做 “跟踪分支”(有时候也叫做 “上游分支”)。 跟踪分支是与远程分支有直接关系的本地分支。 如果在一个跟踪分支上输入 git pull,Git 能自动地识别去哪个服务器上抓取、合并到哪个分支。

当克隆一个仓库时,它通常会自动地创建一个跟踪 origin/master 的 master 分支。 然而,如果你愿意的话可以设置其他的跟踪分支 - 其他远程仓库上的跟踪分支,或者不跟踪 master 分支。

 

标签

标签就是一个指针,指向了某一次提交,并且标签是不能移动的。

 

 

© 著作权归作者所有

共有 人打赏支持
啊哼哼
粉丝 7
博文 54
码字总数 75016
作品 0
哈尔滨
Git使用之.gitignore感想

最近做了个项目,使用Git作为版本控制工具,但是呢,也仅仅是为了保存自己的工作记录,以免突发情况,多日工作付之东流,并没有使用到git的更多功能——协同合作。多人协同合作必然产生很多关...

think道 ⋅ 2017/11/17 ⋅ 0

git文章列表

关于gitlab默认clone协议 Git实现从本地添加项目到远程仓库 翻翻git之---一个简单的标签控件 LabelView (随手发了两张小宝宝的玩耍照) Git 项目推荐 | Java 版微信普通号机器人 翻翻git之---...

d_watson ⋅ 2016/04/20 ⋅ 0

java mvc框架--mint-mvc

mint mvc是一个纯粹的mvc框架,是在servlet之上做了浅层包装而做出来的,它做的事情很简单:接收请求->封装参数->将请求交给开发者这编写的逻辑处理->返回处理结果。 mint-mvc有如下特点: ...

水牛叔叔 ⋅ 2014/10/22 ⋅ 0

博客导航——一站式搜索(所有博客的汇总帖)

博客导航——一站式搜索 以后博客肯定会越来越多的,所以这做一个整理,方便各位朋友能快速的锁定自己想要的资源 课程 巧用第三方快速开发Android App 热门第三方SDK及框架 Android Studio G...

qq_26787115 ⋅ 2016/01/08 ⋅ 0

Git常用命令查询 ;

在介绍安装和简单使用前,先看一下百度百科中的简介吧: ———————————————————————————————————————— Git --- The stupid content tracker, 傻瓜内容...

Koon.LY ⋅ 2012/06/24 ⋅ 0

sourceTree版本控制器

大神略过!github是一款广受好评的版本控制软件,我们用github来操作git语句,但是git中很多功能我们还是体会不到,现在,我来介绍一款功能非常强大的软件给大家,sourceTree 是一款非常实用...

哥特复心 ⋅ 2015/01/20 ⋅ 1

笔记《版本控制之道--使用Git》

笔记《版本控制之道--使用Git》 我认为每个学过Git的人都应该做过类似这种笔记,因为Git命令太多看着看着就把前边看过的忘了,之前我也看过Git,但是一直没用,现在一看几乎没有印象了,所以...

gongweixin ⋅ 2012/12/21 ⋅ 2

Git版本控制系统简介(itercast学习笔记)

Git是一个分布式版本控制系统 Git最初开发是为了取代BitKeeper,由Linux创始人Linus Torvalds开发,作为Linux内核代码管理系统使用 Git设计时考虑了很多方面,除了分布式版本控制系统的优点外...

VincentJiang ⋅ 2013/08/12 ⋅ 0

clearcase、Git之我见

软件配置管理一直以来是软件工程的基础。而配置管理本身对于开发者及软件工程生命周期管理来说,不但具备其基本的 版本控制功能,还需要具备工作空间管理、构建管理、流程管理等。其中各家的...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

非程序员如何使用 Git——版本控制你的生活

在协同工作和版本控制方面,Git 绝对是一个优秀的工具,但其优点并不被大众所熟知。在过去的几年中,由于大众对于文字处理,电子表格(译者注:这里暗指Word和Excel,下同。)以及其他常用的...

oschina ⋅ 2014/05/19 ⋅ 36

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 19分钟前 ⋅ 0

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 38分钟前 ⋅ 0

零基础学习大数据人工智能,学习路线篇!系统规划大数据之路?

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经...

董黎明 ⋅ 47分钟前 ⋅ 0

openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss ⋅ 56分钟前 ⋅ 0

梳理

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 它是JS的状态容器,是一种解决问题的方式,所以即可以用于 react 也可以用于 vue。 需要理解其思想及实现方式。 应用中所有的 stat...

分秒 ⋅ 今天 ⋅ 0

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 今天 ⋅ 0

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 今天 ⋅ 0

到底会改名吗?微软GVFS 改名之争

微软去年透露了 Git Virtual File System(GVFS)项目,GVFS 是 Git 版本控制系统的一个开源插件,允许 Git 处理 TB 规模的代码库,比如 270 GB 的 Windows 代码库。该项目公布之初就引发了争...

linux-tao ⋅ 今天 ⋅ 0

笔试题之Java基础部分【简】【二】

1.静态变量和实例变量的区别 在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变...

anlve ⋅ 今天 ⋅ 0

Lombok简单介绍及使用

官网 通过简单注解来精简代码达到消除冗长代码的目的 优点 提高编程效率 使代码更简洁 消除冗长代码 避免修改字段名字时忘记修改方法名 4.idea中安装lombnok pom.xml引入 <dependency> <grou...

to_ln ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部