跳转至

第2章 Git(导学)

2.1 诞生背景

Git 属于分散型版本管理系统,是为版本管理而设计的软件。

Git is a free and open source distributed version control system designed to handle everythingfrom small to very large projects with speed and efficiency.

Linux 的创始人 Linus Torvalds 在 2005 年开发了 Git 的原型程序。当时,由于在 Linux 内核开发中使用的既有版本管理系统的开发方许可证发生了变更,为了更换新的版本管理系统,Torvalds 开发了 Git。

2.2 什么是版本管理

版本管理就是管理更新的历史记录。它为我们提供了一些在软件开发过程中必不可少的功能,例如记录一款软件添加或更改源代码的过程,回滚到特定阶段,恢复误删除的文件等。

本地版本控制

代表工具:RCS

最初的方式:通过本地赋值文件夹,来完成版本控制,一般通过不同的文件名来区分版本。

基本原理: 本地保存所有变更的补丁集,可以理解成就是所有Diff,通过这些补丁,我们可以计算出每个版本的实际的文件内容。

缺点:

​ RCS 这种本地版本控制存在最致命的缺陷就是只能生本地使用,无法进行团队协作,因此使用的场景非常有限,因此衍生出了集中式版本控制。

集中型

代表工具:SVN

基本原理:

  1. 提供一个远端服务来保存文件,所有用户的提交都提交到该服务器中
  2. 增量保存每次提交的 Diff,如果提交的增量中和远端现存的文件存在冲突,则需要本地提前解决冲突

优点:

  1. 学习简单,更容易操作
  2. 支持二进制文件,对大文件支持更友好
  3. 便于管理

缺点:

  1. 本地不存储版本管理的概念,所有提交都只能联上服务器后才可以提交
  2. 分支上的支持不够好,对于大型项目团队合作比较困难
  3. 用户本地不保存所有版本的代码,如果服务端故障容易导致历史版本的丢失

image-20241218103504626

分散型

代表性工具:Git 基本原理:

  1. 每个库都存有完整的提交历史,可以直接在本地进行代码提交
  2. 每次提交记录的都是完整的文件快照,而不是记录增量
  3. 通过 Push 等操作来完成和远端代码的同步

优点:

  1. 分布式开发,每个库都是完整的提交历史,支持本地提交,强调个体
  2. 分支管理功能强大,方便团队合作,多人协同开发
  3. 校验和机制保证完整性,一般只添加数据,很少执行删除操作,不容易导致代码丢失

缺点:

  1. 相对 SVN 更复杂,学习成本更高
  2. 对于大文件的支持不是特别好(git-lfs 工具可以弥补这个功能)

**分散型**拥有多个仓库,相对而言稍显复杂。不过,由于本地的开发环境中就有仓库,所以开发者不必连接远程仓库就可以进行开发。

图中只显示了一般的使用流程。实际上,所有仓库之间都可以进行push 和 pull。即便不通过 GitHub,开发者 A 也可以直接向开发者 B 的仓库进行 push 或 pull。因此在使用前如果不事先制定规范,初学者往往会搞不清最新的源代码保存在哪里,导致开发失去控制。

image-20241218103625450

2.3 使用

需要安装git

打开Git Bash,从名字中带有 Bash 就不难猜到,Git Bash 中照搬了许多 Bash 命令,习惯 Linux 的人用起来会感觉比 Windows 命令提示符更得心应手。

首先来设置使用 Git 时的姓名和邮箱地址。名字请用英文输入。

$ git config --global user.name "Firstname Lastname"
$ git config --global user.email "your_email@example.com"

这个命令,会在“~/.gitconfig”中以如下形式输出设置文件。

[user]
 name = Firstname Lastname
 email = your_email@example.com

配置文件的存储路径

  1. 仓库级的配置文件:在仓库的 .git/.gitconfig,该配置文件只对所在的仓库有效。
  2. 全局配置文件:Mac 系统在 ~/.gitconfig,Windows 系统在 C:Users<用户名>.gitconfig。
  3. 系统级的配置文件:在 Git 的安装目录下(Mac 系统下安装目录在 /usr/local/git)的 etc 文件夹中的.gitconfig。

提高命令输出的可读性

$ git config --global color.ui auto
[color]
 ui = auto

这样一来,各种命令的输出就会变得更容易分辨,提高可读性。