目录
[1. 新建待管理目录](#1. 新建待管理目录)
[2. 在该目录下打开bash](#2. 在该目录下打开bash)
[3. 执行初始化本地仓库命令](#3. 执行初始化本地仓库命令)
[4. 查看包含文件](#4. 查看包含文件)
[1. 命令](#1. 命令)
[2. 新增文件并写入内容](#2. 新增文件并写入内容)
[3. 查看当前文件夹下文件](#3. 查看当前文件夹下文件)
[4. 查看文件内容](#4. 查看文件内容)
[5. 再次查看本地库状态](#5. 再次查看本地库状态)
[2. 再次查看本地仓库状态](#2. 再次查看本地仓库状态)
[3. 可以从暂存区中删除文件](#3. 可以从暂存区中删除文件)
[4. 批量添加文件至暂存区](#4. 批量添加文件至暂存区)
[2. 文件提交到本地仓库](#2. 文件提交到本地仓库)
[3. 再次查看本地库的状态](#3. 再次查看本地库的状态)
[4. 查看版本信息](#4. 查看版本信息)
[5. 查看详细日志](#5. 查看详细日志)
[1. 修改工作区文件](#1. 修改工作区文件)
[2. 再次查看本地库状态](#2. 再次查看本地库状态)
[3. 添加到暂存区](#3. 添加到暂存区)
[4. 再次查看本地仓库状态](#4. 再次查看本地仓库状态)
[5. 提交本地库](#5. 提交本地库)
[6. 查看本地库状态](#6. 查看本地库状态)
[7. 查看版本信息](#7. 查看版本信息)
[1. 命令](#1. 命令)
[2. 版本穿梭](#2. 版本穿梭)
[1. 修改工作区文件](#1. 修改工作区文件)
[2. 工作区VS暂存区](#2. 工作区VS暂存区)
[3. 暂存区VS本地仓库](#3. 暂存区VS本地仓库)
[4. 工作区VS本地仓库最新版](#4. 工作区VS本地仓库最新版)
[5. 本地仓库版本之间的对比](#5. 本地仓库版本之间的对比)
[1. 删除工作区的物理文件](#1. 删除工作区的物理文件)
[2. 查看本地库状态](#2. 查看本地库状态)
[3. 后续1:恢复文件](#3. 后续1:恢复文件)
[4. 后续2:确认删除](#4. 后续2:确认删除)
[5. git删除命令](#5. git删除命令)
[6. --cached参数的删除指令](#6. --cached参数的删除指令)
[7. 提交本地仓库](#7. 提交本地仓库)
本文参考:
【GeekHour】一小时Git教程_哔哩哔哩_bilibili
尚硅谷Git入门到精通全套教程(涵盖GitHub\Gitee码云\GitLab)_哔哩哔哩_bilibili
一、Git的工作机制

(一)工作区
代码存放在磁盘中的目录位置(电脑里能看到的物理文件) ,是项目文件存放的地方 ,我们可以在这里修改 。可以将工作区理解为我们直接在电脑操作系统文件系统中看到的文件和目录。
当我们对文件进行更改时,这些更改最初只存在于工作目录中 ,还没有被git跟踪。
工作区是生产货物的车间,对货物进行生成、加工和修改。
(二)暂存区
工作区的代码添加到暂存区当中,在这里我们也可以进行修改 ,同时这里也开始被git管理。也称为索引。
暂存区中不保存文件实体,通过id指向每个文件实体 。暂存区中包含的是我们准备提交到本地库中的文件和更改的快照。它是一个准备下一次提交的文件列表 ,我们可以理解其为一个待提交缓冲区。
暂存区允许我们选择性地提交更改,而不是一次性提交工作目录中的所有更改。
车间生产完产品后需要运送到仓库中保存起来,暂存区就是车间和仓库之间的运输工具,类似于小货车。
(三)本地库
暂存区中的代码,提交至本地库中,生成对应的历史版本 ,可修改。
本地库是git用来保存项目历史的地方 ,它包含了所有的提交、分支、标签等。我们项目的完整版本历史记录的存储库,包括我们项目中所做的每一次提交的完整快照。
本地库可以理解为:工厂中的仓库。仓库中存放很多的货物和物品,这些货物和物品就是我们的文件。
(四)远程库
远程库即为基于网络服务器的远程代码仓库。如基于互联网的GitHub、Gitee码云;基于局域网(机构代码不开源,不想将代码推送到互联网中)的GitLab等。

(五)小结
- 任何对象都是在工作区中诞生和修改的
- 任何修改都是从进入暂存区后才开始被版本控制
- 只有把修改提交到本地库中,该修改才能在仓库中留下痕迹
车间生产产品之后放到小火车上,由小货车运输至仓库中保存。


二、初始化配置
(一)设置用户签名
配置用户名 以及邮箱地址,只需设置一次,并且首次安装后必须设置用户签名,否则无法提交用户代码
这里的邮箱地址建议配置成GitHub/Gitee的邮箱,后续可作为远程仓库提交代码
bash
# 如果用户名之间存在空格,需要使用""包围
# local:本地配置,只对本地仓库有效
# global:全局配置,对所有仓库生效
# system:系统配置,对所有用户生效
git config --global user.name wangsiwen
git config --global user.email sww1506@gmail.com

签名的作用是区分不同操作者的身份 。用户的签名信息在每一个版本的提交信息中 能够看到,以此确认本次提交是谁做的。
(二)查看是否设置成功
方法一:找到自己电脑用户目录下的.gitconfig文件

打开,可以看到我们之前配置好的信息

方法二:打开git命令框,输入查看配置的命令
bash
git config --global --list

三、Git常用命令
(一)初始化本地仓库
仓库就是一个目录,要使用git管理目录,首先需要git获取该目录的管理权
1. 新建待管理目录

2. 在该目录下打开bash


3. 执行初始化本地仓库命令
bash
git init
可以发现,命令执行后会同步生成一个**.git目录**

[.git目录] 是Git用来存储我们项目的所有版本控制信息的地方 。当我们在一个目录中初始化一个新的Git仓库 ,或者我们将一个目录添加为现有Git仓库的子模块时 ,Git会自动在该目录下创建一个.git文件夹
4. 查看包含文件
bash
# 进入文件夹
cd .git/
# 查看该文件夹下包含的所有文件
ll

(二)查看本地仓库状态
1. 命令
bash
git status
- On branch <branch_name>:这是当前所在分支的名称,可以从此处确认我们当前所在分支
- Your branch is up to date with 'origin/<branch_name>':如果你的分支是与远程仓库上的同名分支保持同步的,则会显示该消息,表示当前分支与远程分支是最新的
- Changes not staged for commit:列出了在工作目录中发生的但未被暂存的更改(已修改但未添加到暂存区)
- Changes to be committed:列出了已经添加到暂存区的更改
- Untracked files:列出在工作目录中存在但没有被跟踪的文件

On branch main:当前是在main分支下
No commits yet:当前还未提交过任何东西
nothing to commit:当前还没有东西需要提交
2. 新增文件并写入内容
bash
# vim编辑器
vim 文件名

按下 [i] ,进入插入(insert)模式,输入内容

按下 [ESC] 退出插入模式,按下"yy"是复制,"p"是粘贴

按下 [:wq] 是保存并退出

3. 查看当前文件夹下文件
bash
ll

4. 查看文件内容
bash
cat hello.txt

5. 再次查看本地库状态
bash
git status

Untracked files:未被追踪的文件,只是存在于工作区当中
(三)将本地文件添加到暂存区
1.命令
添加到暂存区,意味着就是让git追踪文件
bash
git add 文件名

2. 再次查看本地仓库状态
bash
git status

此时hello.txt文件已经被git追踪到了,文件存在于暂存区当中
3. 可以从暂存区中删除文件
bash
git rm --cached 文件名
在工作区中,该文件仍然存在

但git此时已经没有再追踪文件

4. 批量添加文件至暂存区
bash
# 提交所有以txt结尾的文件到暂存区中
git add *.txt
bash
# 把当前文件夹下的所有文件都添加到暂存区中
# "."表示当前牧区
git add .
(四)提交本地仓库
提交只会提交暂存区之中的文件,而不会提交工作区中的其他文件
1.重新提交暂存区
文件添加到暂存区后,还没有形成自己的历史版本
我们先把刚刚从暂存区中删除的文件重新提交到暂存区中

2. 文件提交到本地仓库
bash
git commit -m "日志信息" 文件名

40244cb:即为版本号
main (root-commit) 40244cb\] 第一次提交于20251229 main主干分支有了第一次提交的版本,一个文件被改变,11行内容被插入 1 file changed, 11 insertions(+) create mode 100644 hello.txt
3. 再次查看本地库的状态

nothing to commit, working tree clean:已经提交过了,并且在提交后,没有对文件进行修改,工作树是干净的,说明没有东西需要再次提交
4. 查看版本信息
bash
git reflog

HEAD: 一个引用(refs,指向各个分支和标签的最新提交的指针) ,指向本地仓库最新版本
5. 查看详细日志
bash
git log

bash
# 只显示每次提交的ID和每次提交的日志信息
git log --oneline

(五)修改文件
1. 修改工作区文件
bash
vim 文件名

2. 再次查看本地库状态
bash
git status

修改被捕捉到了,但为红色 ,说明这次修改还没有被暂存区捕捉
3. 添加到暂存区
让暂存区追踪文件
bash
git add 文件名

4. 再次查看本地仓库状态

此时显示为绿色 ,意味着修改已经被git追踪到
5. 提交本地库
bash
git commit -m "日志信息" 文件名

一个文件被修改,3行新增,3行删除
为什么我们只是修改了其中的3行,没有删除,却提示我们有删除?
解释:在git中,是按照"行"来维护文件 ,修改了一行,git只能是先将修改之前的内容删除 , 再把修改后的内容新增进来
6. 查看本地库状态
bash
git status

7. 查看版本信息
bash
git reflog

我们可以看到,是有2次版本提交信息
而指针是指向最新的提交内容,我们可以查看文件内容

(六)历史版本
1. 命令
bash
# 查看版本信息
git reflog
# 查看版本详细信息
git log

2. 版本穿梭
bash
# 回退到某一个版本,丢弃工作区和暂存区中所有修改内容
git reset --hard 目标版本号
# 回退到某一版本,并保留工作区和暂存区的所有修改内容
git reset --soft 目标版本号
# 介于soft和hard之间,回退到某一版本,并且只保留工作区的修改内容
# 丢弃暂存区的修改内容
git reset --miexed 目标版本号


再次查看版本信息,发现指针已经移动到了目标版本
bash
git reflog

再次查看文件内容,发现文件内容回归目标版本

电脑磁盘目录也可以查看


向后穿梭,穿梭到最新的版本

(七)查看差异
1. 修改工作区文件

在最后一行添加内容

2. 工作区VS暂存区
bash
git diff

- - 开头的行 :代表**[被删除/原来]**的内容
- +开头的行 :代表**[新增/我们修改]**的内容
- 这里跟我们之前解释的一样,git会先删除,在新增,所以显示我们删除一行,新增一行修改后的内容
- 这个修改只在工作区,还没add到暂存区
✅核心特点:
- 只看 **[工作区和暂存区]**的差异,不涉及本地仓库
- 如果我们工作区和暂存区的内容一模一样,执行此命令后,终端无输出,代表无差异
3. 暂存区VS本地仓库
基于上一步我们已经在工作区中修改了hello.txt,首先将修改提交到暂存区
bash
git add hello.txt
执行查看差异命令
bash
# 或执行效果完全一样的:git diff --staged
git diff --cached

- 和上一步执行git diff的输出结果一模一样,还是显示我们修改了内容
- 我们已经把对hello.txt的修改放到了暂存区,这个修改和仓库里最新版本的hello.txt相比,改动了一行内容
✅核心特点:
- 只看**[暂存区和仓库最新版]**的差异,不涉及工作区
- 如果我们暂存区和仓库最新版的内容一模一样,执行此命令后,终端无输出,代表无差异
4. 工作区VS本地仓库最新版
一步查看 [所有我们还没有提交到仓库的修改],不管我们有没有执行 git add 添加到暂存区,只要是没有commit的修改,命令全都能查出来
bash
git diff HEAD

- 不管有没有 add,只要没有 commit,所有修改全都罗列出来
- 比如:我们修改了 hello.txt,一部分内容 add 到暂存区,一部分没 add,用这条命令能一次性看到所有未提交的修改,不用分两次查
- 如果我们的 工作区+暂存区以及仓库最新版本的内容完全一致,执行命令后,终端无任何输出
5. 本地仓库版本之间的对比
是**「仓库里的两个历史版本」** 之间做对比,完全不碰工作区、完全不碰暂存区 ,只看历史提交的差异!
bash
git diff HEAD HEAD~
# 上上版本可以表示为HEAD~~,以此类推;也可以表示为HEAD~2

- 实际上比较的是,相较于最新版本,上一次提交的版本做了哪些改动
bash
git diff 版本A 版本B
以 【版本A】为基准版本,查看【版本B】相对于【版本A】做了哪些改动
- 以 - 开头的行 → 【在基准版本 A 里有,但是在版本 B 里被删除了】
- 以 + 开头的行 → 【在基准版本 A 里没有,但是在版本 B 里新增了】
- 无符号的行 → 【版本 A 和版本 B 里完全一样,没改动】
(八)删除相关命令
1. 删除工作区的物理文件
bash
# rm 你电脑操作系统(Windows/Mac/Linux)自带的删除命令,和 Git 一点关系都没有
rm 文件名

可以发现在工作区中已经没有了先前的文件

- 这个命令 只操作「工作区」 ,完全不碰 Git 的暂存区、完全不碰本地仓库
2. 查看本地库状态

- 红色提示 的含义:Git 检测到「工作区的 hello.txt 被删了」,但这个「删除操作」还没有被加到暂存区,Git 只是给你一个「提醒」。
3. 后续1:恢复文件
删除文件后,后悔了,想把文件重新找回
bash
git restore hello.txt


- 默认的恢复数据源是 [暂存区]
4. 后续2:确认删除
确认要删除这个文件,想让 Git 也记录「文件被删除」这件事,需手动把「删除状态」加到暂存区

执行后再看状态

- 「删除文件」这个操作已经进入暂存区,等待执行 commit 提交到仓库。
5. git删除命令
(1)先恢复我们已删除的文件(此时都已经在暂存区中删除了)
撤回暂存区的 [删除状态]
bash
git restore --staged hello.txt
再次查看状态,会看到熟悉的红色提示

(2)恢复文件到工作区


(3)执行git删除命令
bash
git rm hello.txt
这条命令实现了:
(1)删除「工作区」的【物理文件】 ,电脑文件夹里的 hello.txt 消失了
(2)把「文件被删除」的状态,自动加到 Git 的暂存区:不用手动执行 git add

6. --cached参数的删除指令
(1)先按照上一步恢复文件
bash
git restore --staged hello.txt
git restore hello.txt

(2)执行带--cached参数的删除命令
bash
git rm --cached hello.txt
- 保留「工作区的物理文件」(文件还在文件夹里)
- 只删除「Git 对这个文件的追踪关系」(Git 从此以后,再也不管这个文件了)
- 同时把「解除追踪」的状态,自动加到 Git 的暂存区


7. 提交本地仓库
bash
git commit -m "备注信息"
提交完成后就会固化到本地仓库