Git核心概念
2023-09-11 14:18:08 时间
Git作为流行的分布式版本管理系统,用好它要理解下面几个核心的概念。
1、Git保寸的是文件完整快照,而不是差异变化或者文件补丁。每次提交若文件有变化则会指向上一个版本的指针而不重复生成副本。
Git最适合保存文本文件,事实上Git就是被设计出来就是为了保存文本文件的,像各种语言的源代码,因为Git可以对文本文件进行很好的压缩和差异分析(大家都见识过了,Git的差异分析可以精确到你添加或者删除了某个字母)。而二进制文件像视频,图片等,Git也能管理,但不能取得较好的效果(压缩比率低,不能差异分析)。实验证明,一个 500k 的文本文件经Git压缩后仅 50k 左右,稍微改变内容后两次提交,会有两个 50k 左右的文件,没错的,保存的是完整快照。而对于二进制文件,像视频,图片,压缩率非常小, Git 占用空间几乎随着提交次数线性增长。
2、Git工程有三个工作区域:工作目录,暂存区域,以及本地仓库。
工作目录是你当前进行工作的区域;暂存区域是你运行git add
命令后文件保存的区域,也是下次提交将要保存的文件(注意:Git 提交实际读取的是暂存区域的内容,而与工作区域的文件无关,这也是当你修改了文件之后,如果没有添加git add
到暂存区域,并不会保存到版本库的原因);本地仓库就是版本库,记录了你工程某次提交的完整状态和内容,这意味着你的数据永远不会丢失。
文件也有三种状态:已提交(committed),已修改(modified)和已暂存(staged)。已提交表示该文件已经被安全地保存在本地版本库中了;已修改表示修改了某个文件,但还没有提交保存;已暂存表示把已修改的文件放在下次提交时要保存的清单中,即暂存区域。
- 图中左侧为工作区,右侧为版本库。在版本库中标记为 “index” 的区域是暂存区(stage, index),标记为 “master” 的是 master 分支所代表的目录树。
- 图中我们可以看出此时 “HEAD” 实际是指向 master 分支的一个“游标”。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。
- 图中的 objects 标识的区域为 Git 的对象库,实际位于 “.git/objects” 目录下,我们会在后面的章节重点介绍。
- 当对工作区修改(或新增)的文件执行 “git add” 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID 被记录在暂存区的文件索引中。
- 当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
- 当执行 “git reset HEAD” 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
- 当执行 “git rm –cached <file>” 命令时,会直接从暂存区删除文件,工作区则不做出改变。
- 当执行 “git checkout .” 或者 “git checkout — <file>” 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。
- 当执行 “git checkout HEAD .” 或者 “git checkout HEAD <file>” 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改 动。
3、为什么会有缓存区?
- 为了能够实现部分提交
- 为了不再工作区创建状态文件、会污染工作区。
- 暂存区记录文件的修改时间等信息,提高文件比较的效率。
相关文章
- Git学习环境搭建和git对用户的增删改查命令
- GIT_SSH C:Program FilesGitsetup.ini
- 从概念开始教你写出一个测试计划
- 【线性代数】范数(norm)ML 中范数相关概念与应用
- Hudi-核心概念(时间轴、文件管理、索引)
- ZooKeeper-znode概念与使用
- ios多线程操作(四)—— GCD核心概念
- 数仓建模—数据领域常见概念与职位划分
- Git:CentOS7安装git客户端,make: *** [configure] 错误 127
- 云堡垒机相关概念汇总说明
- 从零开始入门 K8s| 阿里技术专家详解 K8s 核心概念
- 【数据结构】树的概念及结构
- (数据科学学习手札141)利用Learn Git Branching轻松学习git常用操作
- vscode Git:failed to execute git
- 线程概念的外延 Threading Terminology-What Are Threads
- 串口通讯(上)——基础概念
- 机器人冗余自由度优化过程中的零空间概念
- 【Git初探】Git中fatal: Not a git repository (or any of the parent directories): .git错误的解决办法
- 史上最全: svn与git的对照(二):svn与git的相关概念
- git报错:Reinitialized existing Git repository in ...解决方法
- Git - 使用BitBucket和SourceTree进行源代码管理遇到POST git-receive-pack (chunked)