git部分实现原理

可以参考这篇文章
重点记一下.git的一些重要目录和文件, 比如logs,refs, objects, HEAD和index,理解它们的作用
git版本库目录

文件对象存储

git是一个键值对类型的对象存储系统,存储的是文件对象blob, 目录树tree, 提交记录commit,还有commit的引用,比如tag

无论是提交到暂存区,还是提交到版本库,都是存储文件对象到.git/objects中

提交到暂存区,index文件会列出提交文件的blobs的hash
提交到版本库,.git/objects/下会新增commit文件,记录tree和其他提交信息;同时也会新增tree和blobs文件,tree会记录blobs的信息,commit文件的信息会记录到git log中。

提问:听说git是增量式存储,这是怎么实现的?
大体思想就是把文件划分为n个小块,再通过hash判断哪个小块有修改

显然,每个版本都要记录tree,但并不是每个版本都要复制所有blob

tree对象是一种简化后的目录,文件对象的目录结构也是借助tree维持的

引用

tag记录时,会在.git/refs/tags中新增tag文件,文件内容指向了commit记录

head引用
每次提交时,head引用指向当前分支的最新提交记录
切换分支和合并分支时,head引用也会自动修改
它的实现是一个.git/HEAD文件,指向了.git/refs/heads中一个引用

引用,也就是一个指向commit记录的文件,tag和HEAD,以及分支都是引用
分支引用。分支也是用引用+日志实现的,比如master分支对应 .git/refs/heads/master引用, heads目录表示可以切换的本地分支, 比如新建分支b, 那么会对应一个.git/refs/heads/b引用

git reset命令,就是将head指向一个引用的提交内容,并覆盖暂存暂存区或工作区
git reset --mixed <引用>只覆盖暂存区
git reset --hard <引用>覆盖暂存工作区和暂存区
git reset --soft <引用>只修改head指针

git checkout检出命令

  • 用于切换分支,其实是修改head引用,并将head指向提交内容覆盖暂存区和工作区
  • 用于恢复文件 其实是把index的内容对应的内容覆盖工作区
    git checkout --README
    git checkout . //将index内容覆盖全部工作区

git merge <分支引用>新增一个提交,新提交有两个parent,不修改原来的提交日志
git rebase <分支引用>将指定分支的所有提交取消(修改提交日志),并重新提交到当前分支上

关于版本控制系统的理解差不多就这样了,关键还是在使用上,要记住,想要浪一下的时候,先保存,再创建和切换分支,在新分支上可以随意动手脚

其他命令

git config … #配置
git config --list #读取配置

git status #查看工作区和暂存区状态
git diff <引用> --<文件> #对比工作区文件和引用对应的文件
git rm <文件> #从暂存区中删除文件

git remote add <远程引用> <网址> #添加远程引用
git push <本地引用> <远程引用> #推送给远程引用

git log --pretty=oneline

git tag -a v1.0 [commit id] -m “version 0.1 released”
git merge <分支引用> #合并分支和当前分支

### Git Merge 的工作原理 Git Merge 是一种将两个或多个开发历史合并到一起的操作。它的核心目标是将不同分支上的更改整合到一个共同的上下文中,同时尽量保持提交历史的清晰性和可追踪性[^2]。 #### 合并策略 Git 提供了多种合并策略,具体选择取决于分支间的差异和用户的需求。最常用的策略包括以下几种: - **Fast-Forward(快速向前)**:当分支之间没有分叉时,Git 会简单地将当前分支指针移动到目标分支的位置。这种情况下不会创建新的合并提交[^2]。 - **Three-Way Merge(三路合并)**:当分支存在分叉时,Git 会找到两个分支的最近公共祖先(Common Ancestor),然后比较三个版本的内容(公共祖先、源分支、目标分支),最终生成一个新的合并提交[^3]。 #### 三路合并的工作机制 在三路合并中,Git 需要处理两个分支之间的差异。以下是其工作机制的详细说明: - Git 确定两个分支的最近公共祖先(Base Commit)。 - 它分别比较公共祖先与每个分支的最新状态,生成两组差异。 - 根据这两组差异,Git 尝试自动合并更改。如果遇到冲突,则需要人工介入解决[^3]。 #### 合并冲突 当两个分支对同一部分代码进行了不兼容的修改时,Git 无法自动完成合并,从而产生冲突。此时,Git 会在冲突文件中标记冲突区域,并要求用户手动解决冲突后再继续合并过程[^1]。 #### 示例代码 以下是一个简单的示例,展示如何执行合并操作以及解决冲突: ```bash # 切换到主分支 git checkout main # 拉取最新代码以确保本地分支是最新的 git pull origin main # 执行合并操作 git merge feature # 如果出现冲突,打开冲突文件手动解决冲突 # 解决冲突后,标记冲突已解决 git add <冲突文件> # 继续完成合并 git merge --continue ``` #### 图形化查看合并历史 为了更好地理解分支合并的历史,可以使用以下命令以图形化方式查看提交记录: ```bash git log --oneline --graph --all ``` 这条命令会以简洁的形式展示分支的合并关系和提交历史。 #### 总结 Git Merge 的工作原理基于分支间的差异分析,通过快速向前或三路合并的方式实现分支的整合。了解其内部机制有助于开发者更高效地管理代码版本,并妥善处理可能出现的冲突情况[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值