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 first
echo second > output.txt
echo third > output.txt
echo 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.