# 实验指引(git)
> 由于本实验使用自动化处理方式对于上传的代码进行管理,因此要求上传的代码按照统一的规范以方便自动化测试。由于代码查重的要求,你还需要随附你代码仓库的git提交记录。
## `git` 基础配置
> 一般建议为实验环境配置 ssh 以方便 git pull/push 操作。
> [如何配置ssh key](https://blog.csdn.net/weixin_42310154/article/details/118340458)
```bash=
$ git config --global user.name 'your name'
$ git config --global user.email 'your email'
```
## `git`基础操作指引
> 下文中大多数 --amend 等的指令可以通过 -a 首字母进行使用,只是为了方便理解给出全名。
1. 在做实验的过程,在每完成一步之后,都需要通过`git`提交你的代码,命令行中最简单的提交方式为
```bash
// 查看当前各个文件状态
$ git status
// 将你所 要提交的文件/所有修改的内容 添加到暂存区
$ git add { change_file || . }
// 提交(commit)当前暂存区中的文件
$ git commit (会打开编辑器以输入提交信息,默认编辑器可以通过`git config --global core.editor vim` 来设置。)
// OR
$ git commit -m "message" (以message作为提交信息提交暂存区中的文件)
// 修改我的最后一次提交信息
$ git commit --amend
```
根据上文的操作方式就可以非常简单的提交你的代码变更
2. 回滚到某个提交时候的数据
**注意:你会丢失你相较于该提交的所有被跟踪文件上的修改**
```bash=
$ git reset --hard HEAD^ [ 上一个 ]
$ git reset --hard f5e3c07ef753f4537b0f5304fdb123fca82f04db [ 特定提交 ]
```
3. 从当前所在分支中签出另外一个分支,数据与当前分支相同
```bash
$ git checkout -b branch_name_you_want
```
4. 切换分支
```bash
# 切换本地分支
git switch branch_name
# 切换(带有未保存数据的切换),拉取分支
git checkout branch_name
```
5. 如果你想要修改以前的某次提交的内容
```bash
// 暂存无关内容
$ git stash
// 将当前这段内容
$ git rebase [某个你想要操作的commit的hash] --interactive
// 找到你要修改的那个 commit,修正他
$ git commit --amend // 提交修正
$ git rebase --continue // 将头指针移动回最新的位置
$ git stash pop // 将之前stash的未保存数据恢复
```
6. 如果你想要回滚到上一次提交的状态,亦或是想要将某个提交合并到其他提交
> 注意,下面的操作很有可能导致你丢失你所修改文件中的信息,请注意小心谨慎,最好在操作之前先通过`git checkout -b {a branch name}`来签出一个新的分支进行操作,确认无误之后再在你当前的主分支中完成对应操作。
```bash
// 查看 git 提交记录(会打开一个类似于less的阅读器,查看你想要回滚到的提交号码)
$ git log
commit f5e3c07ef753f4537b0f5304fdb123fca82f04db (HEAD -> syscall)
Author: jackyliu16 <18922251299@163.com>
Date: Sun May 21 22:26:42 2023 +0800
2.1 trace: FIX fork error
commit 759d119fd5e1998efca2129f0de46d167a98ad19
Author: jackyliu16 <18922251299@163.com>
Date: Sun May 21 22:13:49 2023 +0800
update: input error
commit 1d60e9555071096e4d1d6a67972faa662934e52c
Author: jackyliu16 <18922251299@163.com>
Date: Sun May 21 22:08:15 2023 +0800
2.1 trace: enable syscall trace
1. add syscall integer mapping
2. add syscall mapping from sys_num into string
3. add syscall to init the mask in proc
4. add print when syscall
commit 8d84e1037c26c4c01f690fd0e3bc27cff073df26
Author: bluez <bluez@supportcom>
Date: Sun May 21 21:58:54 2023 +0800
2.1 trace: enable user application trace
add syscall
// 回滚到某个 commit
$ git reset --hard 759d119fd5e1998efca2129f0de46d167a98ad19
**注意本操作会将你的整个仓库回滚到那个提交的状态,请小心使用以防止丢失实验数据**
// 当你想要将当前的 commit 合并到其他分支,或者{修改提交信息/commit内容...etc}
$ git rebase -i 8d84e1037c26c4c01f690fd0e3bc27cff073df26 (选择对于到8d84e1分支为止的这些分支进行操作)
pick 1d60e95 2.1 trace: enable syscall trace
pick 759d119 update: input error
pick f5e3c07 2.1 trace: FIX fork error
pick e14a6a0 nothing
- 你可以通过 `vim` 的快捷键修改行之间的顺序,以修改提交的顺序
- 你可以根据下面的帮助说明通过修改第一个单词以实现对应的效果
- 请注意,如果你删除一个提交行,那么这个提交是真的会被删除掉的
- (VIM)在NORMAL模式中输入`:wq`保存并退出,`:q!`取消操作
Example:
pick 1d60e95 2.1 trace: enable syscall trace
s 759d119 update: input error
pick f5e3c07 2.1 trace: FIX fork error
pick e14a6a0 nothing
> 跳转到提交编辑器,简单修改提交信息之后提交
commit 7bdb2913908ab266c4ec5b62bf923f9c2e43f53e (HEAD -> test)
Author: jackyliu16 <18922251299@163.com>
Date: Mon May 22 00:54:07 2023 +0800
nothing
commit 5cba6d93d0f51da1030ff440fd9c05fe26767dca
Author: jackyliu16 <18922251299@163.com>
Date: Sun May 21 22:26:42 2023 +0800
2.1 trace: FIX fork error
commit 6251e3439f8c05b651d31b322ca1cb05642c2df1
Author: jackyliu16 <18922251299@163.com>
Date: Sun May 21 22:08:15 2023 +0800
2.1 trace: enable syscall trace
1. add syscall integer mapping
2. add syscall mapping from sys_num into string
3. add syscall to init the mask in proc
4. add print when syscall
update: input error
**注意本操作会将你的整个仓库变成你所操作的形状,请小心使用以防止丢失实验数据**
```
## 实验提交文档格式要求
1. 使用`markdown`文件进行提交
2. 在`vscode`中安装`markdownlint`插件,并且`Ctrl+Shift+P`选择创建`markdownlint`配置文件,并将下面的配置文件复制进去,同时确保插件当前处于打开状态
3. 在书写提交文档的时候,根据插件的报错信息进行修改,使之合乎格式规范
*PS: 可以通过`Ctrl+Shift+V`打开`markdown`文件阅览*
```json
{
"defaultSeverity": "warning",
"MD003": false,
"MD024": {
"siblings_only": true
},
"MD025": {
"single_quotes": false,
"multiple_spaces": 1
},
"MD026": {
"punctuation": ".,;:!",
"line_length": false
},
"MD032": {
"exceptions": \[ "li > p" \]
},
"MD033": {
"allowed_elements": \[ "code" \]
},
"MD034": {
"ul_single": true,
"ol_single": true,
"ul_multi": true,
"ol_multi": true
},
"MD036": {
"line_length": 80
},
"MD037": {
"spaces": 2
},
"MD038": {
"level": { "1": "first", "2": "second", "3": "third", "4": "fourth", "5": "fifth", "6": "sixth" }
},
"MD040": true,
"no-hard-tabs": false,
"line-length": false
}
```
## 如何通过代码仓库生成提交文件
1. 目前预设你已经有一个能正常通过测试,实现所有性能要求的仓库
2. 通过`git log`找到你当前分支最早的一条不属于你的提交记录 8d84e10...
3. `git format-patch --stdout 8d84e1037c26c4c01f690fd0e3bc27cff073df26..HEAD > {patch_file_name}.patch`(将8d84e10..HEAD的提交制作成为补丁文件重定向到同一个patch文件中)
4. 在你提交课程报告的时候请随附`patch`文件,或者是你使用的整个`git`仓库(请不要漏下`.git`文件夹)
#TODO 下面的内容不属于学生部分
1. 到达同等的起始位置(不属于学生的最后一个提交)
2. `git apply --check *.diff`(检查能否应用patch)
3. `git apply *.patch`(应用patch)
4. 理论上会到达于学生同样的位置
## 参考文献
[45 个 Git 经典操作场景,专治不会合代码](https://zhuanlan.zhihu.com/p/490774784)