大家好,周一我们迎来了一个新的专题——git。
写这个专题的初衷有两点,第一点是觉得好像很少有公众号提到git相关的技术,可能是觉得太基础了看不上。但实际上git非常重要,在我们实际的开发工作当中使用的频率也非常非常高。第二点是不少人git用的并不好,连同之前的我在内。而且用得不好也就算了,还意识不到它的重要性,所以就身体力行给大家开了这个专题,表达我的态度——git非常重要,不可以轻视。
Git历史
首先提一下git的来源,git的作者是大名鼎鼎的Linus。有可能你没有听说过它,但是你一定听说过他的作品。他写了第一个版本的Linux内核,可以说Linux就是根据他的名字起的。大家公认的Linux之父。
Linus创造git的目的可能令很多人想不到,就是为了开发Linux内核。因为当时全世界各地都有开发者在为Linux内核提交代码。所有开发者的代码合并工作都是Linus一个人完成的,由于经常会遇到坑爹的开发者和坑爹代码,总靠人肉控制非常蛋疼。所以他们决定使用版本控制工具。
实际上当时已经有相对成熟的版本控制工具了,但是这些工具往往都是收费的。原本谈好了免费提供给开源社区使用的,后来因为种种原因提供方收回了使用权。于是被逼无奈之下,Linus决定自己开发一款版本控制系统。据说他们只用了一周的时间就完成了核心代码的编写,git就此诞生。
后来的故事大家应该都很熟悉了,由于git的简单易用、免费(很关键)、运行效率很高,使得它突飞猛进,迅速流行了开来。甚至基于git诞生了开源社区github,实际上git并不是github专属,几乎所有的开源社区都使用git作为版本控制工具。虽然git和Linux取得了如此瞩目的成功,但是它的作者Linus并没有从中获得多少收益,因为这些内容都是免费开源的。实际上Linus本身也是一个坚定的开源支持者,他对于开源社区的普及和建设也有着非常巨大的贡献。
Linus是一个非常纯粹得热爱技术淡泊名利的人,大家感兴趣可以去看看他写的回忆录,感受一下世界顶级大牛的成长历程。
Git简介
Git是版本控制工具这个众所周知,那么版本控制工具究竟可以用来做什么事情呢?它底层的原理又是什么呢?这一点大家可能就没有那么清楚了。
版本控制当中有两个重要的内容, 一个是版本控制另外一个是多人协同。我们来设想两个场景,第一个场景是我们之前开发了一个功能,结果代码写着写着发现这个功能没有必要,于是我们果断删除了它。删除了之后突然发现自己脑抽了,不该删除的。这个时候我相信大多数人都会感叹,要是当时存个档该有多好啊。
版本控制就像是存档功能,我们可以在我们想要的时候对文件进行存档。如果以后反悔了,还可以找回来。
第二个场景是多人协同,比如我们当前一个小组开发同一个项目,有人开发这个功能,有人开发那个功能。我们怎么保证大家的代码统一呢?如果只是新增代码还好,如果是有人新增有人修改之前的代码呢?有人加了些临时改动用来测试呢?显然这会导致代码非常得乱,多人协同就是为了解决这个问题的。
Git可以使得大家各自在各自的分支进行代码开发和维护,彼此之间互不影响。等开发测试完成之后,再合并到一起。说起来简单,但是我们稍微想一下就会发现一些问题。比如多人协同和版本控制耦合在一起之后,使用难度会大大增加。比如说我们当下要回到某个分支的某个历史版本,再比如我们合并了之后发现合并错版本了,比如我们发现提交错内容了,等等等等。
Git的基本使用人人都会,关键在于当我们面临这些疑难杂症的时候,是否能流畅得写出命令来fix它们。
Git原理浅谈
其实市面上的版本控制工具很多,我知道的就有好几个,比如Google开发的hg,比如SVN等等。虽然这些工具有很多,但是它们的一些底层原理还是不太一样的。如果是这样,Git也不会如此为人称道。
直接记录快照
和Git不同,很多其他的版本控制工具在面临文件改动的时候,记录的是文件的具体改动。比如某个文件增加了一行还是减去了一行,修改的内容是什么。比如在下图当中,version2改动了file A和fileC各一行,version只改动了file C两行。每个版本只记录这些文件的改动。
而Git与他们不同,Git记录的并不是文件当中内容的改动,而是直接将发生变更的文件记录一个快照(snapshot)。这个词经常在各种技术相关的文档当中出现,我们可以理解成存档。也就是说把每一个发生过变动的文件都存一份新的存档。
比如下图当中,在version 2当中,文件A和C发生了改动,于是记录改动之后的文件快照A1和C1。对于version 3来说文件A没有再次改动,所以继续保持A1。
这样做看似额外多存储了内容,增加了存储成本,但是好处是巨大的。因为对于任何一个版本来说,它记录的文件内容都是全的,我们可以迅速还原出每一个分支对应的每一个版本的内容。并且还引发出了许多强大的功能。
可撤销
Git一个非常巨大的特点就是几乎所有提交快照的操作都是可撤销的,也就是说我们不用担心我们的误操作或者是一时手残毁掉整个项目或者是代码。Git会记录下我们的每一次改动,即使是像是删除这样的操作,也会记录下来。
当我们遇到一些复杂的问题的时候,这个特性显得非常关键。因为当我们尝试的时候我们并不一定确定能够解决问题,如果我们解决不了,我们会希望回到尝试之前的状态。无论这中间经过了多少操作,我们都可以通过查阅Git的变更记录找到之前开始尝试的位置,从而还原所有的改动。
本地操作
Git另外一个巨大的好处是大多数的操作可以本地进行,这也是分布式文件系统的特点。每一个节点都有几乎完整的数据,我们在本地就可以查阅到最后一次同步之前所有的信息。我们要回滚代码,或者是查看之前的代码等操作在本地就可以直接完成。并不需要连接网络。
而对于有些工具来说,所有操作都需要通过网络进行,这就不是很友好了。尤其是在一些网络不好或者是没有网络的场景当中。
以上介绍的这些内容既是Git的基本原理,也是Git强大功能的体现。当然这里只是浅尝辄止,在后续的文章当中,我们将会介绍它们的详细使用。
今天的文章到这里就结束了,如果喜欢本文的话,请来一波素质三连,给我一点支持吧(关注、转发、点赞)。
- END -