Git概述
Git介绍
Git是一种分布式版本控制系统,它用于跟踪和管理软件开发项目中的代码变更。由于Git的灵活性、高效性和强大的功能,它已成为最受欢迎的版本控制系统之一。
以下是Git的一些关键特点和概述:
(1) 分布式版本控制
Git是一种分布式版本控制系统,意味着每个开发者都有完整的代码仓库副本,可以在本地进行代码管理和提交。这使得Git在网络不稳定或无法连接到中央服务器时也可以继续工作。
(2) 高效性
Git是一种快速高效的版本控制系统。它使用哈希算法来管理数据和快照,可以高效地处理大型代码库和提交历史。
(3) 分支管理
Git的分支管理是其一个重要特性。开发者可以轻松地创建、合并、删除分支,从而支持并行开发和特性隔离。
(4) 版本控制
Git可以跟踪代码文件的每次变更,形成版本历史。开发者可以随时查看历史提交,回退到以前的版本,甚至比较不同版本之间的差异。
(5) 远程协作
Git支持多人协作开发。开发者可以将本地分支与远程仓库进行同步,共享代码变更,以及协同解决冲突。
(6) 开源
Git是一种开源软件,它的源代码可以被公开查看和使用。这也促进了Git社区的成长和贡献。
Git被广泛用于软件开发和其他领域的版本控制需求。它为团队协作、代码管理和版本控制提供了强大的工具,成为现代软件开发的重要基石。
Git原理
Git的核心原理是分布式版本控制系统,它以高效的方式跟踪和管理代码变更。其原理是建立在快照、分布式存储、分支管理和哈希验证等核心概念上的。这些原理使得Git成为一个强大、高效和灵活的版本控制系统,广泛用于软件开发和其他领域。
(1) 版本控制和快照
Git以文件的快照方式来存储代码,而不是保存文件的差异或增量。每次提交代码时,Git会创建一个代码库的快照,并记录该快照与上一次提交之间的差异。这种方式保证了高效的存储和查找,并支持快速的回滚和版本对比。
(2) 分布式存储
每个开发者都拥有完整的Git仓库副本,包含完整的历史记录和分支信息。这使得Git成为分布式版本控制系统,开发者可以在本地进行提交、分支管理和版本控制,而不需要连接到中央服务器。
(3) 分支管理
Git鼓励开发者频繁地使用分支。每次创建分支时,Git只会复制一个指向当前分支的指针,而不是复制整个代码库。这使得分支操作非常快速和高效。
(4) 哈希和数据完整性
Git使用SHA-1哈希算法来生成数据的唯一标识符。所有数据都以其哈希值存储,并且Git使用哈希值来验证数据完整性。这确保了在Git中的所有数据都是不可变的,一旦提交,就不会被更改。
(5) 提交和提交历史
每次代码变更都需要进行提交。每次提交都包含有关该变更的详细信息,例如作者、时间戳和提交消息。这些提交形成了一个完整的提交历史,可以回溯整个项目的发展过程。
(6) 远程协作
Git支持多人协作开发。开发者可以将本地代码库与远程仓库同步,共享代码变更,并协同解决冲突。
基本概念
Git分区
关于git整体操作流程,里面主要涉及了四个关键部分。
(1) workspace工作区
就是我们本地电脑写代码、存放项目文件的地方。
(2) index/stage暂存区
需要注意的是当我们在使用git管理项目文件时,在我们本地项目文件中会多出一个隐藏.git文件夹,我们称这个隐藏的文件夹为版本库,通常是通过git add提交指令来进行暂存的。
(3) repository本地仓库
通常使用git commit提交命令将暂存区中的文件添加到本地仓库中。
(4) remote远程仓库
从字面意思来理解就是存放在远程git仓库上的,比如我们可以放在gitHub、gitLab等上面。
文件状态
在Git中,文件有不同的状态,用于标识文件在版本控制系统中的状态。使用git status命令可以查看当前工作目录下文件的状态。在输出结果中,Git会以不同的颜色和状态标识每个文件的状态。
常见的文件状态有以下几种:
(1) Unmodified(未修改)
这表示文件在Git仓库中存在,并且没有发生任何变化,即无更新,也没有待暂存和待提交的修改。

(2) Untracked(未跟踪)
这表示文件在Git仓库中尚未被跟踪,即Git还没有开始追踪该文件的变化,是新添加的文件。

(3) Staged(已暂存)
这表示文件已经被添加到Git的暂存区,准备提交到仓库中。

(4) Modified(已修改)
这表示文件在Git仓库中存在,但在最后一次提交后发生了变化。
之后可使用git add提交到暂存区。

(5) Deleted(已删除)
这表示文件已经从Git仓库中删除,即在上一次提交之后被删除。

文件作用
.git下文件作用简述
.git文件夹是git init后在当前目录生成的一个管理git仓库的文件夹。它是Git版本控制系统用来存储版本信息的目录,它包含了Git仓库的所有内容,包括代码、历史记录、分支、标签等。如下图:

| 文件夹&文件 | 说明 |
|---|---|
| hooks目录 | 包含了Git的钩子脚本,存放一些shell脚本,用于在特定的Git操作(如提交、合并等)前后执行自定义的脚本。 |
| Info目录 | exclude文件:存放仓库的一些信息 |
| logs目录 | 用于存储提交记录的日志信息,包括每个提交的作者、时间、提交信息等。 |
| objects目录 | 包含了Git仓库中的所有对象,如提交记录、分支、标签等。 |
| refs目录 | 包含了所有的引用,如分支、标签等。其中: heads目录:存储了所有的分支引用; remote目录:存储远程分支的引用,其中子目录的名称就是远程仓库的名称; tags目录:存储了所有的标签引用。 |
| COMMIT_EDITMSG文件 | 用于存储提交消息的临时文件。在进行Git提交(git commit)时,会弹出一个文本编辑器,让你输入提交消息。COMMIT_EDITMSG文件就是用来保存你输入的提交消息内容,之后这个临时文件会被清空。 |
| config文件 | Git仓库的配置文件,用于配置Git的行为,包括用户信息、颜色设置、别名等。 |
| description文件 | 是一个简单的描述文件,用于存储仓库的描述信息。主要给gitweb等git托管系统使用 |
| HEAD文件 | 是一个指向当前分支或提交的指针,用于记录当前工作目录所在的版本。 |
| index文件 | 暂存区的索引文件,也称为缓存,用于管理工作目录中文件与下一次提交的变更之间的状态。 |
| ORIG_HEAD文件 | 是一个引用,用于保存上一次HEAD指向的位置 |
| packed-refs文件 | 用于存储引用(References)的列表。引用是指向提交(Commit)、分支(Branch)、标签(Tag)等Git对象的指针,通过引用,Git可以追踪和管理代码库中的不同版本和分支。 |
.gitignore文件
在该文件中列举出不希望被git记录的文件,通常是一些代码编译的生成文件。
(1) .gitignore的优先级
在 .gitingore 文件中,每一行指定一个忽略规则,Git检查忽略规则的时候有多个来源,它的优先级如下(由高到低):
- 从命令行中读取可用的忽略规则;
- 当前目录定义的规则;
- 父级目录定义的规则,依次递推;
- $GIT_DIR/info/exclude 文件中定义的全局规则
- core.excludesfile中定义的全局规则
(2) .gitignore匹配语法
| 符号 | 作用 |
|---|---|
| # | 表示注释 |
| / | 以”/”开头表示目录; 以”/”结束的模式只匹配文件夹以及在该文件夹路径下的内容,但是不匹配同名文件; 如果不包含”/”,则匹配.gitignore 文件当前目录下的内容 |
| * | 一个”*“通配多个字符,即匹配多个任意字符; 两个”” 表示匹配任意中间目录,比如”a//z”可以匹配 a/z, a/b/z 或 a/b/c/z等。 |
| ? | ”?”匹配一个任意字符 |
| [] | ”[]”中包含单个字符的匹配列表。 如[abc]表示要么匹配一个a,要么匹配一个b,要么匹配一个c; [0-9]表示匹配所有0到9的数字; [a-z]表示匹配任意的小写字母。 |
| ! | ”!”表示不忽略匹配到的文件或目录。如”!.txt”表示不忽略后缀为txt的文件。 “!”开头的模式如果在前面被排除,那么该文件将会再次被包含。如”.txt” “!a.txt”忽略所有.txt文件,但a.txt除外; 如果文件的父目录已经被前面的规则排除掉了,那么对这个文件即使使用”!”也不会再次被包含; “!”可以使用反斜杠进行转义。 |
注意:git对于.ignore配置文件是按行从上到下进行规则匹配的,意味着如果前面的规则匹配的范围更大,则后面的规则将不会生效。
(3) 常用项目模板
git提供了不同项目的模板,地址:https://github.com/github/gitignore