一、什么是Git
Git是目前最主流的版本控制器,当我们修改了仓库中的文本文件时,如果是文本文件,修改后会新增一行git,如果是二进制文件,例如图片视频这种,我们只能知道他被修改过了,比如文件的大小从200kb变为100kb,但是具体修改了什么内容我们是没办法知道的。
Git的安装
我们可以使用git --version指令来查看我们本地服务器是否安装了git,如果显示出git的版本说明已经安装过某个版本的git。

如果没有安装git,可以输入下面的指令
bash
sudo apt-get install git -y
这条指令会为我们下载对应的git包
二、创建和配置本地仓库
在开始使用 Git 之前,我们需要先在本地创建一个仓库。所谓仓库(Repository),可以理解为一个被 Git 持续跟踪和管理的目录,它既包含我们实际编辑的项目文件,也包含 Git 用来记录版本历史的隐藏目录 .git。创建本地仓库通常有两种方式:一种是从零开始初始化一个新仓库,另一种是从远程仓库克隆一个已有仓库。
如果是从零开始,先进入项目所在的目录,然后执行初始化命令:
bash
mkdir my-project
cd my-project
git init
执行 git init 之后,当前目录下会生成一个隐藏的 .git 目录,此时这个目录就正式成为一个 Git 仓库了。需要注意的是,.git 目录中保存着版本库的全部元数据,包括提交记录、分支信息、配置信息等,因此不要随意删除或手动修改其中的内容,否则可能造成版本历史损坏。
如果项目已经存在于远程服务器上,则可以直接克隆到本地:
bash
git clone https://example.com/team/my-project.git
克隆完成后,Git 会自动创建同名目录,并把远程仓库的完整历史一并拉取到本地,同时默认配置好远程仓库地址,后续可以直接进行拉取和推送操作。
仓库创建好之后,我们还需要为我们的本地仓库新增两个配置项,这两个配置项用于配置提交者身份,如果没有配置提交者身份,Git就无法正确记录每一次提交的作者信息。配置分为全局配置和仓库级配置两种:全局配置对当前用户的所有仓库生效,仓库级配置只对当前仓库生效。常用的配置命令如下:
bash
git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
git config --global core.editor "vim"
其中 user.name 和 user.email 会写入每一次提交记录,建议填写真实且可辨识的信息。而core.editor 用于指定编写提交信息时默认打开的编辑器。如果只想对当前仓库生效,去掉 --global 参数即可。
配置完成后,可以通过以下命令查看当前生效的配置,确认信息是否正确:
bash
git config --list//或者git config -l
git config user.name
git config user.email
三、文件的增删查改
3.1 将文件添加到git仓库中
git仓库共有三个部分,分别为版本库、工作区和暂存区。工作区中的文件通过add之后会被添加到暂存区,再通过commit后添加到版本库中。所以一个文件被添加到版本库中需要两个操作,一个是add,一个是commit。只有被存入版本库中的文件才能被git所管理。
而将文件添加到暂存区中我们需要使用到的指令是:
bash
git add 文件名
当我们想要将当前工作区中的所有文件都添加到暂存区中,我们可以使用指令:
bash
git add .
这个.就代表了当前工作路径下的所有文件。

当我们需要将暂存区中的文件添加到版本库中,我们可以使用的指令是
bash
git commit -m "提交说明文字"
需要注意的是,每次在将文件提交至仓库时我们都需要详细描述一下我们这次提交的文件具体修改了什么内容,方便我们后续进行查看和版本的回退。

对于已经被git追踪过的旧文件(即前面已经add添加到过暂存区中的文件),我们可以直接使用指令:
git commit -am "提交说明文字"
-a表示--all,带上这个字段会自动把已追踪文件的修改添加到暂存区,能够省去手动git add。如果新创建或者从来没有add过的文件,-a不会管,新增文件需要单独使用git add手动进行添加。
3.2 对文件进行修改
我们可以通过vim编辑器来对工作区的文件进行修改,修改完成后再使用git add来将修改后的文件加入暂存区。
3.3 对修改记录的查看
我们可以使用下面的指令来查看所有时间从近到远的提交记录
bash
git log
git log --pretty=oneline

带上--pretty=online表示每条提交一行,显示完整 40 位 commit 哈希
同时,我们会发现,.git/refs/heads/master路径下的master存放的是最近一次提交的commit号

我们还可以通过 git status 查看仓库当前的状态,例如当前位于哪个分支、有哪些文件被修改、哪些文件尚未被跟踪等。这是日常开发中使用频率最高的命令之一,建议在每次提交前都先执行一次,确认改动的范围符合预期。

bash
git diff 文件名
git diff HEAD -- 文件名
使用git diff指令可以查看目前暂存区和我们工作区中的某个文件的区别,而带上HEAD后就是用于查看当前暂存区和版本库之间的区别。
git diff:

git diff HEAD --:

3.4 删除仓库中的文件
场景一:直接删除
使用指令
bash
git rm test.txt git commit -m "删除 test.txt"
这个指令等价两步:系统rm删除文件 + git add这个删除改动。首先使用git rm test.txt将工作区文件直接删掉,同时把删除记录放进暂存区,然后使用git commit来提交这条删除到本地版本库
场景二:只让Git不再跟踪这个文件,本地文件保留不动(比如删配置、密钥)
bash
git rm --cached test.txt git commit -m "取消跟踪 test.txt,保留本地文件"
带上字段--cached后不会删电脑上的文件,而只是把它从Git的版本追踪里移除,之后这个文件修改git不再管它,一般会配合.gitignore使用,防止以后又被add进来。
四、版本回退和撤销修改
版本回退
我们可以使用git reset指令来进行版本的回退:
bash
git reset [--soft|--mixed|--hard] [HEAD]
git reset有三个选项分别是soft、mixed、hard,其中mixed是默认选项,如果后面不带选项则默认使用的是mixed。三个选项的对比如下表所示:
| 参数 | 版本库 (HEAD) | 暂存区 (index) | 工作区 (文件) | 核心作用 | 适用场景 |
|---|---|---|---|---|---|
--soft |
回退 | 不变 | 不变 | 只移动 HEAD 指针,暂存区、工作区所有改动原样保留 | 撤销 commit,不想丢修改,重新组织提交(重新commit) |
--mixed(默认,不加参数就是它) |
回退 | 重置(和回退后 commit 对齐) | 不变 | 移动 HEAD + 重置暂存区,改动回到工作区,变成未 add 状态 | 撤销commit + 撤销git add,代码还在,重新 add |
--hard |
回退 | 重置 | 重置 | HEAD、暂存区、工作区全部强制和目标 commit 保持一致 | 丢弃所有后面的改动,彻底回到指定版本 |
--soft选项只回退提交,修改还保存在暂存区,而mixed选项会将版本库和暂存区的内容一同回退,hard选项会将工作区的文件一并重置。/所以在实际的项目工程实践中,--hard选项应该慎重使用。
使用示例如下:
--soft,回退了版本库中的内容,暂存区中还保存着修改后的ReadMe

--mixed,暂存区中的内容被回退了

--hard,工作区中的内容也一并被回退了:

git reset HEAD表示回退到当前版本,带上一个^表示回退到上一个版本,带上两个^^表示回退到前两个版本。
git reset本质其实是移动当前分支的分支指针(比如 main/master)指向别的 commit,HEAD 跟着分支指针走。
撤销修改
使用指令:
bash
git checkout --文件名
可以撤销对文件的修改,但是要记得要带两个横线,不然这个checkout就是另外一个含义。需要注意的是,这条指令只能撤销工作区的修改,已经添加到暂存区的和已经提交的文件无法撤销修改,只能使用git reset进行版本回退。