---
# System prepended metadata

title: 实验指引（git）

---

# 实验指引（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)