内部GIT:简介(翻译)

哈Ha! 我向您介绍Tommi Virtanen撰写的文章“面向计算机科学家的Git”的翻译。


GIT由内而外:简介


我本人:我 定期阅读有关如何在引擎盖下安排各种流行技术的文章,我偶然发现了这些材料 由于存在简单易懂的方案,因此这篇文章看起来很有趣,这种方案比呆板的文字要好得多。 我决定翻译成俄语。 图片取自原始图片。


谁会感兴趣并且可能会有用:每天(如果不是第一个软件开发人员,也就是每秒)与Git一起工作的人,以及想更好地了解其工作机制的人。


注意:为了更好地理解本文,应该对诸如无向图(DAG)之类的野兽有所了解。


对象存储


粗略地说,Git对象存储库是一个包含各种类型对象的DAG。 对象以压缩形式存储,并由SHA-1哈希标识(这不是代表对象的文件内容的哈希,而是其在Git中的表示形式)。


斑点


图片


Blob是一个简单的对象,只是字节的集合。 它可以是文件,符号链接等。 语义由指向此Blob的对象确定。



图片


“树”类型的对象描述目录(目录)。 它们可以指向存储文件内容的Blob,也可以指向其他树,从而创建子目录结构。


如果某个节点指向DAG中的另一个节点,则他们说该节点取决于该节点,即 没有它就无法存在。 不能使用垃圾回收( git gc命令)删除要指向的点,也不能使用git fsck --lost-found命令来恢复指向的点


提交


图片


提交是指表示创建提交时Git中文件状态的树。 此外,提交可以引用作为其父级的其他提交:


  • 如果提交的父级超过1个,则表示它描述了合并操作(合并)
  • 如果提交没有父母,这就是所谓的初始(初始)提交(即存储库中的第一个)
  • 在某些情况下,存储库中的初始提交可能不止一次-这通常意味着合并两个单独的存储库

提交对象的主体是提交消息


引用(链接)


图片


链接(或标题或分支)类似于在DAG节点上粘贴注释的贴纸,某种注释或书签-“我在这里工作”。 与DAG节点(不能更改,只能添加)不同,可以根据需要移动链接。 它们不会存储在历史记录中,也不会在存储库之间直接传输。


git commit命令将新节点添加到DAG,并将当前分支的书签移至该节点。


链接位于heads / branchname命名空间中 ,但可以省略部分heads


HEAD链接分开放置-它没有指向节点,而是指向另一个链接-这是指向当前活动分支的指针。


远程裁判


图片


大致来说,这些是不同颜色的贴纸。 不同之处在于远程链接位于不同的名称空间中,并且也由远程服务器管理。 要更新它们,请使用git fetch命令。


标签



标签是DAG节点和标签(另一种颜色)的组合。 标签指向提交,并包含可选消息和GPG签名。 标签(链接)是访问标签的一种简单方法,万一丢失,可以使用git fsck --lost-found命令将其恢复。


因此,Git存储库是DAG和链接的组合。


故事


现在,了解Git如何存储版本历史记录,让我们尝试描述各种操作,并了解Git与将历史记录表示为每个分支的线性变化的系统有何不同。


图片


最简单的存储库。 我们只需一次提交就复制( git clone )远程存储库。


图片


在这里,我们读取( git fetch )远程存储库并获得1个新提交,但尚未将其与我们的分支合并。


图片


这是运行git merge remotes / MYSERVER / master命令后发生的情况。 由于合并是按快进方式执行的(本地分支中没有本地提交),因此发生了以下情况:工作副本的文件已更改,并且分支的指针也移动了。


图片


在本地运行git commit ,然后运行git fetch 。 现在我们有了本地和远程提交。 显然,您需要合并


图片


这是git merge remotes / MYSERVER / master命令的结果。 由于我们有本地提交,因此这不是很快的事情,因此将为DAG中的合并创建一个单独的提交。 注意-他有2个父提交。


图片


这就是我们的树在分支(本地和远程)+合并中几次提交后的样子。 您可以清楚地看到Git DAG如何捕获我们行动的全部历史。


图片


但是,这样的故事很难阅读。 如果您尚未发布分支机构,或者已与其他团队成员达成共识,即他们不应在其工作中建立分支机构,则可以选择另一种方法:可以为分支机构建立基础。 在这种情况下,您的提交将替换为具有不同父项的另一个提交,分支的链接也将移动到该提交。


在这种情况下,您的旧提交-s将保留在DAG中,直到进行垃圾回收为止。 原则上,如果出现问题,这是一种保险。 如果您仍有指向旧提交的链接,则只要链接存在,它们就会被保存。


您不应该为其他人在其上创建提交的分支建立基础。 您可以还原它们(甚至不是很困难),但这会增加混乱和许多无用的工作。


图片


这是在垃圾回收(或忽略不可访问的提交),并在应用了rebase的分支之上创建新提交之后的样子。


图片


同样,使用rebase可以同时移动多个commit。


仅此而已。 我希望这些材料会有用。

Source: https://habr.com/ru/post/zh-CN468205/


All Articles