git基础教程

git官方文档👈有问题建议先看文档,二手资料有时会存在奇奇怪怪的问题。

emmm,其实是想写一篇使用hexo快速搭建个人博客的教程,但感觉在那篇教程里穿插着讲git的话,很多初学者可能搞不清楚git到底是什么,甚至可能会把githexo的概念绑定起来,那样就比较麻烦了。所以就决定先写一篇文章介绍git(去年学得时候没写,正好也是补充一下)。

git相关概念

到底什么是git呢?用一句话来说,git是一种分布式版本控制系统。暂时看不懂也没关系,接下来会详细说所谓的“分布式版本控制系统”是什么。

版本控制系统

先说说版本控制系统是个啥。

为了方便理解,在这里举一个常见的案例来进行解释:

1
2
3
4
5
6
你需要和舍友共同完成一篇3000字的论文,你写A部分,舍友写B部分。
初步完成A部分内容后,你通过QQ等软件将文本文件发送给舍友,让他继续写B部分,而同时你也在你的电脑上接着完善A部分。
当舍友完成B部分后,他又将文本文件发送给你,然后,你需要将A部分改动的内容与舍友的B部分合并,找出哪些地方发生了变化,这就有点麻烦了。
写完论文之后,你和舍友聚在一块,进一步完善论文。你发现,你的猪头舍友在写B部分时误删了一些A的内容,而你在合并时没有注意,导致这部分内容你和舍友都没有备份,无奈之下你们只好重写了这块丢失的内容。
再次完善论文时,你们发现,在编写的过程中论文B部分的立意跑偏了,你们需要重写B部分。但现在AB混在了一起,很难把论文恢复到原先的状态。
在崩溃的边缘,你有可能会想,有没有一款软件,能够自动记录对文件的每次修改,同时还可以与别的成员协同编辑,这样就不需要来回发送文件,也不需要反复另存文件以保证留有文档的备份?

这种时候,就到我们的主角出场的时候了,它就是今天的主角:

在线共享文档 版本控制系统!

版本控制系统(Version Control System,VCS)就可以完成上述的工作,它可以自动跟踪文件的变化、还原文件的历史记录、协调多人在同一个项目中工作,宾且可以在必要情况下回溯到过去的任意版本。

在软件开发中,版本控制系统可以帮助开发人员有效地管理和维护代码库,支持项目的分支、合并等操作。这样,在多人协作开发的情况下,不同的成员可以同时对同一个项目进行开发,而不会产生代码冲突等问题。此外,版本控制系统还可以提供更好的安全备份和恢复机制,以防止意外的数据丢失或代码损坏!

常见的版本控制系统有SubversionMercurial,当然,还有我们的主角——git

分布式 & 集中式

再说说什么是分布式,以及与分布式对应的集中式。

在版本控制系统中,分布式是指每个开发者都有完整的代码库副本,并且可以在本地进行修改、提交和推送等操作。

相比之下,集中式版本控制系统(例如SVN)依赖于一个中央代码库。开发者从中央代码库检出代码副本,然后在本地进行修改,修改后,他们必须将更改推送回中央代码库,否则其他开发者无法获得最新版本的代码。

二者的区别在于,在分布式系统中,每个开发者都有完整的代码库副本,可以在本地进行修改、提交和推送等操作;而在集中式系统中,开发者只能从中央代码库检出代码,并且必须将更改推送回中央代码库。这就意味着,在分布式系统中,开发者可以在没有网络连接的情况下继续工作,不需要频繁地与中央服务器进行通信,同时,每个开发者都能拥有完整的历史记录,方便历史回溯等操作。

git安装配置

阿菇的系统是Fedora 37,如有差异请自行解决。在终端执行以下命令安装git

1
2
3
4
5
# Fedora用户使用这句
sudo dnf install git

# Ubuntu用户使用这句
sudo apt install git

配置

我们可以通过修改git配置来定制git环境。首先需要设置用户名和邮箱地址,我们之后的每一次git提交都会包含这些信息。使用以下指令全局设置usernameemail

1
2
3
4
# 将"your-username"和"your-email-address"替换为你的用户名和邮箱地址
# 建议设置为你的github账户的用户名和绑定的邮箱地址
git config --global user.name "your-usernmae"
git config --global user.email "your-email-address"

你还可以使用以下指令检查你的git配置信息:

1
git config --list

使用以下指令查看当前系统所有的git配置文件及其位置:

1
git config --list --show-origin

进一步的配置,如设置默认的文本编辑器、搭建git服务器等,可以参考官方文档,这里不过多介绍。

本地创建git仓库

仓库,可以简单的理解成一个目录,这个目录里的文件和资源都可以通过git进行管理。

使用以下指令初始化一个本地的git仓库。

1
2
# 将 your-repo-name 替换为你的git仓库的名称
git init your-repo-name

使用这句指令后,会有输出提醒,你新建了一个空的Git仓库。转进到这个目录,你会发现这个目录下其实已经包括了一个隐藏目录.git,这里面存储的是一些版本信息,用于跟踪管理文件信息,平常不去碰它就好了。

git分区

此部分讲解git的三个工作分区是怎么工作的,也就是git到底是如何对我们的项目进行版本控制的。

三个分区

一个完整的本地git工作目录包括三个分区,工作区、暂存区和版本库。

  • 工作区:指的是当前目录下除.git目录外的区域,用户可以随意修改工作区文件的内容。
  • 暂存区:指的是.git目录下的index文件,该文件包含了当前工作树中所有被添加到版本控制中的文件列表和它们的元数据,如文件名、文件类型、文件大小、最后修改时间等信息。
  • 版本库:指的是存储代码版本历史记录的地方,也就是代码仓库。git的版本库包含了所有commit的snapshot和message,以及所有branch、tag等元数据信息。通常情况下,一个项目只有一个版本库,它可以存储在本地或者远程服务器上,开发者可以通过命令行或者图形界面工具来管理和操作版本库。

以上三个分区中,暂存区和版本库可以合称为git仓库

看到这里,你可能会有些疑惑,我们刚才使用init指令不是创建了一个git仓库吗,为什么这里又说暂存区和版本库可以合称git仓库,工作区去哪里了?

我们刚才使用git init指令,本质上是创建了一个空的项目目录,这个项目目录下自动包含了一个.git目录(也就是git仓库),方便我们对这个项目目录进行版本管理,刚才所说的暂存区和版本库,实际上都位于.git隐藏目录下。出于习惯,我们一般会把整个项目目录叫做一个git仓库,也可以叫做本地仓库,与接下来会讲到的远程仓库相对应。

在分区之间操纵文件

这张图可以清晰的看到三个分区之间的关系,以及我们应该如何使用git来操作我们的文件。

git三个分区之间的关系

在具体讲解如何在不同分区之间操纵文件之前,先说一下如何查看某个文件的状态。我们可以使用以下指令查看当前git目录中某个文件的具体状态:

1
git status

在这个指令的输出中,一个文件存在以下三种状态:

  • 不显示:表明该文件没有发生改动,改动是指该文件在工作区和在版本库中的内容不同,新建、删除文件均属于改动;
  • 红色文件:表示文件已发生改动,且没有添加到暂存区中
  • 绿色文件:表明文件已发生改动,且已经添加到暂存区中

具体的指令就不细说了,直接在底下罗列出来,需要时拿过来用就行,很容易就能看懂。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 工作区 -> 暂存区
git add filename

# 暂存区 -> 版本库
git commit -m "message"

# 前两句指令的合体,同时实现前两句指令的功能
git commit -am "message"

# 缓存区 -> 工作区
git rm --cached filename
git rm --staged filename
git reset HEAD filename

# 撤销当前工作区所有改动,包括文件删除和创建操作
git checkout -- filename
git restore filename