Git是如何设计的?


9

我的工作场所最近改用Git,我一直在(讨厌)它。我真的很喜欢它,它功能非常强大。我唯一讨厌的部分是有时功能过于强大(也许有点简洁/令人困惑)。

我的问题是... Git如何设计的?只需短时间使用它,您就会感觉到它可以处理其他版本控制系统无法处理的许多晦涩的工作流程。但下面也感觉优雅。又快!

毫无疑问,这部分是莱纳斯的才能。但是我想知道,git的总体设计是基于某种东西吗?我已经阅读过有关BitKeeper的信息,但是有关技术细节的内容很少。压缩,图形,删除修订号,强调分支,隐藏,远程……所有这些都是从哪里来的?

Linus真的把这个人赶出了公园,几乎是第一次尝试!一旦您超过了学习曲线,就可以很好地使用它。


也许您可以在git IRC频道(freenode上的#git)上获得一些帮助
yati sagade 2011年


2
you get the feel that it can handle many obscure workflows that other version control systems could not:那可能是因为它是为处理Linux内核而设计的,这是一个臭名昭著的,庞大而复杂的代码段。
yannis 2011年

1
在Git的10周年之际,这里是从与托沃兹的采访文章:linux.com/news/featured-blogs/185-jennifer-cloer/...
斯里达尔Sarnobat

Answers:


17

Git的设计不尽人意

自己看看。克隆官方git存储库,在gitk(或您喜欢的图形git日志查看器)中打开它,并查看其最早的修订版。

您将看到它最初仅具有非常核心的功能(对象数据库和索引)。其他的一切都是手工完成。但是,这个小内核的设计使其可以通过Shell脚本轻松实现自动化。git的早期用户编写了自己的shell脚本来自动化常见任务。这些脚本一点一点地合并到了git发行版中(参见早期示例839a7a0)。每次有新需求时,都会对脚本进行调整以适应需求。很久以后,其中一些脚本将用C重写。

干净,正交的核心(如果需要,您仍然可以直接使用)与在其上自然生长的上层的结合,为git提供了强大的功能。当然,这也是赋予它大量奇怪的命令和选项的原因。


压缩,图形,删除修订号,强调分支,隐藏,远程……所有这些都是从哪里来的?

很多东西一开始都不存在。

虽然每个对象都是单独压缩的,并且通过命名避免了重复,但是用于git的高压缩率的“ pack”文件并不存在。最初的哲学是“磁盘空间便宜”。

如果用“图形”来表示类似的图形查看器gitk,则它们稍后出现(AFAIK,第一个是gitk)。AFAIK,BitKeeper还具有图形历史记录查看器。

摆脱版本号,实际上git的使用内容寻址文件系统存储对象的核心概念主要来自monotone。那时,单调很慢。如果不是这种情况,那么Linus可能会使用它而不是创建git。

在分布式版本控制系统上,不可避免地要强调分支,因为每个克隆都充当一个单独的分支。

藏匿(git stash)是IIRC,是最近的。它使用的reflog在一开始就不存在。

甚至连遥控器都没有。最初,您是使用手动复制对象的rsync

这些功能中的每一项都是由某人添加的。不是所有的人,甚至不是大多数人,都是由Linus写的。每当有人感觉到git无法满足的需求时,都可以在git的核心“管道”层上创建一个新功能,并提出包含在内的建议。如果良好,它可能会被接受,从而进一步增强git的效用(及其命令行复杂性)。


“ AFAIK,BitKeeper还具有图形历史记录查看器。” 是的,它确实。它并不完全漂亮,但功能强大。请参阅bitkeeper.com/Test.Using.Looking.html,尽管这样做在显示分支显示方式方面做得很差。
布莱恩·奥克利

1
同样有趣的阅读,一些来自git开头的精选电子邮件,显示了其最初的演变过程:kerneltrap.org/node/4982
CesarB 2011年

程序员曾经使用cvs + rsync + httpd模拟git的某些功能吗?我想知道有什么自制的解决方案是可能的。
Sridhar Sarnobat 2014年

8

我认为主要要点是git是由地球上最有资格的人设计的。而且我不是在谈论人才,而是在谈论经验:我怀疑是否还有其他人负责代码库,其代码大小和贡献者的数量与Linux内核相当,并且实际上仍在处理大多数集成自己工作。

因此,Linus比任何人都更了解分布式版本控制系统的需求和用例。当然,这对他处理的大多数编码都使用C语言很有帮助,并且其中大部分性能至关重要。

基本上,这是挠痒的终极例子。


6
“唯一最合格”?我不这么认为。有许多聪明的人有资格编写分布式源代码管理。BitMover(BitKeeper背后的公司)的家伙真的了解他们在做什么。Linus甚至赞扬Larry McVoy向他展示了源代码控制应该如何工作。没有拉里,就不会有git。
布莱恩·奥克利

1
@BryanOakley,我认为我们可以避免在某人对某人有益的情况下对它进行打击。高内幕的人都知道,这个要求才是优秀的开发人员。因此,如果明天遇到了一个大问题,我们可能会像Dennis Ritchie一样记住您。没有人比别人更好,只是他们遇到了世界公认的要求,并首先提供了解决方案。
Pankaj Upadhyay

2
@Bryan:我相信使用BitKeeper的经验也对Linus有很多启发,我应该提到这一点。当然,还有很多其他聪明,有资格的人知道他们在做什么。但是我仍然认为Linus在维护内核方面的经验使他成为合格,经验丰富的人。我可能是错的,但是您能否指出另一个大型项目,有多少贡献者,而负责该项目的人员仍在尽最大努力使所有这些贡献者的实际代码协同工作?
Michael Borgwardt

@Pankaj Upadhyay:我不是在抨击任何人,我只是在解释为什么我拒绝了这个答案。您说了一些“首先提供解决方案”,我认为这意味着您在某些方面认为git某种程度上是“第一”。您认为它最初是什么?从长远来看,它肯定不是第一个分布式scm工具。
Bryan Oakley

1
@DeadMG:该语句的更重要的部分随后出现“ ...并且其中大部分对性能至关重要”。我怀疑您会发现许多人会认为,如果您很了解C,那么它就不太适合实现低开销的高性能代码。
Michael Borgwardt

6

它的设计几乎完全与《 Git Parable》中所述

想象一下,您有一台除了文本编辑器和一些文件系统命令之外什么都没有的计算机。现在,假设您决定在此系统上编写大型软件程序。因为您是负责任的软件开发人员,所以您决定需要发明某种方法来跟踪软件的版本,以便可以检索以前更改或删除的代码。接下来是一个有关如何设计这样的版本控制系统(VCS)以及这些设计选择背后的原因的故事。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.