本项目仿照git使用go实现了一个简单的版本控制系统,实现了git add, git commit, git log, git reset, git branch等命令

git每次改变,commit存储的是一个快照,而不是改变的内容,这样可以保证每次commit都是一个完整的版本,而不是增量的改变。

主要命令如下: commit: 提交一个快照 log: 查看提交历史 reset: 回滚到某个版本 branch: 分支管理

got init 初始化一个git仓库

got add 添加文件到暂存区

got commit 提交到版本库

got log 查看提交历史

got reset 回滚到某个版本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
/*
     *   .gitlet
     *      |--objects
     *      |     |--commit and blob
     *      |--refs
     *      |    |--heads
     *      |         |--master
     *      |--HEAD
     *      |--addstage
     *      |--removestage
     */

对于Commit来讲,同一个对象应当包含相同的message,parents,date,blobID,其中message是每次执行gitlet commit时附带的信息,例如“init commit”,“add file1”等等;parents中保存的是前一个Commit的ID信息,当执行完merge操作时,会将两个Branch合并,这时候,合并完的Commit会指向两个commit,也就是说这个Commit的parents中有两个ID;date是执行commit时自动生成的时间信息,在这里,一定要注意,gradescope会要求时间信息的格式Wed Dec 31 16:00:00 1969 -0800,不是这个格式会在gitlet log命令中报错;最后是blobID,每个Commit对应多个保存的文件,只需要将文件的blobID保存在Commit当中就可以在objects文件夹中找到对应的Blob对象了。

总结一下,objects文件夹中保存着所有的Commit和文件信息,不管是Commit还是文件,都被称为对象,每个对象都有一个独一无二的ID,所以要想确定一个对象,只需要知道它的ID就可以在objects文件夹中找到了。

我在2024/3/16日在github提交了我的第一个用go实现的git项目

今天是2024/3/21,项目进行到了:完成init和commit的部分功能

正在编写将blobID和文件路径相关联的部分

这一部分的关系十分复杂,让人头疼

2024/3/24 更新: 在昨晚我完成了storeblob的部分,在今天实现了add功能,但是dl快到了,感觉要做不完了