大家好,周一我们迎来了一个新的专题——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. CTFhub-WEB前置-http协议闯关

    前情提要: 在渗透学习过程中,web的基础知识很重要,在这里通过long long ago之前学习的http基础,并结合网上的CTFhub--WEB前置之http协议闯关,对web基础知识进行加固并查 ...

  2. PostgreSQL在没有备份情况下误删除Clog恢复

    创建实验表postgres# create table t (n_id int primary key,c_name varchar(300));CREATE TABLEpostgres# inser ...

  3. Mybatis-03-日志

    日志 1 日志工厂 如果一个数据库操作,出现了异常,需要排错,此时需要日志. 曾经:sout debug 现在:日志工厂 logImpl SLF4J/log4j(掌握)/log4j2 设置中可以设定日 ...

  4. 浏览器自动化的一些体会5 webBrowser控件之winform和webBrowser的交互

    从winform访问webBrowser,大致就是利用webBrowser提供的解析dom的方法以及用InvokeScript方法执行javascript.这个相对比较简单. 从webBrowser访 ...

  5. 微服务技术栈:API网关中心,落地实现方案

    本文源码:GitHub·点这里 || GitEE·点这里 一.服务网关简介 1.外观模式 客户端与各个业务子系统的通信必须通过一个统一的外观对象进行,外观模式提供一个高层次的接口,使得子系统更易于使用 ...

  6. 【API进阶之路】逆袭!用关键词抽取API搞定用户需求洞察

    摘要: 老大说,我这份用关键词抽取API搞定的用户需求洞察报告,简直比比市场调研的科班人士做得还好. 最近这半个月的午饭,那可是相当不错,市场老大天天请吃饭,不是外面下馆子,就是从家带饺子.说是感谢我 ...

  7. NeuroAttack: Undermining Spiking Neural Networks Security through Externally Triggered Bit-Flips

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! arXiv:2005.08041v1 [cs.CR] 16 May 2020 Abstract 由于机器学习系统被证明是有效的,因此它被广 ...

  8. WS以及NW小世界网络的生成(MATLAB)

    WS小世界网络生成算法,一般小世界网络生成算法速度慢,节点度分布与数学推导不符,在网络仿真中造成不便,这里针对实际网络动力学仿真过程撰写了WS小世界网络的MATLAB生成算法,并考虑了矩阵化,具有较高 ...

  9. 从《三体》到“中美科技战”,3分钟理解“网络”D丝为什么要迎娶“算力”白富美

    摘要:在多维的世界里,高维的文明对于低维文明具有碾压的优势,而网络也正在从二维走向三维!网络硬件的竞争主要是“芯片+算法”. 从三体到中美科技战,理解网络与算力深度融合助力高维度竞争 1:对抗封锁,需 ...

  10. spss如何把多个指标合并成一个变量?

    把多个指标合并成一个变量,通常有两种做法: 一.计算平均值 针对问卷量表数据,同时几个题表示一个维度.比如想要将“我在工作中能获得成就感”.“我可以在工作中发挥个人的才能”这两题合并成一个维度(影响因 ...