Git 是一个分布式版本控制系统,缔造者是大名鼎鼎的林纳斯·托瓦茲 (Linus Torvalds),Git 最初的目的是为了能更好的管理 Linux 内核源码。


PS:为了能够帮助更多的 Java 爱好者,已将《Java 程序员进阶之路》开源到了 GitHub(本篇已收录)。该专栏目前已经收获了 715 枚星标,如果你也喜欢这个专栏,觉得有帮助的话,可以去点个 star,这样也方便以后进行更系统化的学习

https://github.com/itwanger/toBeBetterJavaer

每天看着 star 数的上涨我心里非常的开心,希望越来越多的 Java 爱好者能因为这个开源项目而受益,而越来越多人的 star,也会激励我继续更新下去~

大家都知道,Linux 内核是开源的,参与者众多,到目前为止,共有两万多名开发者给 Linux Kernel 提交过代码。

但在 1991 年到 2002 年期间,Linus 作为项目的管理员并没有借助任何配置管理工具,而是以手工方式通过 patch 来合并大家提交的代码。

倒不是说 Linus 喜欢手工处理,而是因为他对代码版本管理工具非常挑剔,无论是商用的 clearcase,还是开源的 CVS、SVN 都入不了他的法眼。

直到 2002 年,Linus 才相中了一款分布式版本控制系统 BitKeeper,虽然是商用的,但 BitKeeper 愿意让 Linux 社区免费使用,这让 Linus 非常开心和满意。

时间来到 2005 年,由于 BitKeeper 提供的默认接口不能满足 Linux 社区用户的全部需要,一位开发者在未经允许的情况下反编译了 BitKeeper 并利用了未公开的接口,于是 BitKeeper 的著作权拥有者拉里·麦沃伊就气愤地收回了 Linux 社区免费使用的权力。

没办法,Linus 只好自己硬着头皮上了。他对新的版本控制系统制订了若干目标:

  • 速度
  • 设计简单
  • 允许成千上万个并行开发的分支
  • 完全分布式
  • 有能力高效管理类似 Linux 内核一样的超大规模项目

结果,令人意想不到的是,Linus 只用了 10 天时间就用 C语言完成了第一个版本,嗯。。神就是神。并且给这个版本起了一个略带嘲讽意味的名字——Git(在英式英语俚语中表示“不愉快的人”)。

源代码的自述文件有进一步的阐述:

The name “git” was given by Linus Torvalds when he wrote the very first version. He described the tool as “the stupid content tracker” and the name as (depending on your way)

从 Git 的设计上来看,有两种命令:分别是底层命令(Plumbing commands)和高层命令(Porcelain commands)。一开始,Linus 只设计了一些给开源社区的黑客们使用的符合 Unix KISS 原则的命令,因为黑客们本身就是动手高手,水管坏了就撸起袖子去修理,因此这些命令被称为 plumbing commands。

Linus 在提交了第一个 git commit 后,就向社区发布了 git 工具。当时,社区中有位叫 Junio Hamano 的开发者觉得这个工具很有意思,便下载了代码,结果发现一共才 1244 行代码,这更令他惊奇,也引发了极大的兴趣。Junio 在邮件列表与 Linus 交流并帮助增加了 merge 等功能,而后持续打磨 git,最后 Junio 完全接手了 Git 的维护工作,Linus 则回去继续维护 Linux Kernel 项目。

Junio Hamano 觉得 Linus 设计的这些命令对于普通用户不太友好,因此在此之上,封装了更易于使用、接口更精美的高层命令,也就是我们今天每天使用的 git add, git commit 之类。Git add 就是封装了 update-cache 命令,而 git commit 就是封装了 write-tree, commit-tree 命令。

如果选历史上最伟大的一次 Git 代码提交,那一定是这 Git 工具项目本身的第一次代码提交。这次代码提交无疑是开创性的,如果说 Linux 项目促成了开源软件的成功并改写了软件行业的格局,那么 Git 则是改变了全世界开发者的工作方式和写作方式

如今,Git 已经成为全球软件开发者的标配。

原本的 Git 只适用于 Unix/Linux 平台,但随着 Cygwin、msysGit 环境的成熟,以及 TortoiseGit 这样易用的GUI工具,Git 在 Windows 平台下也逐渐成熟。

PS1:Cygwin 的主要目的是通过重新编译,将 POSIX 系统(例如Linux、BSD,以及其他Unix系统)上的软件移植到Windows上。

PS2:msysGit 前面的 4 个字幕来源于 MSYS 项目,而 MSYS 又源于 MinGW(Minimalist GNU for Windows,最简GNU工具集),通过增加了一个由bash提供的shell环境以及其他相关工具软件,组成了一个最简系统(Minimal System),利用MinGW提供的工具,以及Git针对MinGW的一个分支版本,可以在Windows平台为Git编译出一个原生应用,结合MSYS就组成了msysGit。

Git 和传统的版本控制工具 CVS、SVN 有不小的区别,前者关心的是文件的整体性是否发生了改变,后两者更关心文件内容上的差异。

除此之外,Git 更像是一个文件系统,每个使用它的主机都可以作为版本库,并且不依赖于远程仓库而离线工作。开发者在本地就有历史版本的副本,因此就不用再被远程仓库的网络传输而束缚。

Git 中的绝大多数操作都只需要访问本地文件和资源,一般不需要来自网络上其它计算机的信息。因为在本地磁盘上就有项目的完整历史,所以 Git 的大部分操作看起来就像是在瞬间完成的。

在多人协作的情况下,Git 可以将本地仓库复制给其他开发者,那些发生改变的文件可以作为新增的分支被导入,再与本地仓库的进行分支合并。

如果你希望后面的学习更顺利,请记住 Git 这三种状态:

  • 已提交(committed),表示数据已经安全的保存在本地数据库中
  • 已修改(modified),表示修改了文件,但还没保存到数据库中
  • 已暂存(staged),表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中

由此引入了 Git 的三个工作区域:

  • Git 仓库,用来保存项目的元数据和对象数据库
  • 工作目录,对项目的某个版本进行独立提取
  • 暂存区域,保存了下次将提交的文件列表信息,也可以叫“索引”

Git 的工作流程是这样的:

  • 在工作目录中修改文件
  • 暂存文件,将文件的快照放入暂存区域
  • 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录

接下来,我们来看一下 Git 的安装,Linux 和 Windows 系统的安装大家可以到 Git 官网上查看安装方法,上面讲的非常详细。

https://git-scm.com/downloads

我个人使用的 macOS 系统,可以直接使用 brew install git 命令安装,非常方便。

安装成功后,再使用 git --version 就可以查看版本号了,我本机上安装的是 2.23.0 版本。


参考资料:

维基百科:https://zh.wikipedia.org/wiki/Git
ProGit:https://www.progit.cn/
hutusi:改变世界的一次代码提交

这是《Java 程序员进阶之路》专栏的第 73 篇(记得去点个 star 哦)。该专栏风趣幽默、通俗易懂,对 Java 爱好者极度友好和舒适

可能是历史上最伟大的一次 Git 代码提交相关推荐

  1. idea 上传项目到码云git仓库提交到gitee(完整操作流程)

    环境 : InteilJ IDEA2018.3.5    +   Git-2.16.2-64-bit   +   gitee 一 : (1)首先下载Git  --> 传送门 https://gi ...

  2. 【历史上的今天】10 月 15 日:FORTRAN 语言正式问世;支付宝诞生第一笔交易;Tcl 语言发明者出生

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2022 年 10 月 15 日,在 14 年前的今天,中国网通与中国联通正式合并,缓解此前联通将北方县以下营业厅 ...

  3. 明朝是中国历史上最有骨气的王朝?【ZZ】

    linked from http://www.guoxue.com/article/list.asp?id=6095 明朝是中国历史上最有骨气的王朝?作者:   (国学网2006-5-12发布) 有人 ...

  4. 用肖像画追踪历史上的信任度变化 |《自然-通讯》论文

    来源:Nature自然科研 <自然-通讯>发表的一项研究Tracking historical changes in trustworthiness using machine learn ...

  5. OSChina 周六乱弹 —— 中国历史上路子最野的人

    2019独角兽企业重金招聘Python工程师标准>>> 特大消息~江苏一快递货车着火了,4000多件快递报废,同志们赶紧去看看里面有没有你的快递! @evang:duo手党快去看看 ...

  6. python爬取历史上的今天数据并展示。

    效果图: GitHub项目原码 第一步肯定是先获取数据 (现成的接口的要钱啊,就算免费也限量啊.) 百度搜索历史上的今天 先看一看有没有现成的数据, import requestsurl = &quo ...

  7. 管道的另一端上无任何进程。_历史上突然消失的二位牛人,其下落无任何记载...

    在浩瀚的历史长河中,曾发生过许许多多匪夷所思的事情,而且随着时间的流逝,这些本令人迷惑的事情就更是显得神秘了,今天小编要和你说历史中的二位牛人,他们在辉煌的时候可谓是无人不知,深受大家的敬仰,在历史上 ...

  8. 霍金:人工智能或是人类历史上最后事件

    点击关注 异步图书,置顶公众号 每天与你分享 IT好书 技术干货 职场知识 Tips参与文末话题讨论,即有机会获得异步图书一本. 霍金曾说,"在我的一生中,我见证了社会深刻的变化.其中最深刻 ...

  9. 历史上线程的3种实现模型

    一.概述                                                    这里以Linux为例.Linux历史上,最开始使用的线程是LinuxThreads,但L ...

最新文章

  1. read(10, quot;NTP0 13690\nquot;, 64) 数据库登录缓慢
  2. ansible自己总结(playbook)
  3. Unity3D研究院之C#使用Socket与HTTP连接服务器传输数据包
  4. 浅谈Java反射(Reflect)技术--常用方法
  5. C#_XXX事件 的重载均与委托System.EventHandler不匹配
  6. 记录hiveonspark:Execution Error, return code 30041 from org.apache.hadoop.hive.ql.exec.spark.SparkTask
  7. 计算机硬件专业知识西瓜视频,2019年中电脑硬件榜单,空调西瓜+电脑助你当个快乐肥宅...
  8. 2021二维数组中的元素查重(C++,stl--set)
  9. 校运会计算机专业口号,校运动会口号(精选80条)
  10. 如何在 Mac 上快速输入 Apple 图标?
  11. python烧录单片机_mac实现烧写51单片机
  12. matlab cplex使用
  13. AQS队列到底是什么?
  14. 什么输入法对计算机英语,电脑怎么把英文输入法设置为默认输入法
  15. 计算机无法识别fat32,电脑无法识别USB设备的原因及处理方法
  16. 《Effective Modern C++》Item 6: Use the explicitly typed initializer idiom when auto deduces undesired
  17. Linux内核编译——Uboot
  18. idea-debugger调试模式
  19. pytorch之词嵌入(三)
  20. 代理服务器介绍及种类划分

热门文章

  1. java, c 亦或用法
  2. involution:比卷积、自注意力机制更好的神经网络新算子
  3. 【DS实践 | Coursera】Assignment3 | Introduction to Data Science in Python
  4. 从顶会层面看科研!计算机顶级会议大盘点!
  5. 连锁定位(Linkage Mapping)与关联定位(Association Mapping)
  6. html 设置元素向左浮动
  7. python 百度搜索结果 浏览器 和终端不一致_python自动爬取百度搜索结果
  8. python解析MNIST数据集(IDX格式)
  9. 数学建模--综合评价方法
  10. 2022年初级会计考试综合试题及答案