# mygit **Repository Path**: wood-worm/mygit ## Basic Information - **Project Name**: mygit - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-01-23 - **Last Updated**: 2025-02-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 创建环境 ```bash sudo apt-get update sudo apt-get install libssl-dev # openssl需要的库 sudo apt-get install diffutils # 用于比较两个文件差异,diff和diff3 ``` # 实现说明 这是初始网站https://www.leshenko.net/p/ugit/#,根据他的描述使用C++17实现的Git版本管理系统。它使用的是python,相比而言代码量小很多。 ## 优势 - 使用gtest对每一个实现命令做了测试 - 后续重写前面实现的命令,判断有没有修改引入很方便 - 做了异常处理 - 一些结构体封装的方便,重复代码少 ## 项目概述 ### 实现原理 #### git版本管理实现 - 对一个文件sha1计算得到一个hash值,一次commit,先复制一份文件,然后把哪些文件是在这个commit下面的,就存下来 - checkout切换到不同的commit,就是把当前目录删了,然后把上面存的文件还原 - branch指向最新的commit_id,.git/heads存的是不同分支指向的commit_id - status展示区别,这边用的是diff工具,输入两个文件名就好了 - merge合并分支,用的也是diff工具,先把两个分支的差异合并,然后再把合并后的结果放到当前分支 ### .mgit目录结构 - objects目录存放所有的对象,blob存的备份文件内容,tree存的目录结构,哪个目录有哪些文件,commit存的提交记录,啥时候提交的,提交指向的tree是啥 - heads 文件名是分支名,内容就是指向的commit_id - refs 存的是tag,这个tag跟branch不一样,tag是不会随着commi变动的 - head 存的是当前指向的分支名 - index 存的是暂存区的文件 ## 感想 - 整个项目花了暑假一周,寒假一个半月,一边摸鱼一遍写的 - 不要想设计很完美的代码,容易浪费时间,先动手最重要 - 重构代码真的,尽量写代码不要写的那么死 - learn by doing,狠狠熟悉了git - 就是代码质量堪忧,一直闷头自己写,没看别人的代码 # git命令参照表 | Git命令 | 功能 | 备注| | --- | --- | --- | | mygit --init | 创建一个新的 Git 仓库 | | mygit --hash-object -w filename | 计算文件内容的哈希值并将其存储在 Git 仓库中 | 这个和git算出来的不一样,因为git还要添加一部分内容| | mygit --cat-file -p hash | 显示指定哈希值的对象内容 | | mygit --commit 提交信息 | 提交当前暂存区的变更 | | mygit --log | 显示提交历史 | | mygit --checkout oid或者tag或者branch_name | 切换当前分支,oid是对应提交的哈希值 ,tag是对应提交的标签,branch_name是分支名| | mygit --tag | 将当前提交打上标签 | | mygit --branch -a|显示所有分支 | | mygit --branch branch_name | 创建分支 | | mygit --status | 只展示哪些文件变更,显示当前工作区和上一次git commit之间的差异 显示当前暂存区和上一次git commit之间的差异| | mygit --reset oid | 重置当前分支到指定提交 | | mygit --diff | 展示文件的具体变更,显示当前工作区和上一次git commit之间的差异 显示当前暂存区和上一次git commit之间的差异| | mygit --merge branch_name | 合并指定分支到当前分支 | | mygit --merge-base branch1 branch2 | 找出两个分支的共同祖先 | | mygit --add filename | 将文件添加到暂存区 | # 命令作用 - hash-object filename - 读取文件内容,计算哈希值得到hash值 oid - 将 blob + ' ' + 内容,存储到.mygit/objects/oid 下。 - cat-file oid 读取指定哈希值对应的文件 - write-tree directoryname - 读取当前目录下所有文件,计算分别计算每个文件的哈希值,得到一串list type + ' ' + oid + name - 计算list的hash值oid,创建文件.mygit/objects/oid,将 tree + ' ' + list写入文件 - read-tree oid - 读取oid的文件,获取list,逐个解析出type和oid,读取oid对应的文件,将内容写入对应目录下