Git入门笔记(一)

Git是一个非常常用的版本控制软件,很多被广泛使用的软件项目都是使用Git进行版本控制的。

本教程将不包括基础的安装流程。

Git文件的三种状态

使用Git进行操作软件时,文件状态有三种:

状态 描述
已提交(committed) 表示文件已经保存在本地Git库中。
已修改(modifiled) 表示文件已修改,但暂未保存到Git库中。
已暂存(staged) 表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。

由于Git提交文件到Git库时,并不是直接从工作区直接到Git库的,中间存在一个暂存区(staging area),这个过程的文件就被称之为已暂存

Git项目的三个工作区域

针对Git文件的三种状态,Git项目分为三个区域:

区域 描述
工作区 简单来说就是本地看到的目录。
暂存区(stage / index) 一般存放在.git目录下,里面包含了Git自动创建的第一个分支master,以及指向master的一个指针HEAD
Git仓库(版本库) 工作区下隐藏的目录.git,是Git的版本库(仓库)。

Git基本工作流程

  • 工作区修改文件
  • 对修改后的文件暂存
  • 提交更新,将暂存的文件转储到Git仓库内

创建仓库与提交文件

初始化Git本地仓库

在Git的命令行窗口,使用git init命令可以在本地初始化一个空仓库。

image-20220420121506627

提交文件至暂存区

我们可以使用git add <path>的命令,使一个位于path的文件或者目录添加至暂存区。

image-20220420122135812

之后我们可以通过git status的命令,查看工作区与暂存区的文件状态。该命令可以查看到哪些修改被暂存,哪些修改没有,或是哪些文件没有被git追踪到(Untracked files)。

image-20220420122243543

提交至本地仓库

执行git commit命令可以提交暂存区的文件至本地仓库中。通常在使用该命令时,会选择加入-m <text>参数,我们可以在<text>处填入本次提交的说明。

image-20220420123716186

如果加入-a <file>参数,我们将不需要执行git add命令,直接将file提交至本地仓库。

我们也可以在git commit后加入<file1> <file2> ....文件参数,指定暂存区的某文件到本地仓库。

查看提交日志信息

使用git log命令,我们可以查看到提交日志信息。

image-20220420123842023

修改文件并提交

实际上修改文件并提交的过程与上面新增一个文件并提交的过程并无太大差异。

首先我们可以用git status命令来查看我们已修改(modified)的文件。

image-20220420135140855

我们可以得知的信息:

1
2
3
4
5
6
7
On branch master 在主分支
Changes not staged for commit: 更改没有被保存至暂存区
(use "git add <file>..." to update what will be committed) 使用git add命令保存更改至暂存区
(use "git restore <file>..." to discard changes in working directory) 使用git restore放弃工作区的更改
modified: git2.md 已更改文件: git2.md

no changes added to commit (use "git add" and/or "git commit -a") 没有要提交的更改(可以使用git add或git commit -a提交更改)

通常的,我们会使用git status -s来获取简短的输出结果:

image-20220420140501938

一个红色的M表示更改未保存至暂存区,一个绿色M表示更改已保存至暂存区,当同时出现一个红和一个绿M时候,则表示添加至暂存区后又发生了更改。

我们使用git add提交后,就可以执行git commit -m来使我们暂存区的更改保存到本地仓库中了。

比较文件不同

我们使用git diff <file>命令,可以比较文件的不同,当不加入额外参数时,它的作用是查看尚未保存至暂存区的更改。

image-20220420142630702

当我们加入--cached或是--staged参数时,作用是查看已保存至暂存区的更改。

image-20220420142702736

当我们加入HEAD参数时,我们将可以看到已保存至暂存区和未保存的全部更改。

image-20220420143033890

--stat参数的加入,可以使其仅展示摘要,而不是完整的修改内容。

image-20220420143210685

撤销暂存区更改

执行git reset HEAD <file>我们可以撤销已保存至暂存区的更改。

image-20220420143909172

版本回退

查看提交历史

在学习版本回退之前,先补充一下git log指令的相关参数详解。

--oneline 参数可以查看历史记录的简洁版本。

image-20220421160458412

--graph参数可以以拓扑图的形式,展示历史中出现的分支、合并。

--reverse参数用于逆向显示日志。

--author=name参数用于查询名为name这个人的提交日志。

-<number>参数可以显示近次数的提交日志。

版本回退

前面我们提及了一个撤销暂存区更改的命令git reset HEAD <file>,实际上这个命令是版本回退命令的一个使用,现在我们来详解这个命令。

--hard参数撤销工作区所有未提交的修改内容,将工作区与暂存区都回退到上一个版本。

HEAD参数:

  • HEAD表示当前版本
  • HEAD^表示上版本,以此类推,HEAD^^表示上上个版本等等
  • HEAD~0表示当前版本
  • HEAD~1表示上个版本,以此类推,HEAD~50表示上50个版本
image-20220422162741046

aabbcc这个aabbcc代表的是版本唯一的标识码,我们可以用这个参数来指定回退到某以aabbcc作为版本唯一标识码的版本。

当我们后悔了,需要“回到未来”怎么办呢,我们可以用到git reflog的命令,来查看你每一次的操作,并且获得操作的标识码,这样就可以获得某个版本的commit id,也就是标识码了。

image-20220422163214788 image-20220422162701602

文件从本地仓库恢复

如果我们在工作区误删了文件,我们需要用到一个命令git checkout -- <file>,这个命令可以帮助我们从本地仓库中恢复file文件。

image-20220422164852884

文件删除

首先,我们可以在资源管理器中将工作区的文件删除,使用git status就可以看到我们确实删除了一个文件。

image-20220422165616423

然后我们可以使用git rm <file> 的指令,确定删除该文件,接着我们用git commit将我们这个更改上传至本地仓库,这样文件就在本地仓库被删除了。

image-20220422170159105