diff --git a/README.md b/README.md index 41c5fb2..42f3793 100644 --- a/README.md +++ b/README.md @@ -1,28 +1,61 @@ -# MIT: git implementation in Rust +# MIT: Mini-Git implementation in Rust -Git in Rust. 用 Rust 编写的简易 Git +Git in Rust. 用 `Rust` 实现的mini `Git`. Called `mit`. + +> 旨在简洁易读、高效且安全 + +> 学习`Git`的最好方法就是去实现`Git` +> +> 本项目旨在提供一套 [小学二年级] 都能看懂的`Git`实现 +> +> `// rm -rf 死板的设计模式 & 复杂的仓库架构` +> +## 良好的跨平台支持 +- [x] Windows +- [x] MacOS +- [x] Linux (Unix-like...) ## 主要功能 +- 支持的输入路径(`pathspec`):文件路径、目录路径(绝对或相对,包括`.` `./` `../`) -- 支持 git init, git add, git rm, git commit - - [x] init - - [x] add - - [x] rm - - [x] commit - - [x] status - - [x] log +- 支持 `mit init`, `mit add`, `mit rm`, `mit commit` -- 支持分支 git branch, git checkout + - [x] `init`: 初始化(若仓库已存在,则不执行) + - [x] `add`: 将变更添加至暂存区(包括新建、修改、删除),可指定文件或目录 + - `-A(all)` : 暂存工作区中的所有文件(从根目录开始)变更(新建√ 修改√ 删除√) + - `-u(update)`: 仅对暂存区[`index`]中已跟踪的文件进行操作(新建× 修改√ 删除√) + - [x] `rm`: 将文件从暂存区 &| 工作区移除. + - `--cached` : 仅从暂存区移除,取消跟踪 + - `-r(recursive)`: 递归删除目录,删除目录时必须指定该参数 + - [x] `commit` + - [x] `status`: 显示工作区、暂存区、`HEAD` 的状态,(只包含当前目录);分为三部分: + - **Staged to be committed:** 暂存区与`HEAD`(最后一次`Commit::Tree`)比较,即上次的暂存区 + - **Unstaged:** 暂存区与工作区比较,未暂存的工作区变更 + - **Untracked:** 暂存区与工作区比较,从未暂存过的文件(即未跟踪的文件) + - [x] `log` - - [x] branch - - [x] switch - 与 checkout out 不同,switch 需要指明--detach,才能切换到一个 commit,否则只能切换分支。 +- 支持分支 `mit branch`, `mit switch`, `mit restore` + + - [x] `branch` + - [x] `switch` + 与 `checkout` 不同,`switch` 需要指明`--detach`,才能切换到一个`commit`,否则只能切换分支。 同时为里简化实现,有任何未提交的修改,都不能切换分支。 - - [x] restore - 将选中的文件/路径的文件恢复到--source 制定的版本,默认为 HEAD。不指定区域,默认只操作工作区。指定--staged,操作暂存区。同时指定--staged 和--worktree,操作暂存区和工作区。 - - 目录和通配符会去 suorce 中匹配。不会删除未跟踪的文件。 - - 即,文件在 index 里,不在 source 里,文件会被删除。但是,新建的、未被跟踪的文件不会被删除。但是如果新建里的文件和 source 里的文件名字一样,会被覆盖。 + - [x] `restore`: 回滚文件 + - 将指定路径(可包含目录)的文件恢复到`--source` 指定的版本,可指定操作暂存区 &| 工作区 + - `--source`:可指定`Commit Hash` `HEAD` `Branch Name` + - 若不指定`--source`,且无`--staged`,则恢复到`HEAD`版本,否则从暂存区[`index`]恢复 + - 若`--staged`和`--worktree`均未指定,则默认恢复到`--worktree` + - 对于`--source`中不存在的文件,若已跟踪,则删除;否则忽略 -- 支持简单的合并 git merge +- 支持简单的合并 `mit merge` (fast-forward) - - [x] Merge(FF) + +## 备注 +### 名词释义 +- 暂存区:`index` or `stage`,保存下一次`commit`需要的的文件快照 +- 工作区:`worktree`,用户直接操作的文件夹 +- 工作目录:`working directory`,代码仓库的根目录,即`.mit`所在的目录 +- 仓库:`repository`,包含`.mit`目录的目录 +- `HEAD`:指向当前`commit`的指针 +- 已跟踪:`tracked`,指已经在暂存区[`index`]中的文件(即曾经`add`过的文件) \ No newline at end of file