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