第2篇
第2篇
在本篇随笔中,我们主要介绍:
- Git火速上手(Part1)
本篇随笔同步于博客园:https://www.cnblogs.com/cbgeng/p/16213977.html
Git 火速上手(Part1)
在本次实验中,由于要用到Git交作业,但在之前只是浅显地用过很小一部分git命令,于是准备重新系统性地入个门。本篇随笔可以视为廖雪峰Git入门教程的笔记。
一些概念
老师在上课的时候,已经对Git的核心原理做了一些解释,这里我们先回顾一下比较核心的概念:
Repository、本地的CMDB
.git directory(a repository storing all version control data)
Repository
即版本库,简单说来就是每个目录下的.git
文件夹。这个给文件夹我们也把它叫做本地的CMDB
,因为.git
文件夹里存放着你的所有的版本控制的数据。
CMDB
,是Configuration Management Database
的简称,我们把它叫做配置管理数据库
。不难理解为啥.git
文件夹是一个配置管理数据库。
工作目录
Working directory (local file system)
文件夹里头除了.git
的东西
暂存区
Staging area(in memory)
实际上暂存区是放在.git
文件夹里面的,用于隔离工作目录和git仓库。
对于你的每个文件,都有三个状态:
已修改
Modified
(the file in working directory is different from the one in git repository, but is not in staging area)
工作目录下的、和仓库里头当前所在分支不一样的、你还没把它丢到暂存区的文件。
已暂存
Staged
(the file is modified and has been added into the staging area)
改了,并且丢进了暂存区。
已提交
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 <file>..." 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>