这是我参与「第三届青训营 -后端场」笔记创作活动的第二篇笔记
为什么要学习Git
1,Git是什么
1.1 版本控制
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。
版本控制最主要的功能就是追踪文件的变更。它将什么时候、什么人更改了文件的什么内容等信息忠实地了记录下来。每一次文件的改变,文件的版本号都将增加。除了记录版本变更外,版本控制的另一个重要功能是并行开发。往往是多人协同作业,版本控制可以有效地解决版本的同步以及不同开发者之间的开发通信问题,提高协同开发的效率。并行开发中最常见的不同版本软件的错误(Bug)修正问题也可以通过版本控制中分支与合并的方法有效地解决。
1.1.1 本地版本控制
1.1.2 集中版本控制
1.1.3 分布式版本控制
1.2 Git发展历史
git是由谁发明的?
git是由Linus发明的,基于C语言的;
在当时是为了解决什么样的历史问题?
谈及这个问题就不得不提起另一个伟大的工具linux,在2002年以前呀,这个工具的维护研发是由世界各地的程序员共同参与的,他们写出来的代码全部都交给Linus去合并的。 时间节点来到了2002年,这时候经过了十多年的发展参与的人是越来越多了,而一个人合并难以避免的就是效率低这也直接引起了维护者们的不满;
其实在当时已经存在一些版本控制的工具的了,像cvs,svn等,但是这些工具都是要收费的,而且使用的还是集中式版本管理方式。这就受到了Linus的唾弃; 后来Linus选择了BitKeeper分布式版本控制工具作为他们的版本管理工具,这个系统的研发公司也是出于人道博爱的精神给他们免费使用了;
有一天团队里面的一个人就想着破解BitKeeper的协议呀,当时也是被它的研发公司发现了,他们就收回了给他们的使用权;之后就是Linus被迫自己花了两个礼拜时间用C写了git这个伟大的分布式版本控制工具;
所以git的产生就是为了解决团队开发效率问题以及开发版本的管理的;
3.第二个问题提到的分布式和集中式有什么区别?
集中式:拥有一台中央处理服务器,每个电脑处理前都需要连接中央处理服务器去拉取一个版本库,改完再推回去;
分布式:去中心化,没有中央处理服务器,每个人的电脑都是完整的一个版本库,每个电脑都是独立连接的;
每个平台都有自己的使用场景和优势,要选择适合自己需求的平台。
2,Git的基本使用方式
- 图中左侧为工作区,右侧为版本库。在版本库中标记为 "index" 的区域是暂存区(stage/index),标记为 "master" 的是 master 分支所代表的目录树。
- 图中我们可以看出此时 "HEAD" 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。
- 图中的 objects 标识的区域为 Git 的对象库,实际位于 ".git/objects" 目录下,里面包含了创建的各种对象及内容。
- 当对工作区修改(或新增)的文件执行 git add 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
- 当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
- 当执行 git reset HEAD 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
- 当执行 git rm --cached 命令时,会直接从暂存区删除文件,工作区则不做出改变。
- 当执行 git checkout . 或者 git checkout -- 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区中的改动。
- 当执行 git checkout HEAD . 或者 git checkout HEAD 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。(注:以上内容来自git菜鸟教程,链接如下:Git 工作区、暂存区和版本库 | 菜鸟教程 (runoob.com))
2.1.1 Git Config
Git 提供了一个叫做 git config 的工具,专门用来配置或读取相应的工作环境变量。
这些环境变量,决定了 Git 在各个环节的具体工作方式和行为。这些变量可以存放在以下三个不同的地方:
/etc/gitconfig文件:系统中对所有用户都普遍适用的配置。若使用git config时用--system选项,读写的就是这个文件。~/.gitconfig文件:用户目录下的配置文件只适用于该用户。若使用git config时用--global选项,读写的就是这个文件。- 当前项目的 Git 目录中的配置文件(也就是工作目录中的
.git/config文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以.git/config里的配置会覆盖/etc/gitconfig中的同名变量。
在 Windows 系统上,Git 会找寻用户主目录下的 .gitconfig 文件。
每个级别的配置可能重复,但是低级别的配置会覆盖高级别的配置。
2.1.2 常见的Git配置
2.2 Git Remote
2.2.1 HTTP Remote
2.2.2 SSH Remote
2.3 Git Add
这部分关注Git命令的原理
该命令把文件加入暂存区,tree命令得到的目录中新增加的内容为readme中的内容,且进行了加密。
2.4 Git Commit
tree命令得到的目录中新增加的内容为readme的目录树信息和commit操作的信息,且对其进行了加密。
2.5 Objects
2.6 Refs
2.7 Annotation Tag
2.8 追溯历史版本
2.9 修改历史版本
2.10 Objects
悬空的Object可以通过Git GC命令来删除
2.11 Git GC
2.12 完整的Git视图
2.13 Git Clone & Fetch
2.14 Git Push
3,Git研发流程
主要讲解如何使用Git进行团队合作
3.1 不同的工作流
3.2 集中式工作流
3.2.1 集中式工作流-Gerrit
在Android平台表现比较好,适合的场景有限