《Git的正确使用姿势与最佳实践》课堂笔记 | 青训营笔记

199 阅读7分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第二篇笔记

为什么要学习Git

01.png

02.png

1,Git是什么

1.1 版本控制

Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。

Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。

03.png

版本控制最主要的功能就是追踪文件的变更。它将什么时候、什么人更改了文件的什么内容等信息忠实地了记录下来。每一次文件的改变,文件的版本号都将增加。除了记录版本变更外,版本控制的另一个重要功能是并行开发。往往是多人协同作业,版本控制可以有效地解决版本的同步以及不同开发者之间的开发通信问题,提高协同开发的效率。并行开发中最常见的不同版本软件的错误(Bug)修正问题也可以通过版本控制中分支与合并的方法有效地解决。

04.png

1.1.1 本地版本控制

05.png

1.1.2 集中版本控制

06.png

1.1.3 分布式版本控制

07.png

1.2 Git发展历史

git是由谁发明的?

git是由Linus发明的,基于C语言的;

在当时是为了解决什么样的历史问题?

谈及这个问题就不得不提起另一个伟大的工具linux,在2002年以前呀,这个工具的维护研发是由世界各地的程序员共同参与的,他们写出来的代码全部都交给Linus去合并的。 时间节点来到了2002年,这时候经过了十多年的发展参与的人是越来越多了,而一个人合并难以避免的就是效率低这也直接引起了维护者们的不满;

其实在当时已经存在一些版本控制的工具的了,像cvs,svn等,但是这些工具都是要收费的,而且使用的还是集中式版本管理方式。这就受到了Linus的唾弃; 后来Linus选择了BitKeeper分布式版本控制工具作为他们的版本管理工具,这个系统的研发公司也是出于人道博爱的精神给他们免费使用了;

有一天团队里面的一个人就想着破解BitKeeper的协议呀,当时也是被它的研发公司发现了,他们就收回了给他们的使用权;之后就是Linus被迫自己花了两个礼拜时间用C写了git这个伟大的分布式版本控制工具;

所以git的产生就是为了解决团队开发效率问题以及开发版本的管理的;

3.第二个问题提到的分布式和集中式有什么区别?

集中式:拥有一台中央处理服务器,每个电脑处理前都需要连接中央处理服务器去拉取一个版本库,改完再推回去;

分布式:去中心化,没有中央处理服务器,每个人的电脑都是完整的一个版本库,每个电脑都是独立连接的;

08.png

每个平台都有自己的使用场景和优势,要选择适合自己需求的平台。

2,Git的基本使用方式

09.png

10.png

11.png

  • 图中左侧为工作区,右侧为版本库。在版本库中标记为 "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配置

12.png

2.2 Git Remote

13.png

14.png

2.2.1 HTTP Remote

15.png

2.2.2 SSH Remote

16.png

2.3 Git Add

这部分关注Git命令的原理

17.png

该命令把文件加入暂存区,tree命令得到的目录中新增加的内容为readme中的内容,且进行了加密。

2.4 Git Commit

18.png

tree命令得到的目录中新增加的内容为readme的目录树信息和commit操作的信息,且对其进行了加密。

2.5 Objects

19.png

20.png

21.png

2.6 Refs

22.png

23.png

2.7 Annotation Tag

24.png

2.8 追溯历史版本

25.png

26.png

2.9 修改历史版本

27.png

28.png

2.10 Objects

29.png

悬空的Object可以通过Git GC命令来删除

2.11 Git GC

30.png

2.12 完整的Git视图

31.png

2.13 Git Clone & Fetch

32.png

2.14 Git Push

33.png

3,Git研发流程

主要讲解如何使用Git进行团队合作

3.1 不同的工作流

34.png

3.2 集中式工作流

35.png

3.2.1 集中式工作流-Gerrit

36.png

在Android​平台表现比较好,适合的场景有限

37.png

3.3 分支管理工作流

38.png

3.3.1 分支管理工作流-GitFlow

39.png

3.3.2 分支管理工作流-Github Flow

40.png

41.png

42.png

3.3.3 分支管理工作流-Gitlib Flow

43.png

3.4 代码合并

44.png

45.png

3.5 如何选择合适的工作流

46.png

常见问题

47.png