lab0_report
lab0_report
lab_thinkings
Thinking 0.1
question
思考下列有关 Git 的问题:
在
/home/21xxxxxx/learnGit(已初始化)目录下创建一个名为README.txt的文件。执行命令git status > Untracked.txt。在
README.txt文件中添加任意文件内容,然后使用 add 命令,再执行命令git status > Stage.txt。提交
README.txt,并在提交说明里写入自己的学号。执行命令
cat Untracked.txt和cat Stage.txt,对比两次运行的结果,体会README.txt两次所处位置的不同。修改
README.txt文件,再执行命令git status > Modified.txt。执行命令
cat Modified.txt,观察其结果和第一次执行 add 命令之前的status是否一样,并思考原因。
answer
这两次命令前后status是不一样的。
在第一次add之前status是处于未跟踪状态(Untracked files),而在add后再次修改文件后,此时由于暂存区和工作区均存在Readme.txt这个文件,因此此文件会显示已被修改但工作区和暂存区的文件内容不同,即Changes not staged for commit,而不是显示为未跟踪状态。
Thinking 0.2
question
仔细看看0.10,思考一下箭头中的 add the file 、stage the file 和commit 分别对应的是 Git 里的哪些命令呢?
answer
首先对于任何一个文件, 在 Git 中都只有四种状态: 未跟踪(untracked)、未修改(unmodified)、已修改(modified)、已暂存(staged).
| 状态 | 解释 |
|---|---|
| 未跟踪 | 表示没有跟踪(add)某个文件的变化,使用 git add 即可跟踪文件。 |
| 未修改 | 表示某文件在跟踪后一直没有改动过或者改动已经被提交。 |
| 已修改 | 表示修改了某个文件, 但还没有加入(add)到暂存区中。 |
| 已暂存 | 表示把已修改的文件放在下次提交(commit)时要保存的清单中。 |
所以从上面的解释不难看出add the file 对应的是git add和git commit。stage the file就是对应了git add,表示把在版本库中有备份的,且已被修改的文件加入暂存区。commit对应的是git commit表示的是将暂存区中的文件加入本地版本库。
Thinking 0.3
question
思考下列问题:
- 代码文件
print.c被错误删除时,应当使用什么命令将其恢复?- 代码文件
print.c被错误删除后,执行了git rm print.c命令,此时应当使用什么命令将其恢复?- 无关文件
hello.txt已经被添加到暂存区时,如何在不删除此文件的前提下将其移出暂存区?
answer
-
可以采用
git reset -- print.c指令来还原当前HEAD的已经删除的print.c文件。 -
使用
git rm print.c命令等效为删除了暂存区的print.c文件,所以首先需要使用git reset --hard HEAD print.c指令将文件从暂存区恢复,之后重复问题1中的git reset -- print.c指令即可。 -
使用
git rm --cached hello.txt命令来时hello.txt处于未跟踪状态,即可在不删除此文件的情况下将其移出暂存区。
Thinking 0.4
question
思考下列有关 Git 的问题:
- 找到在
/home/21xxxxxx/learnGit下刚刚创建的README.txt文件,若不存在则新建该文件。- 在文件里加入
Testing 1,git add,git commit,提交说明记为 1。- 模仿上述做法,把 1 分别改为 2 和 3,再提交两次。
- 使用
git log命令查看提交日志,看是否已经有三次提交,记下提交说明为3 的哈希值a。- 进行版本回退。执行命令
git reset --hard HEAD^后,再执行git log,观察其变化。- 找到提交说明为 1 的哈希值,执行命令
git reset --hard <hash>后,再执行 git log,观察其变化。- 现在已经回到了旧版本,为了再次回到新版本,执行
git reset --hard <hash>,再执行git log,观察其变化。
answer
新文件创建

版本回退
使用git reset可以进行版本回退或者切换到任何一个版本。它有两种用法:第一种是使用 HEAD 类似形式,如果想退回上个版本就用 HEAD^,上上个版本的话就用HEAD^^,要是回退到前 50 个版本则可使用 HEAD~50 来代替;第二种就是使用 hash 值,使用 hash 值可以在不同版本之间任意切换。

git reset --hard实际上是用来改变当前的仓库状态,使用该指令,我们可以将当前仓库的状态变为以前任一次commit后的状态
Thinking 0.5
question
执行如下命令, 并查看结果
echo firstecho second > output.txtecho third > output.txtecho forth >> output.txt
answer
命令执行结果如下所示:

>,表示覆盖输出>>,表示追加输出
Thinking 0.6
question
使用你知道的方法(包括重定向)创建下图内容的文件(文件命名为 test),将创建该文件的命令序列保存在 command 文件中,并将 test 文件作为批处理文件运行,将运行结果输出至 result 文件中。给出 command 文件和 result 文件的内容,并对最后的结果进行解释说明(可以从 test 文件的内容入手). 具体实现的过程中思考下列问题: echo echo Shell Start 与 echo
echo Shell Start效果是否有区别; echo echo$c>file1 与 echoecho $c>file1效果是否有区别.
answer
文件部分
脚本部分

result文件结果S
我们在
test中先将a和b分别赋值为1和2,然后令c等于a与b的和,即c的结果为.我们将c,b,a的值分别写入file1、file2、file3,此时这三个文件中的值分别为3, 2, 1。然后我们使用cat将这三个文件的值 追加 写入file4,再把file4中的内容写入result。因此result中的值为3, 2, 1。
结果分析
实验表明,echo echo Shell Start 与 echo 'echo Shell Start' 效果是没有区别的; echo echo $c>file1 与 echo ‘echo $c>file1’ 效果是有区别的,前者会将"echo c"重定向到file1,而后者会将"echo c"重定向到file1,而后者会将"echo $c>file"这一字符串在终端中显示。
lab_difficulties
对我而言,我觉得lab0最难理解的部分其实是gcc的相关知识吧(虽然实际上是pre中的内容,但lab0中疯狂使用),记得lab0的第四题花去了我上机的大半时间,所以这部分我想简要总结一下gcc使用的这部分知识点。
这是一个简要的流程图,对 C 而言,从源代码到可执行文件要经过四个步骤:预处理->编译->汇编->链接。这个完整的过程有时被直接称为“编译”或“构建”。
这部分在教程中已经讲的很详细了,在此补充一个教程没有但lab0考了的一个参数-I,-I(注意是i的大写)指令用于指定头文件的路径,从而可以解决头文件(.h)和源文件(.c)不在同一目录下这种情况,常用于Makefile中,如:
1 | gcc -c src.c -I ./include -o src.o |
除此之外,还有两个非常像的参数(不知道有没有用orz),-L和-l(小写的l),-I是用来告诉gcc去哪里找头文件的, 那么-L实际上也很类似, 它是用来告诉gcc去哪里找库文件,而-l的作用就是用来指定具体的静态库、动态库。
lab_summary
感谢我没有浪费的寒假,基本
lab0的东西都从某些途径学过orz,在此放放我的linux部分的学习笔记Tag: linux - Charles’s Castle
lab0实验分为linux的基本使用、git的相关操作,和一些shell脚本的知识,除此之外我还了解到了一些关于gcc的更深层次了解的内容,还是受益匪浅的。下面是一张白嫖学长的总结的图,真的厉害:

总体来说,lab0算是小试牛刀的内容吧,我反正只用上机那两个小时就写完课下了,实验任务并不大,也学到了不少新东西,收获满满,期待下周的lab1!!
- Title: lab0_report
- Author: Charles
- Created at : 2023-03-02 18:21:17
- Updated at : 2023-11-05 21:36:18
- Link: https://charles2530.github.io/2023/03/02/lab0-report/
- License: This work is licensed under CC BY-NC-SA 4.0.
