Git | Git入门,成为项目管理大师(一)
大家好,周一我们迎来了一个新的专题——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 -

Git | Git入门,成为项目管理大师(一)的更多相关文章
- Git快速入门
如果你不想看长篇的Git教程,想快速了解Git的使用,那么本文可能会对你入门Git有所帮助.由于笔者用的是Windows系统,所以本文只写Git在Windows上的使用. 一.Git安装 去Git官网 ...
- GIT 从入门到放弃大整理
跟着廖雪峰学 GIT http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 GUI f ...
- 第三章 Git的入门 - 读书笔记
Android驱动月考3 第三章 Git的入门 - 读书笔记 对于Github,这是全世界最大的开源平台,你可以把你做的项目在这里开源,把你发现的一些新技术在这里开源,向全世界的开发者们分享,大家都彼 ...
- git简单入门
git简单入门 标签(空格分隔): git git是作为程序员必备的技能.在这里就不去介绍版本控制和git产生的历史了. 首先看看常用的git命令: git init git add git comm ...
- Android系统移植与驱动开发--第三章 Git使用入门及在学习中有感
第三章 Git使用入门 使用Git的目的是减少各种版本的Linux的压缩大小,提供源代码在Linux上进行编译. 在这一个章节中,其实就是关键步骤的操作,虽然Git与我们学习的android没有很大的 ...
- 让 Python 带你进入开源的世界——Git 从入门到与他人协作开发
让 Python 带你进入开源的世界--Git 从入门到与他人协作开发 我认为开源社区中有很多优秀的资源,并且可以帮助进阶中的程序员提高编程能力和水平.所以,我发起了<HelloGitHub&g ...
- Git快速入门和常用命令
一.快速入门 本地初始化一个项目 首先,你需要执行下面两条命令,作为 git 的基础配置,作用是告诉 git 你是谁,你输入的信息将出现在你创建的提交中. git config --global us ...
- Git快速入门进阶篇
本文接着Git快速入门篇,继续探讨Git在管理项目中的一些应用. 远程仓库的使用 查看远程仓库 查看你已经配置的远程仓库服务器,可以运行 git remote 命令.指定选项 -v,会显示需要读写远程 ...
- git快速入门 push/clone/reset/merge/切换分支全都有
本文介绍git快速入门,从安装/创建init / 发布push/版本回退reset / branch分支切换/合并分支merge 这些基本的操作都有涉及,方便新人快速入手,有需要的朋友mark一下.首 ...
- Git 快速入门--Git 基础
Git 快速入门 Git 基础 那么,简单地说,Git 究竟是怎样的一个系统呢? 请注意接下来的内容非常重要,若你理解了 Git 的思想和基本工作原理,用起来就会知其所以然,游刃有余. 在开始学习 G ...
随机推荐
- php的四种值输出方式
//echo 深入理解echo ,echo是一个函数 //echo 功能:向浏览器输出一个或多个字符串; //echo 返回值:void 无返回值; echo "今天是个好天气"; ...
- 使用nebula把联想个人云存储映射到当前网络使用的方法
整个过程涉及三个主机一个是家里的台式机 home 内网ip为192.168.69.101一个是公司的笔记本 mac一个是有公网ip的服务器 server云存储在家里和home在同一个内网,IP地址为1 ...
- JavaScript基础-06-正则表达式
正则表达式 1. 正则表达式用于定义一些字符串的规则:计算机可以根据正则表达式,来检查一个字符串是否符合规则,将字符串中符合规则的内容提取出来. 2. 创建正则表达式对象: var reg=new R ...
- 前端进阶必读:《JavaScript核心技术开发解密》核心提炼二
前言 最近读勒基本关于前端的数据<JavaScript核心技术开发解密>,<webpack从入门到进阶>...这几本书帮助到我更好的理解JS.webpack在前端技术领域中的作 ...
- Android 本地缓存Acache的简单使用
设置缓存数据: ACache mCache = ACache.get(this); mCache.put("key1", "value"); //保存6秒,如果 ...
- 2w字 + 40张图带你参透并发编程!
并发历史 在计算机最早期的时候,没有操作系统,执行程序只需要一种方式,那就是从头到尾依次执行.任何资源都会为这个程序服务,在计算机使用某些资源时,其他资源就会空闲,就会存在 浪费资源 的情况. 这里说 ...
- DFS【搜索1】
DFS模板 void dfs(int depth)//depth表示当前的层数(或深度) { if(depth>n)//到达叶子节点,该路已走到尽头 return; for(int i=;i&l ...
- 从 BIO、NIO 聊到 Netty,最后还要实现个 RPC 框架!
大家好,我是 「后端技术进阶」 作者,一个热爱技术的少年. 觉得不错的话,欢迎 star!ღ( ´・ᴗ・` )比心 Netty 从入门到实战系列文章地址:https://github.com/Snai ...
- tensorflow1.x及tensorflow2.x不同版本实现验证码识别
近一个假期,入坑深度学习,先从能看得着的验证码识别入门.从B站看了几天的黑马程序员的“3天带你玩转python深度学习后“,一是将教程中提到的代码一一码出来:二是针对不同的tensorflow版本,结 ...
- Unimrcp通过Vendor传递随路数据
摘要 项目中需要在MRCPV2的识别消息中,传递一些随路数据.