为了防止个人小博客出现不可访问的状况,故在博客园亦留一份备份!
还请老师不要判为抄袭等,感谢!本人20级HIT学生,学号尾号230
在本篇随笔中,我们主要介绍:
在本次实验中,由于要用到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
HEAD
指向当前指针,HEAD^
表示指向上一个版本,HEAD^^
表示指向上上个版本,HEAD~100
表示指向上一百个版本。
git reset --hard HEAD^
我还想回到刚才的版本?对不起,没有^HEAD
,如果你知道刚才那次commit的ID的前几个字母是啥(可以看刚刚说过的git log
命令的结果,里头有commit 090ef56147016ce251c0b0086eb8a5faa66b520d
),也行,那就
git reset --hard 090ef5
不知道?或许你说咱再用git log
看看?殊不知git log
的结果也会回退,那就:
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管理的是修改的文件,但廖雪峰网站上说的是存的是变化??
廖雪峰这边做了个实验:
先改了一个文件,丢进暂存区;
接着把刚刚动过的文件又改了,但没有再次丢进暂存区;
接着提交。
发现被提交的是丢进暂存区的东西。
但到这里发现,好像说存的是文件,也无可厚非啊,可以理解为,丢进暂存区的,只是一个你add时文件的副本罢了。
此时会把文件回退到和仓库一毛一样的状态
git checkout -- FILENAME # OR git restore <file>
其中第二个是我当前再用的这个版本提示给我的,好像更人性化了一些
(use "git restore
..." to discard changes in working directory)
git checkout -- FILENAME # OR git restore <file>
git reset HEAD <file> # OR git restore --staged <file>
显然每一种情况里头的第二句更人性化一些。
# 假设你已经从工作区把要删的文件都删完了 git rm/add <file>
git checkout -- FILENAME # OR git restore <file>