Mini-Git in Rust. 用Rust实现的简易Git
中文文档 | English
Git in Rust. 用 Rust
实现的mini Git
. Called mit
.
旨在简洁易读、高效且安全
学习
Git
的最好方法就是去实现Git
本项目旨在提供一套 [小学二年级] 都能看懂的
Git
实现
// rm -rf 死板的设计模式 & 复杂的仓库架构
支持的输入路径(pathspec
):文件路径、目录路径(绝对或相对,包括.
./
../
)
支持 mit init
, mit add
, mit rm
, mit commit
init
: 初始化(若仓库已存在,则不执行)- idempotent
add
: 将变更添加至暂存区(包括新建、修改、删除),可指定文件或目录
-A(all)
: 暂存工作区中的所有文件(从根目录开始)变更(新建√ 修改√ 删除√)-u(update)
: 仅对暂存区[index
]中已跟踪的文件进行操作(新建× 修改√ 删除√)rm
: 将文件从暂存区 &| 工作区移除.
--cached
: 仅从暂存区移除,取消跟踪-r(recursive)
: 递归删除目录,删除目录时必须指定该参数commit
status
: 显示工作区、暂存区、HEAD
的状态,(只包含当前目录);分为三部分:
HEAD
(最后一次Commit::Tree
)比较,即上次的暂存区log
支持分支 mit branch
, mit switch
, mit restore
branch
switch
与 checkout
不同,switch
需要指明--detach
,才能切换到一个commit
,否则只能切换分支。
同时为里简化实现,有任何未提交的修改,都不能切换分支。restore
: 回滚文件
--source
指定的版本,可指定操作暂存区 &| 工作区
--source
:可指定Commit Hash
HEAD
Branch Name
--source
,且无--staged
,则恢复到HEAD
版本,否则从暂存区[index
]恢复--staged
和--worktree
均未指定,则默认恢复到--worktree
--source
中不存在的文件,若已跟踪,则删除;否则忽略支持简单的合并 mit merge
(fast-forward)
⚠️注意:为了避免冲突,执行测试时请加上--test-threads=1
如:cargo test -- --test-threads=1
因为测试需要对同一个文件夹进行IO
index
or stage
,保存下一次commit
需要的的文件快照worktree
,用户直接操作的文件夹working directory
or repository
,代码仓库的根目录,即.mit
所在的目录HEAD
:指向当前commit
的指针tracked
,指已经在暂存区[index
]中的文件(即曾经add
过的文件)