文档章节

Git版本控制 —— 原理概述

哼_哼
 哼_哼
发布于 2017/09/04 10:31
字数 2102
阅读 76
收藏 1

本文已被《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 分支。

 

标签

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

 

 

© 著作权归作者所有

共有 人打赏支持
哼_哼
粉丝 8
博文 57
码字总数 77252
作品 0
哈尔滨
Git使用之.gitignore感想

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

think道
2017/11/17
0
0
git文章列表

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

d_watson
2016/04/20
26
0
java mvc框架--mint-mvc

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

水牛叔叔
2014/10/22
2.2K
0
博客导航——一站式搜索(所有博客的汇总帖)

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

qq_26787115
2016/01/08
0
0
sourceTree版本控制器

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

哥特复心
2015/01/20
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

以太坊总结

一、概念说明 1.以太坊(Ethereum blockchain)由V神(Vitalik Buterin)发明,是一个交易记录的永久数据库,它以一个“无信任”的交易系统来运行,不需要任何第三方信任机构即可进行点对点的...

盼望明天
28分钟前
1
0
Java并发工具类——AtomicInteger

基本类型int的递增等操作并不是线程安全的,加上synchronized又会影响性能,因此在并发情况下我们应该使用AtomicInteger,下面通过一个例子验证一哈。 public class TestAtomicInteger {...

东都大狼狗
30分钟前
1
0
基于CentOS7.2系统对RabbitMQ单机版安装过程

准备虚拟机系统 我的系统如下 系统版本7.2 安装perl yum install perl 安装wget工具 yum install -y wget 安装相关依赖工具 yum install ncurses ncurses-base ncurses-devel ncurses-libs ...

凌晨一点
34分钟前
1
0
Maven常用命令

Maven常用命令 说到命令,则不得不提一下环境变量,在之前的博文中简单提了一下环境变量的配置,这里具体说一下。说完环境变量的配置,然后就是Maven的常用命令,这里说的是常用的几个命令,...

星汉
50分钟前
0
0
Flink操作mysql kafka和hbase

主程序 package com.streaming.flink;import java.util.Properties;import org.apache.flink.api.common.functions.FlatMapFunction;import org.apache.flink.api.common.functi......

守望者之父
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部