目录
1.什么是git?
2.git的基本使用?
3.git的研发流程?
1. 什么是git?
Git 是一个开源的分布式版本控制系统,用于跟踪文件和目录的更改。它最初由 Linus Torvalds 创建,目的是为了更好地管理 Linux 内核的开发。
为什么需要学习git?
版本控制
RCS(Revision Control System)是一种本地版本控制系统,主要用于管理文件的版本历史。它允许用户跟踪文件的更改,并在需要时恢复到之前的版本。RCS 是最早出现的版本控制系统之一,虽然它的功能相对简单,但在某些场景下仍然非常有用。4
RCS(Revision Control System)的基本原理是通过存储文件的版本历史,允许用户跟踪文件的更改,并在需要时恢复到之前的版本。
SVN(Subversion)是一个集中式的版本控制系统,广泛用于企业环境中,用于管理文件和目录的版本历史。
SVN 的基本原理是通过集中式仓库管理文件和目录的版本历史,使用修订号标识每个版本,提供提交、更新、分支、标签、冲突解决等功能。SVN 的集中式模型适合需要严格控制代码库的企业环境,其细粒度的访问控制和强大的权限管理机制确保了仓库的安全性和一致性。尽管 SVN 的功能相对集中式,但在某些场景下仍然非常有用,尤其是在大型项目和企业级开发中。
Git是一种分布式版本控制系统,它允许每个开发者在本地拥有完整的代码仓库副本,包括所有的历史记录和分支。这种设计使得Git在灵活性、性能和功能上都优于传统的集中式版本控制系统(如SVN)。
2. git的基本使用
在使用Git进行版本控制时,.git
目录是一个非常重要的组成部分。它存储了Git仓库的所有元数据和对象,是Git能够正常工作的基础。以下是.git
目录的详细介绍:
.git
目录结构
当你在项目中初始化Git仓库(使用git init
命令)时,Git会在项目根目录下创建一个名为.git
的隐藏目录。这个目录包含了以下主要文件和子目录:
1. objects
-
功能:存储Git仓库中的所有对象(包括blob、tree和commit对象)。
-
内容:
-
每个对象都有一个唯一的SHA-1哈希值,对象以文件形式存储在
objects
目录中。 -
对象文件被组织在两个层级的目录结构中,第一级是哈希值的前两位,第二级是哈希值的剩余部分。
-
例如,对象
a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6
会被存储在objects/a1/b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6
。
-
2. refs
-
功能:存储引用(references),包括分支、标签等。
-
内容:
-
heads
:存储分支引用,每个分支对应一个文件,文件名是分支名,文件内容是该分支指向的提交对象的哈希值。 -
tags
:存储标签引用,每个标签对应一个文件,文件名是标签名,文件内容是该标签指向的提交对象的哈希值。 -
remotes
:存储远程分支的引用,每个远程仓库对应一个目录,目录中存储远程分支的引用。
-
3. HEAD
-
功能:指向当前分支或提交。
-
内容:
-
如果当前处于某个分支,
HEAD
是一个符号链接,指向refs/heads/branch_name
。 -
如果当前处于分离头(detached HEAD)状态,
HEAD
直接存储当前提交的哈希值。
-
4. index
-
功能:暂存区(staging area),存储即将提交的文件的快照。
-
内容:
-
index
文件记录了暂存区中文件的状态,包括文件名、文件内容的哈希值等。 -
当你使用
git add
命令时,文件的内容会被写入objects
目录,文件的元数据会被写入index
文件。
-
5. config
-
功能:存储Git仓库的配置信息。
-
内容:
-
包括仓库的全局配置(如用户名、邮箱)、分支配置、远程仓库配置等。
-
你可以通过
git config
命令修改这些配置。
-
6. hooks
-
功能:存储Git钩子脚本。
-
内容:
-
钩子脚本是一些在特定事件发生时自动执行的脚本,如
pre-commit
、post-commit
、pre-push
等。 -
默认情况下,这些脚本是示例脚本,需要你手动启用。
-
7. logs
-
功能:存储仓库的日志信息。
-
内容:
-
HEAD
:记录HEAD
的变化历史,包括分支切换、提交等操作。 -
refs
:记录分支和标签的变化历史,每个分支和标签对应一个日志文件。
-
8. info
-
功能:存储仓库的一些额外信息。
-
内容:
-
exclude
:存储全局忽略文件的路径,类似于.gitignore
文件。
-
9. modules
-
功能:存储子模块(submodule)的信息。
-
内容:
-
如果仓库中包含子模块,每个子模块对应一个目录,目录中存储子模块的元数据和对象。
-
.git
目录的作用
-
存储版本数据:
-
.git/objects
目录存储了所有版本对象,包括文件内容(blob)、目录结构(tree)和提交历史(commit)。
-
-
管理分支和标签:
-
.git/refs
目录存储了分支和标签的引用,通过这些引用可以快速定位到特定的提交。
-
-
暂存区管理:
-
.git/index
文件记录了暂存区的状态,是git add
和git commit
操作的核心。
-
-
配置管理:
-
.git/config
文件存储了仓库的配置信息,包括用户信息、分支配置等。
-
-
日志记录:
-
.git/logs
目录记录了HEAD
和引用的变化历史,方便追踪操作记录。
-
-
钩子脚本:
-
.git/hooks
目录存储了Git钩子脚本,可以在特定事件发生时执行自定义操作。
-
注意事项
-
不要手动修改
.git
目录:-
虽然
.git
目录中的文件和目录是文本格式,但手动修改可能会导致仓库损坏。建议通过Git命令进行操作。
-
-
备份
.git
目录:-
如果需要备份Git仓库,只需备份
.git
目录即可,因为所有版本信息都存储在其中。
-
-
隐藏
.git
目录:-
.git
目录是一个隐藏目录,通常不会显示在文件浏览器中。如果需要查看,可以使用命令行工具(如ls -a
)。
-
通过了解.git
目录的结构和作用,你可以更好地理解Git的工作原理,从而更高效地使用Git进行版本控制。
Git配置
Git配置分为三个级别:系统级、全局级和本地级。每个级别都有其特定的作用范围和配置文件存储位置。
系统级配置(System Level)
-
作用范围:适用于系统上的所有用户和仓库。
-
配置文件位置:通常位于
/etc/gitconfig
。 -
设置方法:使用
git config --system <key> <value>
命令。 -
示例:设置系统级的默认编辑器为
nano
:git config --system core.editor "nano"
全局级配置(Global Level)
-
作用范围:适用于当前用户的所有仓库。
-
配置文件位置:通常位于用户主目录下的
~/.gitconfig
或~/.config/git/config
。 -
设置方法:使用
git config --global <key> <value>
命令。 -
示例:设置全局的用户名和邮箱:
git config --global user.name "Your Name" git config --global user.email "your.email@example.com"
本地级配置(Local Level)
-
作用范围:仅适用于当前仓库。
-
配置文件位置:位于仓库的
.git/config
文件中。 -
设置方法:使用
git config --local <key> <value>
命令,或者直接在仓库目录下使用git config <key> <value>
。 -
示例:为当前仓库设置用户名:
git config --local user.name "Your Name"
配置优先级
Git配置的优先级顺序为:本地级 > 全局级 > 系统级。这意味着如果同一配置在不同级别中都存在,本地级的配置会覆盖全局级和系统级的设置。