Git的工作原理

本文深入解析Git版本控制系统的原理及操作流程,介绍Git如何通过跟踪文件快照来管理项目版本,探讨工作目录、暂存区及本地仓库的概念,并解释Git对象(commit、tree和blob)的作用。

Git分层操作

        git的工作总共分四层,其中三层是在自己本地也就是说git仓库,包括了工作目录、暂存区和本地仓库。工作目录就是我们执行命令git init时所在的地方,也就是我们执行一切文件操作的地方;暂存区和本地仓库都是在.git目录下,因为它们只是用来存数据的。远程仓库在中心服务器,也就是我们做好工作之后推送到远程仓库,或者从远程仓库更新下来最新代码到本地。Git所存储的都是一系列的文件快照,然后git 来跟踪这些文件快照,发现哪个文件快照有变化他就会提示你需要添加到暂存区或是提交到本地仓库来保证你的工作目录是干净的。


         这个要怎么理解呢?git中的文件有两种状态,一种是被跟踪的,也就是提交到本地仓库的文件,因为本地仓库要保管它们当然要跟踪他们,对他们负责,还有一种就是未被跟踪的。那么当我们添加新的文件时,他不是被跟踪的,因为本地仓库里面没有这个文件,他是外来的,本地仓库目前还不需要对他们负责。但是如果是对仓库已经存在的文件进行修改,那么这些文件就是被跟踪的文件,就可以通过git status查看他们的状态来进行相应的操作。当然我们也可以生成一个.gitignore文件,里面指定要忽略的文件类型,然后这些文件就不会被跟踪,不管怎么改变他们,git status都不会提示你需要做什么操作。

        所以当我们在工作目录中进行文件操作后,要先添加到暂存区,然后再将暂存区中刚添加的文件快照提交到本地仓库,然后再将本地仓库的最新状态文件快照推送到远程仓库。这个文件快照其实就是各个文件在被添加到暂存区时的状态,就和照相的一样,留下每个不同时刻的快照,方便以后查询,而git存储的就是这些一系列的快照。说到这个快照就要说说git的对象了。


Git对象

     在.git-》Objects文件夹是一个个的git对象,是38位的哈希值,这样就意味着没有两个相同的对象名。



         从根本上讲,git是一套内容寻址的文件系统,它存储的也是key-value键值对,然后根据key值来查找value的,说到寻址就会想到指针吧,不错,git也是根据指针来寻址的,这些指针就存储在git的对象中。Git一共有四种对象,commit对象,tree对象和blob对象和tag对象,这里可以理解tag是commit的别名,下面便是这三个对象:



       每个目录都创建了“tree”对象, 每个文件都创建了一个对应的“blob”对象。最后有一个“commit”对象来指向根“tree”对象,这样我们就可以追踪项目每一项提交内容。

     

      这个blob对象对应的就是文件快照中那些发生变化的文件内容,而

      tree对象则记录了文件快照中各个目录和文件的结构关系,它指向了被跟踪的快照,

      commit对象则记录了每次提交到本地仓库的文件快照,

      从在开发过程中,我们会提交很多次文件快照,那么第一次提交的内容会用一个commit来记录,这个commit 没有指针指向上一个commit对象,因为没有上一个commit,他是第一个,当第二次提交时,又会有另外一个commit对象来记录,那么这次commit对象中就会有一个指针指向上一次提交后的commit对象,经过很多次提交后就会有很多的commit对象,它们组成了一个链表,当我们要恢复哪个版本的时候,只要找到这个commit对象就能恢复那个版本的文件。而我们所谓的HEAD对象其实就是指向最近一个提交的commit对象,也就是最后一个commit对象。


查看对象


          查看“blob”对象:git show + 对象名(SHA1哈希值)


          查看“tree”对象:git show + 对象名 / git ls-tree + 对象名


          查看“commit”对象:git show / git log + -s + --pretty=raw +对象名


          查看“tag”对象:git cat-file tag v1.5.0


git操作流程


在目录间进行操作的是git命令,其中git rm -f是移除某一个受跟踪的文件。


总结:git就是一个版本控制系统,一般有svn经验的人,稍微学习一下git就可以操作了。这些工具越熟练,对于我们的帮助越大。加油,祝好运

参考:

           廖雪峰Git教程

           码云帮助文档

           Git常见命令图解

           Git常用配置

            Git的四种对象

            Git从入门到熟悉

         【git常见问题】fatal: Not a valid object name: 'master'.

            Git从码云克隆到本地

            git bash不能复制粘贴

            git优势

### Git工作原理详解 Git 是一种分布式版本控制系统,其核心设计理念围绕着高效性和灵活性展开。以下是关于 Git 工作原理的一些重要概念和机制: #### 1. **Git 的核心结构** Git 不仅仅是一个简单的版本控制系统 (VCS),更像是一种小型文件系统[^1]。它的主要组成部分包括工作区、暂存区(Staging Area)、本地仓库以及远程仓库。 - **工作区**:开发者实际操作的目录,用于编辑源码。 - **暂存区**:位于 `.git` 隐藏目录中的 `index` 文件,记录即将提交到本地仓库的内容变化。 - **本地仓库**:存储项目的历史记录及其元数据的地方,通常通过命令如 `git init` 初始化创建。 - **远程仓库**:团队协作时使用的共享资源库,例如 GitHub 或者自建服务器上的代码托管服务[^5]。 #### 2. **Git 基本操作流程** 开发人员日常使用 Git 大致遵循如下模式: - 修改文件后执行 `git add` 将更改移至暂存区; - 使用 `git commit -m "message"` 提交这些改动并附带说明文字形成一个新的快照保存进历史记录里[^2];如果希望简化过程可以直接采用带有 `-a` 参数的一次性完成上述两步动作。 #### 3. **分支与合并策略** 为了支持多人并发开发需求,Git 设计了一套强大的分支管理系统。可以通过简单指令快速切换不同功能模块或者修复 bug 所需环境而不会互相干扰[^3]: - 创建新分支:`git checkout -b 新分支名` - 查阅现有分支列表:`git branch` - 转换回主干线上继续推进进度:`git checkout 主分支名称` - 整合已完成的任务成果回到主线之中去:`git merge 特定分支名字` #### 4. **内部工作机制——对象模型** 深入理解 Git 底层运作方式有助于更好地掌握如何有效利用该工具解决问题。每一个被跟踪的对象都会以特定形式存在於 object database 中,主要包括四种类型: - Blob 对象表示具体文件内容; - Tree 记录某个时刻整个目录树状态; - Commit 定义一次完整的提交行为连同关联信息一起打包起来供后续查阅分析之用; - Tag 可视为指向某次特别重要的提交的一个固定指针方便长期引用[^4]。 综上所述,通过对以上几个方面全面认识可以深刻体会到为什么说 Git 并不仅仅局限于传统意义上的版本控制器角色定位之上,而是具备更多可能性等待挖掘探索! ```python # 示例 Python 脚本展示如何调用 Git 命令行接口自动化某些任务 import subprocess def run_git_command(command): result = subprocess.run(['git'] + command.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE) return result.stdout.decode('utf-8'), result.stderr.decode('utf-8') output, error = run_git_command("status") print(output) if error: print(f"Error occurred: {error}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值