Git

概述

参考:

Git 是一个免费的开源分布式版本控制系统,旨在快速高效地处理从小型到大型项目的所有内容。

Git 易于学习,占地面积小,具有闪电般的快速性能。它具有廉价的本地分支,方便的暂存区域和多个工作流等功能,其性能优于 Subversion,CVS,Perforce 和 ClearCase 等 SCM 工具。

Git 优势

Git 是一个分布式代码管理工具,在讨论分布式之前避免不了提及一下什么是中央式代码管理仓库:

  • 中央式:所有的代码保存在中央服务器,所以提交必须依赖网络,并且每次提交都会带入到中央仓库,如果是协同开发可能频繁触发代码合并,进而增加提交的成本和代价。最典型的就是 SVN。
  • 分布式:可以在本地提交,不需要依赖网络,并且会将每次提交自动备份到本地。每个开发者都可以把远程仓库 clone 一份到本地,并会把提交历史一并拿过来。代表就是 Git。

[!Tip] 我们可以使用 git CLI 的 remote 命令创建多个中央仓库(也称为远程仓库),以便将项目代码在多个仓库之间同步

那 Git 相比于 SVN 有什么优势呢?打个比方:“巴拉巴拉写了一大堆代码,突然发现写的有问题,我想回到一个小时之前”,对于这种情况 Git 的优势就很明显了,因为 commit 的成本比较小并且本地会保存所有的提交记录,随时随刻可以进行回退。在这并不是说 SVN 的不能完成这种操作,只是 Git 的回退会显得更加的优雅。Git 相比于中央式工具还有很多优点,就不一一列举了

Git 文件状态

在 Git 中文件大概分为三种状态:

  • modified(修改) # Git 可以感知到工作目录中哪些文件被修改了,然后把修改的文件加入到 modified 区域
  • staged(暂存) # 通过 add 命令将工作目录中修改的文件提交到暂存区,等候被 commit
  • committed(提交) # 将暂存区文件 commit 至 Git 目录中永久保存

commit 节点

为了便于表述,本篇文章我会通过节点代称 commit 提交。

在 Git 中每次提交都会生成一个节点,而每个节点都会有一个哈希值作为唯一标示,多次提交会形成一个线性节点链(不考虑 merge 的情况),如图。

节点上方是通过 SHA1 计算的哈希值。

C2 节点包含 C1 提交内容,同样 C3 节点包含 C1、C2 提交内容。

HEAD

HEAD 是 Git 中非常重要的一个概念,你可以称它为指针或者引用,它可以指向任意一个节点,并且指向的节点始终为当前工作目录,换句话说就是当前工作目录(也就是你所看到的代码)就是 HEAD 指向的节点。

还以图 1 举例,如果 HEAD 指向 C2 那工作目录对应的就是 C2 节点。具体如何移动 HEAD 指向后面会讲到,此处不要纠结。

同时 HEAD 也可以指向一个分支,间接指向分支所指向的节点。

远程仓库

虽然 Git 会把代码以及历史保存在本地,但最终还是要提交到服务器上的远程仓库。通过 clone 命令可以把远程仓库的代码下载到本地,同时也会将提交历史、分支、HEAD 等状态一并同步到本地,但这些状态并不会实时更新,需要手动从远程仓库去拉取,至于何时拉、怎么拉后面章节会讲到。

通过远程仓库为中介,你可以和你的同事进行协同开发,开发完新功能后可以申请提交至远程仓库,同时也可以从远程仓库拉取你同事的代码。

注意点:因为你和你的同事都会以远程仓库的代码为基准,所以要时刻保证远程仓库的代码质量,切记不要将未经检验测试的代码提交至远程仓库。

分支

什么是分支?

分支也是 Git 中相当重要的一个概念,当一个分支指向一个节点时,当前节点的内容即是该分支的内容,它的概念和 HEAD 非常接近同样也可以视为指针或引用,不同的是分支可以存在多个,而 HEAD 只有一个。通常会根据功能或版本建立不同的分支。

那分支有什么用呢?

举个例子:你们的 App 经历了千辛万苦终于发布了 v1.0 版本,由于需求紧急 v1.0 上线之后便马不停蹄的开始 v1.1,正当你开发的兴起时,QA 同学说用户反馈了一些 bug,需要修复然后重新发版,修复 v1.0 肯定要基于 v1.0 的代码,可是你已经开发了一部分 v1.1 了,此时怎么搞?

面对上面的问题通过引入分支概念便可优雅的解决,如图 :

  • 先看左边示意图,假设 C2 节点既是 v1.0 版本代码,上线后在 C2 的基础上新建一个分支 ft-1.0
  • 再看右边示意图,在 v1.0 上线后可在 master 分支开发 v1.1 内容,收到 QA 同学反馈后提交 v1.1 代码生成节点 C3,随后切换到 ft-1.0 分支做 bug 修复,修复完成后提交代码生成节点 C4,然后再切换到 master 分支并合并 ft-1.0 分支,到此我们就解决了上面提出的问题

除此之外利用分支还可以做很多事情,比如现在有一个需求不确定要不要上线,但是得先做,此时可以单独创建一个分支开发该功能,等到啥时候需要上线直接合并到主分支即可。分支适用的场景很多就不一一列举了。

注意点:当在某个节点创建一个分支后,并不会把该节点对应的代码复制一份出来,只是将新分支指向该节点,因此可以很大程度减少空间上的开销。一定要记着不管是 HEAD 还是分支它们都只是引用而已,量级非常轻。

Git 安装

windows 版 git 安装完成后,git config –global core.autocrlf input 执行该命令让,git 在 pull 时不转换换行符为 CRLF,而在 push 时,所有 CRLF 转换为 LF。

也可通过 .gitconfig 配置文件进行修改 ,修改其中的 autocrlf = input 即可。

https://github.com/cssmagic/blog/issues/22

配置换行符官方文档:https://docs.github.com/cn/github/using-git/configuring-git-to-handle-line-endings

Git 关联文件与配置

~/.gitconfig # git 通用配置文件

~/.git-credentials # 登录后凭据的保存路径

gitconfig 配置内容与 git config –global 命令一一对应

比如:

# 执行如下命令
git config --global user.name "DesistDaydream"
# gitconfig 文件中生成如下内容
[user]
name = DesistDaydream

其中 user 配置环境标识,name 为该配置环境中的关键字。

${Project}/.git/ # 通过 Git 管理的项目的根目录下通常都有一个 .git/ 目录。


最后修改 March 25, 2025: clearup (feb59d93)