Git背后的设计理念

2023-11-03

首先要清楚Git版本管理中提交的概念。通过按行对比(line diff)将有差异的部分作为增量补丁,使用git add添加到暂存区里的每一个文件都会由按行对比得到他们的增量补丁,而使用git commit将暂存区里的所有文件的增量补丁合并起来存入仓库,这就是一次提交。

通常在提交时,会生成一个SHA-1 Hash值作为commitID。每个commitID中有40个十六进制数字。

就是该次提交在Git仓库中存储的内容和头信息的校验和。Git使用SHA-1并非为了保证安全性,而是为了保证数据的完整性,即可以保证很多年后重新检验某次提交时,一定是它多年前的状态,完全一模一样、完全值得信任。

按时间线依次排列的一组提交记录形成一个分支,比如默认分支master,也可以根据某种需要创建分支。

tag是某个提交的标签,比如发布1.0版本时的那次提交被专门打了个标签v1.0。标签就是别名,便于记忆和使用。

我们简要总结一下以上几个关键概念:

  •  按行对比是制作增量补丁的方法,即通过按行对比将有差异的部分制作成增量补丁。
  • 提交是存储到仓库里的一个版本,是整个项目的一个或多个文件的增量补丁合并起来形成的项目的增量补丁,是一次提交记录。每次提交都生成一个唯一的commitID。
  • 分支是按时间线依次排列的一组提交记录,理论上可以通过当前分支上最初的提交依次打补丁直到HEAD得到当前工作区里的源代码。
  • 标签是某次提交的commitID的别名。

合并操作常指将远程分支合并到本地master分支,或者某个本地分支合并到master分支。以下图为例,项目在A版本处开始分叉,形成了两个分支,分别提交了B、D、F和C、E、G,这时希望将这两个分支合并,只要将F与A有差异的部分放入工作区,此时C、E、G已经在工作区了,如果有冲突,解决冲突后就可以提交一个版本H,即完成了两个分支的合并。

简要总结一下,合并操作可以用一个公式来表示:H = A + (F - A) + (G - A),即F版本与A版本的差异,以及G版本与A版本的差异,与A合并起来,如果有冲突,解决冲突,形成一个新的版本H。

具体技术实现上,因为每一个版本都有上一个版本的“增量补丁”,只要将合并的分支里的B、D、F的增量补丁,合并到当前工作区G版本里,解决冲突后即可提交为H版本。


以上内容为中科大软件学院《高级软件工程》课后总结,感谢孟宁老师的倾心教授,老师讲的太好啦(^_^)

参考资料:《代码中的软件工程》    孟宁  编著

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Git背后的设计理念 的相关文章

  • 在centos上设置jenkins:ssh密钥和git的问题

    经历了很多问题 但似乎没有什么能解决我的问题 或者更准确地说 我不确定我是否正确地完成了整个事情 所以这里是 已安装centos 6 3操作系统 然后我按照以下指南安装詹金斯 https wiki jenkins ci org displa
  • 无法使用 git 推送或获取 [重复]

    这个问题在这里已经有答案了 我可以拉 但无法使用 git 版本 1 9 5 推送或获取 它突然开始给我以下错误 关于如何修复它有什么想法吗 git fetch fatal unable to access https email prote
  • 如何在 GitHub Action 中使用不同版本的 PHP 进行测试

    我有一些 PHP 代码 其中包含使用以下命令运行的测试PHPUnit并想对其进行测试GitHub Actions 我在他们的文档中找不到测试 PHP 包的方法 我想使用不同版本的 PHP 进行测试 但他们只有最新的版本7 3安装 您可以添加
  • 如何禁用 GitHub 中的拉取请求?

    我试图了解如何禁用 github 中的 拉取请求 问题一 我们正在尝试使用变基工作流程 这意味着如果不是快速推进 那么使用拉取请求可能会有害 一种解决方案 为我想要禁用拉取请求的分支设置分支权限 或者将我添加为任何进入 master 的内容
  • 如何关闭分支而不将其从 git 的历史记录中删除?

    我想提交并关闭其分支 而不将其从历史中删除 有了水银我会commit close branch then update转到上一个 然后继续工作 有了 git 我很困惑 没有与 Git 中关闭分支完全相同的方法 因为 Git 分支比 Merc
  • 自动同步两个 git 存储库

    是否可以保持同步两个 Github 存储库 远程 的特定文件夹 有两个 github 存储库 repoA 和 repoB 这两个存储库都有名为 ABC 的文件夹以及其他独特的文件夹 如果repoA的文件夹ABC中的任何文件有更新 我想自动更
  • 为什么“git描述-dirty”在描述干净结帐时添加“-dirty”后缀?

    我刚刚发现 dirty选项git describe看起来它应该做一些非常有用的事情 即在输出中附加一个后缀git describe当工作树脏时 但是在我的一些存储库上似乎并非如此 git status On branch 8 30 noth
  • 清理远程 Git 分支

    我已经将 SVN 存储库移至 Git 可能由于多次克隆 我现在只剩下一堆看起来像这样的分支 BranchA origin BranchA remotes BranchA remotes origin BranchA remotes orig
  • 为什么 git-svn 应该积极搜索旧历史?

    当我运行 git svn clone s 时发生了一些奇怪的事情 尽管以下信息告诉我们不要惊慌 但我想知道为什么会出现这种 svn 错误 为什么这个路径不存在 是被别人删除了吗 如果是 为什么 git svn 应该积极搜索旧历史记录 Ini
  • Jenkins GIT 包含从未构建过的区域

    我正在尝试使用包含区域在 Jenkins 中构建我的工作 但每当选中此选项时 民意调查结果总是说未检测到任何更改 我尝试了许多不同的路径 以及使用工作区进行 不进行强制轮询 结果是轮询从未检测到任何更改 但一旦我删除这些选项 它们就会在下一
  • 更改先前提交的作者姓名:快进推送被拒绝

    我最近在 GitHub 上打开了一个存储库 我是 Git 新手 与新人一样 我使用默认名称和电子邮件进行提交 按照最佳菜鸟传统 我发现五次提交为时已晚 现在乐趣开始了 因为我开始搜索有关如何更改这些提交的作者和提交者名称的信息 美好的 我基
  • Spring Cloud Config - 不允许使用 git-upload-pack

    我有一个在 docker 环境中运行的 spring boot 应用程序 它连接到 Git 存储库以获取应用程序的配置 我的问题是 当尝试获取 properties 文件时 应用程序有时会出错 这很奇怪 因为如果我更改用户和密码 同一个应用
  • TortoiseGit - 更改默认合并消息

    系统描述 Windows 7的 git版本2 10 1 windows 1 乌龟Git 2 3 0 0 I want 合并提交消息在不同的情况下有所不同fully自动方式 no manual amend Summary 在windows上
  • 使用 TFS REST API 获取 Git 提交的最新关联工作项

    我正在尝试获取关联的工作项使用 TFS REST API 进行 GIT 提交 https www visualstudio com en us docs integrate api git commits 我的请求 URL 如下所示 htt
  • GIT 和 Ruby:如何从 ruby​​ 脚本内部取消设置 GIT_DIR 变量?

    我编写了一个非常简单的 部署 脚本作为我的post update挂钩到我的裸 git 存储库中 变量如下 live domain mydomain com staging domain stage mydomain com git repo
  • GitPython 检查 git pull 是否更改了本地文件

    使用 GitPython 我只想在拉取后本地文件发生更改时才调用函数 例如 如果我在一台单独的计算机上进行推送 然后拉第一台计算机 它按预期工作 但不提供任何输出 理想的输出是已更改的文件列表 或者只是告诉我拉动是否有错误 没有拉动 因为分
  • 如何在同一存储库中的 github 操作之间共享代码?

    假设我想要两个工作流程build yml and release yml在我的仓库中 第一个应该构建项目 假设使用 CMake 第二个应该构建项目并使用构建的二进制文件创建 GitHub 版本 项目构建代码在两个文件之间重复 如何在它们之间
  • Android repo 脚本创建的 .repo/projects/ 中的裸 git 存储库的用途是什么?

    The 安卓源码 http android git kernel org 由以下人员管理repo http source android com source version control html 使用 repo 同步时 一个名为 re
  • 如果您使用 CocoaPods,您的 .gitignore 中会包含什么内容?

    我从事 iOS 开发已经几个月了 刚刚了解到有前途的可可豆荚 http cocoapods org 用于依赖管理的库 我在个人项目上尝试过 添加了依赖项Kiwi https github com allending Kiwi到我的 Podf
  • Git 删除其他人从远程所做的最后提交

    所以 我的情况是 错误地 我已经授予某人对我的分支的承诺 现在 在我的本地 我已经进行了提交 当我尝试将其推送到远程时 它显示远程在前面 因为对方已经将他的代码推送到了这个分支并进行了多次提交 现在 我可以从远程删除这些提交而不将拉取到本地

随机推荐

  • 卷积神经网络CNN原理+代码(pytorch实现MNIST集手写数字分类任务)

    目录 卷积神经网络 前言 卷积运算 卷积运算中几个常用的参数 1 padding 2 stride 3 Max Pooling Layer 实战演练 设计一个卷积神经网络 GPU的使用 整体代码 运行结果 卷积神经网络 前言 若将图像数据输
  • git clone no matching host key type found. Their offer: ssh-rsa,ssh-dss... 报错

    Unable to negotiate with 主机地址 port 端口号 no matching host key type found Their offer ssh rsa ssh dss fatal Could not read
  • 红黑树与平衡二叉树区别?

    如果说平衡二叉树是一个类的话 那么红黑树就是该类的一个实例 算法的书我丢久了 一下子也找不到 我是凭记忆说的 红黑树的算法比较麻烦 但它的思想很好 如果理解了它的思想也就理解它的算法 我也只记得思想 具体算法记不得了 我就在这说说思想吧 红
  • oracle归档空间满且启动报错总结

    oracle归档空间满且启动报错总结 今天oracle数据库归档日志过满导致oracle数据库挂掉 解决思路 删除归档日志 看oracle能否可用 如果不可用重启oracle数据库 并把归档关掉 测试库 生产库一定要起归档 在重启数据库的过
  • WIN32 消息总结

    1 键盘消息 键盘会产生如下两种消息 1 按键消息 消息分类 WM KEYDOWN WM KEYUP WM SYSKEYDOWN 系统按键按下时产生 如ALT F10 WM SYSKEYUP 参数 WPARAM 按键的vritual key
  • 【JMeter-Hive】使用JMeter对Hive的查询性能进行压测

    JMeter Hive 使用JMeter对Hive的查询性能进行压测 1 生成测试数据 2 查询性能压测 2 1 创建线程用户并指定参数配置 2 2 创建JDBC Connection Configuration并配置连接信息 2 3 导入
  • C语言题目代码总结解析

    目录 简单版三子棋实现 简单的扫雷的实现 简单的通讯录实现 最大公约数 辗转相除法 判断一个数是否是素数 二分查找 有序数组查找 递归实现字符串反转 递归实现汉诺塔问题 青蛙跳台阶问题 几个字符串库函数的实现 qsort的冒泡实现版本 杨式
  • 用代码写出浪漫__合集(python、matplotlib、Matlab、java绘制爱心、玫瑰花、前端特效玫瑰、爱心)

    活动地址 CSDN21天学习挑战赛 用代码写出浪漫合集 爱心 玫瑰花 本文目录 一 前言 二 用python matplotlib Matlab java绘制爱心 1 爱心图形1 弧线型 显示的文字写在代码里 2 爱心图形2 直线型 显示的
  • openeuler 欧拉操作系统的几个图形界面安装方法

    欧拉操作系统openeuler 安装的时候默认是不带图形界面的 安装完成后如果要使用图形需要手工往系统里面补 目前为止最新的21 09版本ISO安装完后在线源配置里面EPOL源路径是错误的 需要手工修改一下路径 否则是无法更新源里面的软件包
  • let和const 和var 的区别

    1 let和const是什么 声明变量或声明常量l var声明变量 let 代替var 声明变量 const声明常量constant 2 let和const的用法 var一样 var username Alex let age 18 con
  • 图解LeetCode14:最长公共前缀(递归,二分查找)

    LeetCode14 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀 如果不存在公共前缀 返回空字符串 示例 输入 strs flowers flow flight 输出 fl 输入 strs dog racecar car 输
  • Linux的shell入门和版本控制(五)

    0 前言 这部分简单介绍了Linux系统中的shell编程 1 服务监听 在Linux中的服务监听 相当于在windows中的任务管理器 常用指令 示例一 查询进程 ps aux grep 要查询的程序名 这样查询会连带这条查询指令的进程一
  • 嵌入式Linux开发: 从0开始编译并启动ARM Linux内核(全志)

    引言 最近看见很多小白不会编译Linux内核 自己瞎折腾走了很多弯路 本文章将会以Orange Pi 香橙派 Zero开发板为例 带您成功编译内核并在板子上启动它 准备 您需要一台Ubuntu PC 版本最好在20 04以上 一个可以用的U
  • TCGA数据库详解

    TCGA The cancer genome atlas 癌症基因组图谱 由 National Cancer Institute NCI 美国国家癌症研究所 和 National Human Genome Research Institut
  • C#位运算示例

    在C 中可以对整型运算对象按位进行逻辑运算 按位进行逻辑运算的意义是 依次取被运算对象的每个位 进行逻辑运算 每个位的逻辑运算结果是结果值的每个位 C 支持的位逻辑运算符如表2 9所示 运算符号 意义 运算对象类型 运算结果类型 对象数 实
  • 即将成为史上最具用户体验的Hexo+GitHub Pages搭建博客的教程(持续更新中)

    前言 网上关于Hexo Github Pages搭建博客的教程很多 但是参阅很多博文 都是表达不够清晰 绕来绕去 基于此 我想以一个初来者的角度写一篇尽可能靠谱的教程 方便大家快速搭建好 大致流程 搭建Node js环境 搭建Git环境 搭
  • c++ 习题(1)

    1 输入一个正整数n 计算下式的和求e的值 保留4位小数 e 1 输入输出示例 Input n 10 e 2 7183 if 1 include stdio h double facabular int n int sum 1 i for
  • 如何在C语言循环里实现多线程,如何用C语言实现多线程

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Windows操作系统 C语言实现多线程 include include DWORD APIENTRY ThreadOne LPVOID threadArg printf 线程开始啦 参数是 s
  • 买车注意事项

    YETI 2016创行 车 保险 税 上牌 17 2w 其中裸车15 76w GS4 手动豪华 我的手动豪华117500包上牌 交强险 购置税 全车膜 脚垫 侧蹋 行车记录仪 发动机护板 挡泥板 座套 方向盘套 前两次首保免费 10万公里机
  • Git背后的设计理念

    首先要清楚Git版本管理中提交的概念 通过按行对比 line diff 将有差异的部分作为增量补丁 使用git add添加到暂存区里的每一个文件都会由按行对比得到他们的增量补丁 而使用git commit将暂存区里的所有文件的增量补丁合并起