软件构造随笔2

为了防止个人小博客出现不可访问的状况,故在博客园亦留一份备份!
还请老师不要判为抄袭等,感谢!本人20级HIT学生,学号尾号230

随笔2

在本篇随笔中,我们主要介绍:

  • Git火速上手

Git 火速上手

在本次实验中,由于要用到Git交作业,但在之前只是浅显地用过很小一部分git命令,于是准备重新系统性地入个门。本篇随笔可以视为廖雪峰Git入门教程的笔记。

一些概念

老师在上课的时候,已经对Git的核心原理做了一些解释,这里我们先回顾一下比较核心的概念:

::: tip Repository、本地的CMDB

.git directory(a repository storing all version control data)

Repository版本库,简单说来就是每个目录下的.git文件夹。这个给文件夹我们也把它叫做本地的CMDB,因为.git文件夹里存放着你的所有的版本控制的数据。

CMDB,是Configuration Management Database的简称,我们把它叫做配置管理数据库。不难理解为啥.git文件夹是一个配置管理数据库。
:::

::: tip 工作目录

Working directory (local file system)

文件夹里头除了.git的东西

:::

::: tip 暂存区

Staging area(in memory)

实际上暂存区是放在.git文件夹里面的,用于隔离工作目录和git仓库。

:::

对于你的每个文件,都有三个状态:

::: tip 已修改

Modified (the file in working directory is different from the one in git repository, but is not in staging area)

工作目录下的、和仓库里头当前所在分支不一样的、你还没把它丢到暂存区的文件。

:::

::: tip 已暂存

Staged (the file is modified and has been added into the staging area)

改了,并且丢进了暂存区。

:::

::: tip 已提交

Committed (the file keeps same in working directory and git directory)

工作目录和仓库里头的文件一样辽!

:::

设置自己的信息

鉴于Git是分布式管理系统,因而在进行某些操作的时候,Git有必要记录下来是谁干的这些事情。所以你需要向Git自报家门:

git config --global user.name "Geng"
git config --global user.email "example@hello.world"

注意到我们这里使用了--global参数,这就意味着对于每个Git仓库,其都会使用这个配置。当然你也可以针对每个仓库进行不同的设置。

一些操作

创建版本库

git init

把文件添加到仓库

或者可以说放进了暂存区?

git add FILENAME

提交更改

或者可以说把暂存区里头的所有文件一口气都提交了。

git commit -m "我把bug给删了!"

查看当前状态

git status

会把你动的文件以及所处的状态(已修改?已暂存?已提交?)给标记出来。

比如某次执行这个命令,得到如下结果:

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   Helloworld.txt

no changes added to commit (use "git add" and/or "git commit -a")

看到了not staged(第一行)与modified(第二行),说明你改了Helloworld.txt,但是并没有放进暂存区。下面还贴心的提示你记得用git add把东西放进暂存区,用git commit提交。

如果我git add一下,把东西丢进暂存区了呢?

On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   Helloworld.txt

好的,可以看到已经放入暂存区,并且你这个文件是已修改的。这能不能说明已修改已暂存两个状态可以共存呢?我想某种程度上好像还不行,接着往下看——

查看已修改文件和仓库现有文件的区别

git diff <FILENAME>

实测如果一个文件是modified了的,如果还没通过git add放进暂存区,此时你用git diff,会把区别详细的给你说出来:

diff --git a/Helloworld.txt b/Helloworld.txt
index 9305eb5..9e0acbb 100644
--- a/Helloworld.txt
+++ b/Helloworld.txt
@@ -1 +1,2 @@
-Hello 看我 你在害怕什么
\ No newline at end of file
+Hello 看我 你在害怕什么
+a new line
\ No newline at end of file

D:\GitTest>git add Helloworld.txt

D:\GitTest>git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   Helloworld.txt

但你一旦放进暂存区,即便还没提交,git diff也啥都不会显示了。

查看历次提交的记录

git log

会从近到远的输出你每一次commit的记录,比如:

PS D:\GitTest> git log
commit 090ef56147016ce251c0b0086eb8a5faa66b520d (HEAD -> master)
Author: 120L******** <120L********@xxx.edu.cn>
Date:   Fri Apr 29 20:13:23 2022 +0800

    Change Helloworld.txt

commit 34415d69ace23724d0f8f65c37875f2eaec27fc2
Author: 120L******** <120L********@xxx.edu.cn>
Date:   Fri Apr 29 19:56:28 2022 +0800

    Touch Helloworld.txt

git回退

HEAD指向当前指针,HEAD^表示指向上一个版本,HEAD^^表示指向上上个版本,HEAD~100表示指向上一百个版本。

git reset --hard HEAD^

我还想回到刚才的版本?对不起,没有^HEAD,如果你知道刚才那次commit的ID的前几个字母是啥(可以看刚刚说过的git log命令的结果,里头有commit 090ef56147016ce251c0b0086eb8a5faa66b520d),也行,那就

git reset --hard 090ef5

不知道?或许你说咱再用git log看看?殊不知git log的结果也会回退,那就:

查看本地仓库的所有commit日志

git reflog

嗨嗨,自动帮我记了每次commit的ID

PS D:\GitTest> git reflog
090ef56 (HEAD -> master) HEAD@{0}: commit: Change Helloworld.txt
34415d6 HEAD@{1}: commit (initial): Touch Helloworld.txt

谜之——Git管理的竟然是修改!?

上课的时候讲的是Git管理的是修改的文件,但廖雪峰网站上说的是存的是变化??

廖雪峰这边做了个实验:

先改了一个文件,丢进暂存区;
接着把刚刚动过的文件又改了,但没有再次丢进暂存区;
接着提交。

发现被提交的是丢进暂存区的东西。

但到这里发现,好像说存的是文件,也无可厚非啊,可以理解为,丢进暂存区的,只是一个你add时文件的副本罢了。

回退的几种情况

只是修改了工作区文件,还没丢到暂存区

此时会把文件回退到和仓库一毛一样的状态

git checkout -- FILENAME
# OR
git restore <file>

其中第二个是我当前再用的这个版本提示给我的,好像更人性化了一些

(use "git restore ..." to discard changes in working directory)

文件已经丢到暂存区,并且你已经又对文件进行了改动

  1. 恢复到你刚刚丢进暂存区的样子,并仍然保持在暂存区的样子
git checkout -- FILENAME
# OR
git restore <file>
  1. 单纯的把文件从暂存区移出来,且保留了你最后所做的修改
git reset HEAD <file>
# OR
git restore --staged <file>

显然每一种情况里头的第二句更人性化一些。

删除的几种情况

真的想删一些文件了

# 假设你已经从工作区把要删的文件都删完了
git rm/add <file> 

手贱删错了,想恢复的和当前仓库里头一样

git checkout -- FILENAME
# OR
git restore <file>
posted @ 2022-05-01 20:47  陌上花已开  阅读(39)  评论(0编辑  收藏  举报