大家好,周一我们迎来了一个新的专题——git。

写这个专题的初衷有两点,第一点是觉得好像很少有公众号提到git相关的技术,可能是觉得太基础了看不上。但实际上git非常重要,在我们实际的开发工作当中使用的频率也非常非常高。第二点是不少人git用的并不好,连同之前的我在内。而且用得不好也就算了,还意识不到它的重要性,所以就身体力行给大家开了这个专题,表达我的态度——git非常重要,不可以轻视。

Git历史

首先提一下git的来源,git的作者是大名鼎鼎的Linus。有可能你没有听说过它,但是你一定听说过他的作品。他写了第一个版本的Linux内核,可以说Linux就是根据他的名字起的。大家公认的Linux之父。


Talk is cheap. Show me the code.

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 -

Git | Git入门,成为项目管理大师(一)的更多相关文章

  1. Git快速入门

    如果你不想看长篇的Git教程,想快速了解Git的使用,那么本文可能会对你入门Git有所帮助.由于笔者用的是Windows系统,所以本文只写Git在Windows上的使用. 一.Git安装 去Git官网 ...

  2. GIT 从入门到放弃大整理

    跟着廖雪峰学 GIT  http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 GUI f ...

  3. 第三章 Git的入门 - 读书笔记

    Android驱动月考3 第三章 Git的入门 - 读书笔记 对于Github,这是全世界最大的开源平台,你可以把你做的项目在这里开源,把你发现的一些新技术在这里开源,向全世界的开发者们分享,大家都彼 ...

  4. git简单入门

    git简单入门 标签(空格分隔): git git是作为程序员必备的技能.在这里就不去介绍版本控制和git产生的历史了. 首先看看常用的git命令: git init git add git comm ...

  5. Android系统移植与驱动开发--第三章 Git使用入门及在学习中有感

    第三章 Git使用入门 使用Git的目的是减少各种版本的Linux的压缩大小,提供源代码在Linux上进行编译. 在这一个章节中,其实就是关键步骤的操作,虽然Git与我们学习的android没有很大的 ...

  6. 让 Python 带你进入开源的世界——Git 从入门到与他人协作开发

    让 Python 带你进入开源的世界--Git 从入门到与他人协作开发 我认为开源社区中有很多优秀的资源,并且可以帮助进阶中的程序员提高编程能力和水平.所以,我发起了<HelloGitHub&g ...

  7. Git快速入门和常用命令

    一.快速入门 本地初始化一个项目 首先,你需要执行下面两条命令,作为 git 的基础配置,作用是告诉 git 你是谁,你输入的信息将出现在你创建的提交中. git config --global us ...

  8. Git快速入门进阶篇

    本文接着Git快速入门篇,继续探讨Git在管理项目中的一些应用. 远程仓库的使用 查看远程仓库 查看你已经配置的远程仓库服务器,可以运行 git remote 命令.指定选项 -v,会显示需要读写远程 ...

  9. git快速入门 push/clone/reset/merge/切换分支全都有

    本文介绍git快速入门,从安装/创建init / 发布push/版本回退reset / branch分支切换/合并分支merge 这些基本的操作都有涉及,方便新人快速入手,有需要的朋友mark一下.首 ...

  10. Git 快速入门--Git 基础

    Git 快速入门 Git 基础 那么,简单地说,Git 究竟是怎样的一个系统呢? 请注意接下来的内容非常重要,若你理解了 Git 的思想和基本工作原理,用起来就会知其所以然,游刃有余. 在开始学习 G ...

随机推荐

  1. 他们都说JVM能实际使用的内存比-Xmx指定的少?这是为什么呢

    这确实是个挺奇怪的问题,特别是当最常出现的几种解释理由都被排除后,看来JVM并没有耍一些明显的小花招: -Xmx和-Xms是相等的,因此检测结果并不会因为堆内存增加而在运行时有所变化. 通过关闭自适应 ...

  2. vue或者js中平均分割数组

    vue中 把一段长数组按照指定份数 均分 sliceArray(array, size) { var result = []; for (var x = 0; x < Math.ceil(arr ...

  3. sourcetree关于注册的问题

    当前只有Win的版本,Mac自行百度(笑) 很多人用git命令行不熟练,那么可以尝试使用sourcetree进行操作. 然鹅~~sourcetree又一个比较严肃的问题就是,很多人不会跳过注册或者操作 ...

  4. YAML简要入门

    这是一篇简单的YAML入门教程,目的是让你知晓什么YAML,以及YAML的基础语法.方便接下来学习如何使用Golang解析YAML.如果想获得更多YAML的知识,请查看http://yaml.org ...

  5. java.io.IOException: Stream closed 的问题

    public static String getBodyString(ServletRequest request) { StringBuilder sb = new StringBuilder(); ...

  6. NoSQLBench入门教程

    NoSQLBench发布于2020年3月,它是第一个试图在分布式系统性能测试上做到面面俱到的专业测试工具.同时,它旨在让轻量级的和专业的用户都可以使用. 什么是NoSQLBench? 当今的开发人员希 ...

  7. go chan 缓存与阻塞

    原文链接:Go语言第十一课 并发(三)Channel缓存与阻塞 Channel的缓存 前面介绍过channel的创建方法: channel_test := make(chan string) 其实它完 ...

  8. Latex — 写作编译过程中遇到问题记录与总结

    最近在训练的时候,又开始用Latex进行写作.碰到了很多问题,将问题进行记录与总结. 一.输出中文的问题 由于写作的时候用的是中文,而之前用的是英文,故碰到的第一个问题就是中文的问题.我之前下的是Wi ...

  9. ReplayingDecoder 解码器:别以为我有多厉害,也只不过是使用了一下装饰器模式而已~

    原文地址 一.设计模式为啥老是用不好? 想要写出更屌的代码,提高代码的健壮性和可扩展性,那么设计模式可谓是必学的技能. 关于学习设计模式,大家可能都觉得设计模式的概念太过于抽象,理解起来有点费劲:又或 ...

  10. jmeter中jdbc连接数据库——(一)

    所有jmeter基本组件功能本文不做介绍.jmeter要链接mysql数据库,首先得下载mysql jdbc驱动包 (注:驱动包的版本一定要与你数据库的版本匹配,驱动版本低于mysql版本有可能会导致 ...