Git分支原理

article/2025/9/11 18:25:59

Git分支原理


前言

最近工作由SVN换成Git了,不由地想探寻一下这两种版本控制工具的差别到底在哪里,于是有了这篇笔记。


Git保存方式

Git和SVN的差别主要就在于对待数据的方式。

SVN将存储的信息看作是一组基本文件和每个文件随时间逐步累积的差异,因此称为是基于差异的版本控制,存储的是文件的变化或者差异。

SVN

而Git把数据看作是对小型文件系统的一系列快照。

每当你提交更新或保存项目状态时,它基本上就会对当时的全部文件创建一个快照并保存这个快照的索引。为了效率,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。

Git

至于什么是文件快照呢?请接着看。


备份与快照

要理解备份与快照的区别,先需要理解计算机存储文件的方式。

平常在写代码对文件进行操作的时候,文件基本上都是以数据流的形式进行操作的,所以可能看上去文件都是连续存储的。

但实际上文件并不是连续存储的,文件内容数据会被分成一块一块分布存储到各个存储空间中。平常能够看到的文件实际上是由数据块描述结构组成的,每个数据块描述结构记录着数据块指针、数据块长度、数据块修改时间等待信息。而这个数据块描述结构中的数据块指针指向的就是这一小块文件内容数据在存储空间中存储的地址。

文件结构

在理解文件存储方式之后,备份和快照的区别也就很好理解了。

简而言之,备份在存储空间多了全部的数据块,在数据块描述结构中,数据块指针全部指向新的数据块。而快照在存储空间中只多了修改过的数据块,在数据块描述结构中,被修改过的数据块指针指向新的数据块,没被修改过的数据块指针不变。

快照和备份

这也就是为什么Git使用快照作为保存数据的方式如此高效的原因。

这里参考大佬的文章方便更进一步理解。(上面两张图是拿的大佬的)

当然快照虽然快,但是还是存在一些缺陷的。比如,当原文件和快照数据块指针同时指向的地址中的数据发生修改或是出现异常,那么此时的快照无法成功还原到文件最初始的样子。这里不做深入探讨了,主要是需要理解快照的本质。


Git分支

每次commit操作,Git都会将其存储成一个数据结构。该commit数据结构中包括作者姓名、邮箱、评论、父对象指针和内容快照指针。

父对象指针指向的是该commit的上一次commit,每次提交都会父对象指针自动指向上一次的commit。

内容快照指针指向的是一个树形数据结构,其中存储着所有的快照对象。

对象

所谓的Git分支,本质上就是一个指向commit对象的指针。

每进行一次commit操作,该分支的指针就会指向刚刚那个commit对象。

那么如何知道当前使用者在哪个分支上呢?

Git有一个HEAD的特殊指针,指向使用者当前处在的分支指针。

分支

看到这里,再结合Git的快照存储方式,是不是瞬间就理解了Git的分支到底是如何实现的!


合并与变基

没有使用过Git的小伙伴可能对变基(rebase)感到有些陌生。本质上来说,merge和rebase都是Git提供用于整合不同分支的修改的方法。

这里用官方的范例通俗易懂地解释一下:

假设在开发任务的过程中出现了两个不同的分支,并且它们各自提交了新的内容。

分支1

如果是merge操作,那么就会把两个分支最新的commit和分支分叉的commit进行三方合并,之后将合并的结果形成一个新的快照并commit。从图中来看,就是C2、C3和C4三方合并成了C5。

merge

如果是rebase操作,那么就会把某一分支的修改全部移动到另一分支上,也就是可以认为这个分支以另一分支的最新commit为基础(base),重新提交这个分支之前修改的内容。

rebase

这两种整合分支的方法最终的结果都没有任何的区别。从Git提交记录上来看,rebase操作会使得提交记录更加整洁,看得更加舒服,但同时也会面临更大的风险。

因为变基操作的实质是丢弃一些现有的提交,然后相应地新建一些内容一样但实际上不同的提交。

如果A已经将提交推送至某个仓库,而B也已经从该仓库拉取提交并进行了后续工作。此时,如果A使用了rebase并再次推送,那么B因此将不得不再次把他的修改内容与A的提交进行整合。如果接下来A还要拉取并整合B修改过的提交,事情就会变得一团糟。具体实例这里就不写了,感兴趣的小伙伴可以看官网手册。

总之,merge和rebase没有绝对的好与坏,各有利弊,开发者可以同时使用,也可以单方面使用一个,因各个项目实际情况而异。



补充:branch和tag的区别

在Git中,tag虽然在本质上和branch比较类似,但是在使用方式和使用含义上有较大的区别。

首先,tag在意义上作为发布的版本管理,通常来说,每发布一个版本就会打一个tag。如果我们想要在之前的版本上进行功能的开发,我们可以用tag快速跳转到旧版本,然后拉出新的branch进行开发。

其次,每个tag指向的是一个commit,是一个点,不可进行移动;相比branch来说,branch有一个HEAD指针指向branch上的commit。

总结来说,branch就是正常的开发流程,而tag就是某一commit的一个别名,以便于快速访问到这次commit的状态。



后记

很多内容都是参考的官网手册,这里只是用通俗的话进行了一个简单的总结和记录。

总而言之,学就完事了!


http://chatgpt.dhexx.cn/article/FtcUuh5h.shtml

相关文章

git fetch工作原理

背景 相信大家都知道git pull命令相当于git fetch加git merge。那么直接使用git pull和分开使用有什么区别呢&#xff1f;要解答这个问题首先要想了解git fetch的工作原理是什么样的。 git fetch的工作原理 先讲一下什么是远程跟踪分支。远程跟踪分支以 <remote>/<…

Git原理入门解析

前言: 自己第一次听到Git应该是一年前了,当时很懵,不知道它是干啥的,在网上搜索了很多文章,一直不是太明白;今天我来记录一下自己对Git的学习,如果对其他童鞋有所帮助,我荣幸之至! 一、Git 简析 Git是什么? Git是目前世界上最先进的分布式版本控制系统(没有之一)。…

Git原理详解与实用指南

文章目录 上手 1&#xff1a;新公司用 Git 管理代码&#xff0c;怎么快速上手&#xff1f;上手2&#xff1a;团队工作的基本工作模型进阶1&#xff1a;HEAD、master与branch进阶2&#xff1a;push的本质进阶3&#xff1a;merge&#xff1a;合并commits进阶4&#xff1a;Feature…

最详细的Git原理总结+如何解决冲突

原文路径是https://www.cnblogs.com/cb0327/p/5066685.html 目录 1.提交 代码到远程仓库2.将远程仓库代码更新到本地3.更新到本地仓库时&#xff0c; 出现冲突&#xff0c;解决冲突后记&#xff1a; 正文 本文背景&#xff0c;在实际项目中使用git已有一年&#xff0c;发现不少…

图解git工作原理

git 是一个能处理各种大小项目的开源版本控制系统&#xff0c;本文想通过两张图来简单说明git的工作原理 从上图可以知道git分四个部分来记录文件状态 working directory:工作区&#xff0c;开发者直接修改的本地代码树 staging area&#xff1a;暂存区&#xff0c;用于临时保存…

git原理解释

工作区域 Git本地有三个工作区域&#xff1a;工作目录&#xff08;Working Directory&#xff09;、暂存区&#xff08;Stage/Index&#xff09;、本地仓库&#xff08;Repository或Git Directory&#xff09;。如果在加上远程的Git仓库&#xff08;Remote Directory&#xff0…

git的基本原理

刚刚接触到git和github&#xff0c;整理一部分相关原理帮助自己理解git命令和本地-远程的操作。 我们将这部分学习分为三部分&#xff1a;&#xff08;1&#xff09;本地仓库相关操作&#xff08;2&#xff09;远程仓库相关操作&#xff08;3&#xff09;本地-远程交互操作 本地…

Git原理及操作简介

Git原理及操作简介 一、Git是什么 Git是目前世界上最先进的分布式版本控制系统 工作原理 / 流程: Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remote:远程仓库 二、SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中…

Git 工作原理

Git 工作原理 GIt简介Git 的基本原理Git的目录结构Git对象在之前我们提到过&#xff0c;Git是一套内容寻址&#xff08;content-addressable&#xff09;文件系统&#xff0c;那么Git是怎么进行寻址呢&#xff1f;Git对象的类型包括&#xff1a;BLOB、tree对象、commit对象。 对…

一文搞明白GIT——Git原理解析与常用命令

工作中经常用git&#xff0c;但是不少命令经常使用出现各种各样的问题&#xff0c;也不太理解其中的原理。今天专门总结一下git的原理&#xff0c;理解原理之后想实现什么样的功能直接找相应的命令即可。如有错误和不足&#xff0c;欢迎指正&#xff01; 一、 工作区 使用git…

Git 原理详解及实用指南

Git 原理详解及实用指南 什么是版本控制系统&#xff08;VCS&#xff09; 很多人认为 Git 难以理解的第一个门槛在于&#xff1a;所谓的「Git 是一个分布式版本控制系统」这句话的具体含义不够清楚。其实分布式版本控制系统&#xff08;Distributed Version Control System - …

图解git原理

用了这么久git&#xff0c;你有没有想过git的原理是什么&#xff1f;为什么git做回退这么快&#xff1f;创建、切换分支也这么快&#xff1f;git的工作区、暂存区、本地仓库、远程仓库都分别对应怎样的实体&#xff1f;打开一个git仓&#xff0c;看看目录下的.git文件夹&#x…

Git 的原理

文章目录 什么是 Git&#xff1f;版本库是由什么构成的版本库&#xff08;项目文件夹&#xff09;的构成版本库&#xff08;对象数据库&#xff09;的结构提交的组成SHA1 算法 总结 暂存区什么样的文件&#xff0c;不应该上传到版本库中&#xff1f;查看暂存区清空暂存区选择性…

Git学习之git原理

git对象 当我们使用git进行版本管理时&#xff0c;git会将我们的文件和目录结构转化成git方便操作的数据(git对象)&#xff0c;然后再对这些git对象进行管理&#xff0c;从而实现版本管理的目的&#xff0c;这些git对象存放在git的对象库中。 我们眼中的文件会被git转化成&qu…

Git 必知必会:原理剖析

作为程序员&#xff0c;最常用的版本管理工具便是 Git。但我相信大多数人和我一样&#xff0c;从没有认真了解过其具体实现的原理。但了解 Git 的原理&#xff0c;能有助于我们工作更好的使用 Git。下面&#xff0c;让我们一起来了解 Git 中的一些概念&#xff0c;以及实现。 一…

git 原理简介

文章目录 关于版本控制分为三种版本控制方案本地版本控制集中化的版本控制分布式版本控制 git基本底层原理git提交流程原理Git的引用(分支)git log原理总结参考链接 关于版本控制 什么是“版本控制”&#xff1f;我为什么要关心它呢&#xff1f; 版本控制是一种记录一个或若干文…

【转】以太坊钱包分析与介绍

林修平在亚太区以太坊社区培训与交流Meetup深圳站上跟我们分享了他对以太坊各种钱包模式的介绍&#xff0c;还分析了Parity多签名钱包安全事件的技术原因。昨日&#xff0c;EthFans得到作者授权&#xff0c;分享他的PPT。鉴于PPT较长&#xff0c;为保证阅读体验&#xff0c;编者…

币久网好像暂停ZEC交易了,各位的ZEC币暂时不要转入币久网了

今天突然发现币久网不能交易ZEC了&#xff0c;然后看到了官方公告&#xff0c;难不成ZEC也是P网的&#xff1f; 各位如果需要其他的钱包地址&#xff0c;比如Windows本地Zcash钱包地址&#xff0c;可以移步去我的其他博文看看 http://blog.csdn.net/squirrel1311/article/detai…