From a92dc3ebaa3486f88c1dfdd7b13395a93028d856 Mon Sep 17 00:00:00 2001 From: wenmingyuan <71512491+wenmingyuan@users.noreply.github.com> Date: Thu, 31 Dec 2020 00:39:54 +0800 Subject: [PATCH 1/8] Update README.md --- README.md | 40 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7023390..8575e43 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,38 @@ -# java_project -实现一个简单的版本管理工具 +# 实现一个简单的版本控制工具 + +--- + +## 任务1 实现 key-value 存储 + +- 最简单的 key-value 存储方式(filename ---> content of file) + - key 作为文件名,文件内容作为 value + - 给定 value: "hello world" + - hash("hello world") == 34234234 + - 创建文件 objects/34234234 ---> hello world + - 给定 34234234,要找到 value 的值 + +- 支持以下功能 + - 给定 value,向存储中添加对应的 key-value + - 给定 key,查找得到对应的 value 值 + +- 封装成class对外提供接口 + +- 单元测试 + +## 任务2 将一个文件夹转化成 key, value + +- 给定一个文件夹目录,将其转化成若干 tree 和 blob + - 深度优先遍历此目录 + - 遇到子文件就转化成 blob 并保存 + - 遇到子文件夹就递归调用其内部的子文件/文件夹最后构造 tree 并保存 + +- 使用任务1提供的接口 --- hash表 + +- 单元测试 + +## 开发方式 + +- 永远使用 Pull Request 来更新主分支 +- commit 描述和 PR 描述尽可能详细 +- 使用 issue 来讨论/记录开发计划、分工以及问题/ bug +- 每个 issue 和 PR 都 @ 助教 From 813fbc17c7292221d58048f9a852a85b13d775f6 Mon Sep 17 00:00:00 2001 From: wenmingyuan <71512491+wenmingyuan@users.noreply.github.com> Date: Thu, 31 Dec 2020 00:40:20 +0800 Subject: [PATCH 2/8] Update README.md --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 8575e43..86edc9e 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,5 @@ # 实现一个简单的版本控制工具 ---- - ## 任务1 实现 key-value 存储 - 最简单的 key-value 存储方式(filename ---> content of file) From ce82f483109cf7a2d7c478e050f5506aedb732e3 Mon Sep 17 00:00:00 2001 From: wenmingyuan <71512491+wenmingyuan@users.noreply.github.com> Date: Thu, 31 Dec 2020 00:52:58 +0800 Subject: [PATCH 3/8] Update README.md --- README.md | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 86edc9e..aa4b19b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# 实现一个简单的版本控制工具 +# JAVA 项目:实现一个简单的版本控制工具 -## 任务1 实现 key-value 存储 +## 1. 任务1 实现 key-value 存储 - 最简单的 key-value 存储方式(filename ---> content of file) - key 作为文件名,文件内容作为 value @@ -17,7 +17,7 @@ - 单元测试 -## 任务2 将一个文件夹转化成 key, value +## 2. 任务2 将一个文件夹转化成 key, value - 给定一个文件夹目录,将其转化成若干 tree 和 blob - 深度优先遍历此目录 @@ -28,9 +28,18 @@ - 单元测试 -## 开发方式 +## 3. 任务3 实现 commit + +- 给定一个工作区目录,生成对应的 blob 和 tree (任务2已完成)以及 commit + - 需要存储指向当前最新 commit 的 HEAD 指针 + - 每次新生成一个 commit 前,需要把根目录的 tree key 与已有的最新 commit 的 tree key 进行比较,发现不相同时(即文件发生了变动)才添加这个 commit + - commit 创建完成后,更新 HEAD 指针至最新 commit + + +## 4. 开发方式 - 永远使用 Pull Request 来更新主分支 - commit 描述和 PR 描述尽可能详细 - 使用 issue 来讨论/记录开发计划、分工以及问题/ bug - 每个 issue 和 PR 都 @ 助教 +- 最终小组内每位同学都需要贡献至少 3 次 commit,可以是完善注释、设计文档和单元测试(使用代码来自动化实现测试用例的生成以及验证测试结果是否正确) From 3dd8fa736e7b751fc1212d80bfda40343d911340 Mon Sep 17 00:00:00 2001 From: wenmingyuan <71512491+wenmingyuan@users.noreply.github.com> Date: Mon, 4 Jan 2021 21:43:58 +0800 Subject: [PATCH 4/8] Delete README.md --- README.md | 45 --------------------------------------------- 1 file changed, 45 deletions(-) delete mode 100644 README.md diff --git a/README.md b/README.md deleted file mode 100644 index aa4b19b..0000000 --- a/README.md +++ /dev/null @@ -1,45 +0,0 @@ -# JAVA 项目:实现一个简单的版本控制工具 - -## 1. 任务1 实现 key-value 存储 - -- 最简单的 key-value 存储方式(filename ---> content of file) - - key 作为文件名,文件内容作为 value - - 给定 value: "hello world" - - hash("hello world") == 34234234 - - 创建文件 objects/34234234 ---> hello world - - 给定 34234234,要找到 value 的值 - -- 支持以下功能 - - 给定 value,向存储中添加对应的 key-value - - 给定 key,查找得到对应的 value 值 - -- 封装成class对外提供接口 - -- 单元测试 - -## 2. 任务2 将一个文件夹转化成 key, value - -- 给定一个文件夹目录,将其转化成若干 tree 和 blob - - 深度优先遍历此目录 - - 遇到子文件就转化成 blob 并保存 - - 遇到子文件夹就递归调用其内部的子文件/文件夹最后构造 tree 并保存 - -- 使用任务1提供的接口 --- hash表 - -- 单元测试 - -## 3. 任务3 实现 commit - -- 给定一个工作区目录,生成对应的 blob 和 tree (任务2已完成)以及 commit - - 需要存储指向当前最新 commit 的 HEAD 指针 - - 每次新生成一个 commit 前,需要把根目录的 tree key 与已有的最新 commit 的 tree key 进行比较,发现不相同时(即文件发生了变动)才添加这个 commit - - commit 创建完成后,更新 HEAD 指针至最新 commit - - -## 4. 开发方式 - -- 永远使用 Pull Request 来更新主分支 -- commit 描述和 PR 描述尽可能详细 -- 使用 issue 来讨论/记录开发计划、分工以及问题/ bug -- 每个 issue 和 PR 都 @ 助教 -- 最终小组内每位同学都需要贡献至少 3 次 commit,可以是完善注释、设计文档和单元测试(使用代码来自动化实现测试用例的生成以及验证测试结果是否正确) From ac8297f0b76ad9ada0fad8a546eca8925790c95f Mon Sep 17 00:00:00 2001 From: wenmingyuan <71512491+wenmingyuan@users.noreply.github.com> Date: Mon, 4 Jan 2021 21:45:10 +0800 Subject: [PATCH 5/8] =?UTF-8?q?wmy=E7=9A=84Git=E5=8E=9F=E7=90=86=E5=AD=A6?= =?UTF-8?q?=E4=B9=A0=E6=80=BB=E7=BB=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...46\344\271\240\346\200\273\347\273\223.md" | 120 ++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 "Git\345\216\237\347\220\206\345\255\246\344\271\240\346\200\273\347\273\223.md" diff --git "a/Git\345\216\237\347\220\206\345\255\246\344\271\240\346\200\273\347\273\223.md" "b/Git\345\216\237\347\220\206\345\255\246\344\271\240\346\200\273\347\273\223.md" new file mode 100644 index 0000000..699800b --- /dev/null +++ "b/Git\345\216\237\347\220\206\345\255\246\344\271\240\346\200\273\347\273\223.md" @@ -0,0 +1,120 @@ +# Git原理学习总结 + +## git中的objects + +git有3种objects:blob、tree、commit + +``` +git cat-file -t object名字的前几位 # 查看object类型 +git cat-file -s object名字的前几位 # 查看object内容的大小(字符数) +git cat-file -p object名字的前几位 # 查看object内容 +``` + +## git add时发生的变化 + +1. 在.git/objects目录下生成blob对象 +2. 在.git目录下生成(或更新)index文件 + +### blob对象 + +blob的名字(key):“blob 字符数 \0 文件内容”的SHA1 +blob的值(value):“blob 字符数 \0 文件内容”被Git压缩后得到的二进制字符串(直接查看是乱码) + +一般通过 `git cat-file -p` 查看object的值 + +**blob不记录文件名信息。** 当文件名不同但文件内容相同时,git不会生成新的blob对象,只会在index文件中增加新的文件名与原有的blob名字。 + +### index文件 + +index文件中写有已添加到暂存区和版本库的文件名、对应blob名字等信息(直接打开是乱码) + +``` +git ls-files -s # 查看暂存区和版本库中的文件名和对应blob的名字 +``` + +### git status的几种状态 + +- changes to be committed:已添加到暂存区,等待被commit +- untracked:工作区中新建的文件,从未被添加到暂存区 +- modified:文件已添加到暂存区或版本库,之后工作区中的文件被修改,与暂存区或版本库中的同名文件内容不同 +- deleted:文件已添加到暂存区或版本库,之后工作区中的文件被删除 + +当工作区中的文件为modified状态时,使用 `git add` 命令,会生成新的blob对象,旧的blob对象还是存在的,但更新了index文件,在index文件中,该文件名将与新的blob名字对应。 + +## git commit时发生的变化 + +1. 在.git/objects目录下生成1个commit对象 +2. 在.git/objects目录下生成1个或多个tree对象(如果有文件夹的话会生成多个tree对象) + +### tree对象 + +tree对象中包含:1个或多个blob名字、对应的文件名/1个或多个tree名字、对应的文件夹名等信息 + +若 `git add` 某个文件夹下的文件,会在index文件中写入目录信息。通过 `git ls-files -s` 能看到blob名字和对应的“文件夹名/文件名”。 + +### commit对象 + +**1个commit就是1个版本** + +commit对象中包含:parent commit名字、1个tree名字、作者、提交说明等信息 + +## 版本切换 + +版本切换就是将工作区还原到某个版本(commit) + +``` +git reset --hard commit名字/HEAD~n # n代表回退几个版本 +``` + +## 分支 + +### HEAD指针 + +.git/HEAD文件的值:指向当前分支,如refs/heads/master + +### 某个分支 + +这里以master分支为例 +.git/refs/heads/master文件的值:master分支的最新一次commit名字 + +### 分支操作 + +``` +git branch # 查看分支列表 +git branch dev # 创建dev分支 +git checkout dev # 切换到dev分支 +``` + +``` +git branch -d dev # 删除dev分支(若没有merge,则不能删除) +git branch -D dev # 强制删除dev分支 +# 这2种操作只会删除dev指针,objects还是存在的 +``` + +## 一些常用命令 + +查看commit记录 + +``` +git log # 若回退到较早的版本,git log是无法看到之后的版本的 +git reflog # 显示所有记录 +``` + +删除暂存区中的文件(3种方法) + +``` +git rm --cached 文件名 +git reset HEAD 文件名 +git restore --staged 文件名 +``` + +删除版本库中的文件(2种方法) +1. 先删除工作区中的文件,再用 `git add 删除文件名` ,然后 `git commit` +2. `git rm 文件名` (会自动删除工作区中的文件),然后 `git commit` + +误删工作区的文件时,从暂存区或版本库恢复文件到工作区(2种方法) + +``` +git checkout 文件名 +git restore 文件名 +``` \ No newline at end of file From 95dca97806af89e8543432d93d2aa204a202c837 Mon Sep 17 00:00:00 2001 From: wenmingyuan <71512491+wenmingyuan@users.noreply.github.com> Date: Mon, 4 Jan 2021 21:45:42 +0800 Subject: [PATCH 6/8] =?UTF-8?q?Rename=20Git=E5=8E=9F=E7=90=86=E5=AD=A6?= =?UTF-8?q?=E4=B9=A0=E6=80=BB=E7=BB=93.md=20to=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...255\246\344\271\240\346\200\273\347\273\223.md" => README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename "Git\345\216\237\347\220\206\345\255\246\344\271\240\346\200\273\347\273\223.md" => README.md (96%) diff --git "a/Git\345\216\237\347\220\206\345\255\246\344\271\240\346\200\273\347\273\223.md" b/README.md similarity index 96% rename from "Git\345\216\237\347\220\206\345\255\246\344\271\240\346\200\273\347\273\223.md" rename to README.md index 699800b..a6fdc78 100644 --- "a/Git\345\216\237\347\220\206\345\255\246\344\271\240\346\200\273\347\273\223.md" +++ b/README.md @@ -117,4 +117,4 @@ git restore --staged 文件名 ``` git checkout 文件名 git restore 文件名 -``` \ No newline at end of file +``` From 48f78aa7c86dd003ca70949ad270e0d9401fe423 Mon Sep 17 00:00:00 2001 From: wenmingyuan <71512491+wenmingyuan@users.noreply.github.com> Date: Mon, 4 Jan 2021 21:46:59 +0800 Subject: [PATCH 7/8] Update README.md --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index a6fdc78..310f73c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Git原理学习总结 -## git中的objects +## 一、git中的objects git有3种objects:blob、tree、commit @@ -10,7 +10,7 @@ git cat-file -s object名字的前几位 # 查看object内容的大小(字符 git cat-file -p object名字的前几位 # 查看object内容 ``` -## git add时发生的变化 +## 二、git add时发生的变化 1. 在.git/objects目录下生成blob对象 2. 在.git目录下生成(或更新)index文件 @@ -41,7 +41,7 @@ git ls-files -s # 查看暂存区和版本库中的文件名和对应blob的名 当工作区中的文件为modified状态时,使用 `git add` 命令,会生成新的blob对象,旧的blob对象还是存在的,但更新了index文件,在index文件中,该文件名将与新的blob名字对应。 -## git commit时发生的变化 +## 三、git commit时发生的变化 1. 在.git/objects目录下生成1个commit对象 2. 在.git/objects目录下生成1个或多个tree对象(如果有文件夹的话会生成多个tree对象) @@ -58,7 +58,7 @@ tree对象中包含:1个或多个blob名字、对应的文件名/1个或多个 commit对象中包含:parent commit名字、1个tree名字、作者、提交说明等信息 -## 版本切换 +## 四、版本切换 版本切换就是将工作区还原到某个版本(commit) @@ -66,7 +66,7 @@ commit对象中包含:parent commit名字、1个tree名字、作者、提交 git reset --hard commit名字/HEAD~n # n代表回退几个版本 ``` -## 分支 +## 五、分支 ### HEAD指针 @@ -91,7 +91,7 @@ git branch -D dev # 强制删除dev分支 # 这2种操作只会删除dev指针,objects还是存在的 ``` -## 一些常用命令 +## 六、一些常用命令 查看commit记录 From f13a2b79d7ff1d143285c0eb92b1aeb266d54578 Mon Sep 17 00:00:00 2001 From: wenmingyuan <71512491+wenmingyuan@users.noreply.github.com> Date: Sun, 10 Jan 2021 18:17:10 +0800 Subject: [PATCH 8/8] =?UTF-8?q?Rename=20README.md=20to=20Git=E5=8E=9F?= =?UTF-8?q?=E7=90=86=E5=AD=A6=E4=B9=A0=E6=80=BB=E7=BB=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\347\220\206\345\255\246\344\271\240\346\200\273\347\273\223" | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename README.md => "Git\345\216\237\347\220\206\345\255\246\344\271\240\346\200\273\347\273\223" (100%) diff --git a/README.md "b/Git\345\216\237\347\220\206\345\255\246\344\271\240\346\200\273\347\273\223" similarity index 100% rename from README.md rename to "Git\345\216\237\347\220\206\345\255\246\344\271\240\346\200\273\347\273\223"