Git 概述

Post on Jan 01, 2022 by Wei Lin

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仓库中存在,并且没有发生任何变化,即无更新,也没有待暂存和待提交的修改。

image-20230727231920832


(2) Untracked(未跟踪)

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

image-20230727231954774


(3) Staged(已暂存)

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

image-20230727232014227


(4) Modified(已修改)

这表示文件在Git仓库中存在,但在最后一次提交后发生了变化。

之后可使用git add提交到暂存区。

image-20230727232037550


(5) Deleted(已删除)

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

image-20230727232054535

文件作用

.git下文件作用简述

参考:Git 钩子 hook 介绍与使用


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

image-20230727232237456


文件夹&文件 说明
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