一:git概述
Git 本质上就是版本控制系统
Git 可以管理电脑上的大部分文件,比如:
bash
.cpp
.h
.txt
.md
.html
.css
.js
.doc
图片
视频
其中,文本文件git可以知道你到底改了哪一行?
而,二进制文件git大概知道你的文件的大小的变化.
二:创建代码仓库的基本步骤
1.创建文件夹
首先在;linux机器里面创建一个文件夹gitcode
2.git init
进入文件夹,紧接着对git进行初始化
3.配置用户名和邮箱
有俩方式,一个是给当前仓库配置,还有一个是给全局配置
我的理解就是,如果你在当前仓库配置了用户名和邮箱,那么就用这个,如果你配置了全局,这个时候就用就近的.
就近原则
局部创建与查看
bash
git config user.name "xxx"
git config user.email "xxxxxx"
git config -l
全局创建与查看
bash
git config --global user.name "xxxxx"
git config --global user.email "xxxxx"
git config --global -l
4.删除配置
删除当前仓库配置:
bash
git config --unset user.name
git config --unset user.email
删除全局配置:
bash
git config --global --unset user.name
git config --global --unset user.email
注意:
git config --global 设置的,就要用 git config --global --unset 删除。
三:工作区、暂存区、版本库

1.git add:添加到暂存区
把 README.md 加入暂存区:
bash
git add README.md
也可以一次性添加当前目录下所有修改:
bash
git add .
这两个区别是:
bash
git add README.md # 只添加 README.md
git add . # 添加当前目录下所有修改
新手阶段可以先多用指定文件:
bash
git add README.md
这样不容易把乱七八糟的文件加进去。
查看状态:
bash
git status
这时候会看到类似:
bash
Changes to be committed:
new file: README.md
说明文件已经进入暂存区,等待提交。
2.git commit:提交到版本库
提交命令:
bash
git commit -m "添加第一个 README 文件"
这里的 -m 是 message 的意思,也就是本次提交说明。
提交说明一定要认真写,不要偷懒 乱写:
因为以后你看历史记录时,要靠这个说明判断每次提交做了什么。
3.git log:查看提交记录
看历史提交:
git log
你会看到类似:
bash
commit xxxxxxxxxxxxxxxxxxxxxxxxx
Author: zjh <1234567890@qq.com>
Date: Sun May 31 16:00:00 2026 +0800
添加三个测试文件
这里面有几个关键信息:
bash
commit id # 每次提交的唯一编号
Author # 提交人
Date # 提交时间
提交说明 # -m 后面写的内容
其中 commit id 是一长串哈希值,不是 1、2、3 这种递增编号。
它长这样:
bash
3f4a9c7d8e...
以后版本回退、查看某次提交,都需要用到它。
>简洁查看提交记录
普通的 git log 内容比较多。
可以用:
bash
git log --pretty=oneline
或者更常用一点:
bash
git log --oneline
输出类似:
bash
a1b2c3d 添加三个测试文件
f4e5d6c 添加第一个 README 文件
这个更适合平时快速查看历史版本。
4.基础命令总结
bash
# 1. 创建目录
mkdir gitcode
cd gitcode
# 2. 初始化仓库
git init
# 3. 配置用户名和邮箱
git config --global user.name "zjh"
git config --global user.email "12345678990@qq.com"
# 4. 创建文件
echo "hello git" > README.md
# 5. 查看状态
git status
# 6. 添加到暂存区
git add README.md
# 7. 再次查看状态
git status
# 8. 提交到版本库
git commit -m "添加 README 文件"
# 9. 查看提交记录
git log
# 10. 简洁查看提交记录
git log --oneline
图:
| 命令 | 作用 |
|---|---|
git init |
初始化本地仓库 |
ls -a |
查看隐藏文件,比如 .git |
git config user.name "名字" |
配置当前仓库用户名 |
git config user.email "邮箱" |
配置当前仓库邮箱 |
git config --global user.name "名字" |
配置全局用户名 |
git config --global user.email "邮箱" |
配置全局邮箱 |
git config -l |
查看 Git 配置 |
git config --unset user.name |
删除当前仓库用户名配置 |
git config --global --unset user.name |
删除全局用户名配置 |
touch README.md |
创建文件 |
git status |
查看当前仓库状态 |
git add README.md |
添加指定文件到暂存区 |
git add . |
添加当前目录所有修改到暂存区 |
git commit -m "说明" |
提交到版本库 |
git log |
查看详细提交记录 |
git log --oneline |
简洁查看提交记录 |
四:.git 目录
1.index:暂存区
bash
zjh@VM-0-14-ubuntu:~/gitcode$ tree .git/
.git/
├── branches
├── config
├── description
├── HEAD
├── hooks
│ ├── applypatch-msg.sample
│ ├── commit-msg.sample
│ ├── fsmonitor-watchman.sample
│ ├── post-update.sample
│ ├── pre-applypatch.sample
│ ├── pre-commit.sample
│ ├── pre-merge-commit.sample
│ ├── prepare-commit-msg.sample
│ ├── pre-push.sample
│ ├── pre-rebase.sample
│ ├── pre-receive.sample
│ ├── push-to-checkout.sample
│ └── update.sample
├── info
│ └── exclude
├── objects
│ ├── info
│ └── pack
└── refs
├── heads
└── tags
9 directories, 17 files
上述就是git的目录
下面是修改过的目录
bash
zjh@VM-0-14-ubuntu:~/gitcode$ vim ReadMe
zjh@VM-0-14-ubuntu:~/gitcode$ git add .
zjh@VM-0-14-ubuntu:~/gitcode$ git commit -m "change ReadMe file"
[master (root-commit) 959af1b] change ReadMe file
1 file changed, 1 insertion(+)
create mode 100644 ReadMe
zjh@VM-0-14-ubuntu:~/gitcode$ tree .git/
.git/
├── branches
├── COMMIT_EDITMSG
├── config
├── description
├── HEAD
├── hooks
│ ├── applypatch-msg.sample
│ ├── commit-msg.sample
│ ├── fsmonitor-watchman.sample
│ ├── post-update.sample
│ ├── pre-applypatch.sample
│ ├── pre-commit.sample
│ ├── pre-merge-commit.sample
│ ├── prepare-commit-msg.sample
│ ├── pre-push.sample
│ ├── pre-rebase.sample
│ ├── pre-receive.sample
│ ├── push-to-checkout.sample
│ └── update.sample
├── index
├── info
│ └── exclude
├── logs
│ ├── HEAD
│ └── refs
│ └── heads
│ └── master
├── objects
│ ├── 15
│ │ └── b8f2a8ffc8a7789b65fdcf2505f23ea9e4dde0
│ ├── 28
│ │ └── bd2c7b4dbf3b6cbbc348e895531a541837fa8e
│ ├── 95
│ │ └── 9af1be07a65eac1ebd7e1d0d78ebcd17cf0662
│ ├── info
│ └── pack
└── refs
├── heads
│ └── master
└── tags
15 directories, 25 files
git add 之后,.git 里面会出现一个:index
这个 index 就是 Git 的暂存区。
2.HEAD:当前指针

执行命令:
bash
zjh@VM-0-14-ubuntu:~/gitcode$ cat .git/HEAD
ref: refs/heads/master
HEAD 指向 refs/heads/master
refs/heads/master 保存了什么?
执行一下命令:
bash
zjh@VM-0-14-ubuntu:~/gitcode$ cat .git/refs/heads/master
959af1be07a65eac1ebd7e1d0d78ebcd17cf0662
这个就是:最新一次提交的 commit id
也就是说:master 文件里面存的是最新提交的 commit id
所以关系是:HEAD → refs/heads/master → 最新 commit id
3.objects:对象库
执行:
bash
zjh@VM-0-14-ubuntu:~/gitcode$ tree .git/objects
.git/objects
├── 15
│ └── b8f2a8ffc8a7789b65fdcf2505f23ea9e4dde0
├── 28
│ └── bd2c7b4dbf3b6cbbc348e895531a541837fa8e
├── 95
│ └── 9af1be07a65eac1ebd7e1d0d78ebcd17cf0662
├── info
└── pack
5 directories, 3 files
你会看到很多两位字符命名的目录
Git 的对象通常包括:
commit 对象:保存一次提交的信息
tree 对象:保存目录结构
blob 对象:保存文件内容
4.基础命令
git status:查看当前仓库状态
bash
zjh@VM-0-14-ubuntu:~/gitcode$ git status
On branch master
nothing to commit, working tree clean
git diff:查看具体改了什么
bash
zjh@VM-0-14-ubuntu:~/gitcode$ git diff ReadMe
diff --git a/ReadMe b/ReadMe
index cf77958..ad251cf 100644
--- a/ReadMe
+++ b/ReadMe
@@ -1,2 +1,3 @@
hello1
hello2
+hello3
+ 表示新增
- 表示删除
注意:
git diff 是在你add之前的,如果你add了,那么这个修改就显示不出来了
5,修改文件的标准提交流程
bash
git status
git diff README.md
git add README.md
git status
git commit -m "修改 README 文件"
git status
git status # 看哪些文件变了
git diff # 看具体改了什么
git add # 把修改放入暂存区
git status # 确认已经进入暂存区
git commit -m # 提交到版本库
git status # 确认工作区干净
五:版本回退
1.git reset
该命令后面可以分别加:
bash
--soft
--mixed
--hard
Git 有三个区域:工作区 暂存区 版本库
reset 本质上一定会影响:版本库 HEAD 指向
但是是否影响工作区、暂存区,取决于参数。
1.1 git reset --soft commit_id
| 区域 | 是否回退 |
|---|---|
| 工作区 | 不回退 |
| 暂存区 | 不回退 |
| 版本库 | 回退 |
适合场景:commit 提交错了,但代码还想保留,而且还想保留在暂存区。
1.2. git reset --mixed commit_id
--mixed 是默认选项
| 区域 | 是否回退 |
|---|---|
| 工作区 | 不回退 |
| 暂存区 | 回退 |
| 版本库 | 回退 |
适合场景:commit 提交错了,想取消提交,也想取消 add,但代码还留在工作区。
1.3. git reset --hard commit_id
| 区域 | 是否回退 |
|---|---|
| 工作区 | 回退 |
| 暂存区 | 回退 |
| 版本库 | 回退 |
| 强制回到某个版本,当前没提交的东西可能直接没了。 |
1.4.回退到某个历史版本
先查看历史:
bash
git log --oneline
假设输出:
bash
999cead 修改 README 文件
58abc12 添加 README 文件
如果你想回到:
bash
58abc12
执行:
bash
git reset --hard 58abc12
然后查看 README.md:
bash
cat README.md
它就会回到旧版本。
2.HEAD
HEAD:表示当前版本。
HEAD^:表示上一个版本。
HEAD^^:表示上上个版本。
比如回退到上一个版本:
bash
git reset --hard HEAD^
3. git reflog
如果你回退之后,执行:
bash
git log --oneline
你可能发现之前的提交记录看不到了。
这时候怎么办?
用:
bash
git reflog
git reflog 会记录你本地 HEAD 的移动记录,包括:
bash
commit
reset
checkout
比如:
bash
999cead HEAD@{0}: reset: moving to HEAD^
58abc12 HEAD@{1}: commit: 添加 README 文件
999cead HEAD@{2}: commit: 修改 README 文件
你如果想回到 999cead,可以:
bash
git reset --hard 999cead
所以:
bash
git log # 看当前历史
git reflog # 看你本地操作过的历史
但是注意:
前提是你还能找到那个 commit id。
六:git reflog
所谓撤销修改,就是:我写了一些垃圾代码,不想要了,想恢复到之前干净的状态。
情况一:只改了工作区,还没有 git add
这时候修改只存在于:工作区,它还没有进入暂存区
解决方式:git checkout -- 文件名
注意中间的两个横线:
bash
--
因为 checkout 还有切换分支的含义
情况二:已经 git add,但是还没有 git commit
现在修改存在于:
bash
工作区
暂存区
但是还没有进入版本库。
分两步:
第一步,把暂存区撤掉:
bash
git reset HEAD README.md
这一步之后,修改还在工作区,但是不在暂存区了。
第二步,撤销工作区修改:
bash
git checkout -- README.md
完整命令:
bash
git reset HEAD README.md
git checkout -- README.md
执行完后:
bash
git status
工作区就干净了。
情况三:已经 git commit,但是还没有 git push
现在错误代码已经进入:
bash
工作区
暂存区
版本库
但是还没有推送到远程仓库。
解决方式:回退到上一个版本
bash
git reset --hard HEAD^
或者:
bash
git reset --hard HEAD~1
意思是:
把工作区、暂存区、版本库都回退到上一个版本。
三种撤销情况总结表
| 场景 | 修改在哪里 | 解决方式 |
|---|---|---|
| 只修改了工作区,没 add | 工作区 | git checkout -- 文件名 |
| 已经 add,没 commit | 工作区 + 暂存区 | git reset HEAD 文件名 + git checkout -- 文件名 |
| 已经 commit,没 push | 工作区 + 暂存区 + 版本库 | git reset --hard HEAD^ |
七:删除文件:rm + git add + git commit
1.复杂删除
就和提交文件一样,你在工作区删除了code.cc
那么你就需要add cmmit 这个样就可以影响到暂存区和版本库
2.简化删除:git rm
Git 提供了一个更简单的命令:
bash
git rm file4
它等价于帮你做了两件事:
bash
rm file4
git add file4
也就是:
bash
删除工作区文件
并且把删除操作加入暂存区
所以你只需要再 commit:
bash
git commit -m "删除 file4"
完整流程:
bash
git rm file4
git commit -m "删除 file4"
| 命令 | 做了什么 | 后面还需要 |
|---|---|---|
rm file5 |
只删除工作区文件 | git add file5 + git commit |
git rm file5 |
删除工作区文件,并加入暂存区 | git commit |
八:总结表-
| 分类 | 命令 | 作用 | 重点理解 / 使用场景 |
|---|---|---|---|
| 创建目录 | mkdir gitcode |
创建一个项目目录 | 先准备一个普通目录,用来放项目文件 |
| 进入目录 | cd gitcode |
进入项目目录 | 后续 Git 操作一般都在项目目录下执行 |
| 初始化仓库 | git init |
初始化 Git 本地仓库 | 执行后会生成 .git 隐藏目录 |
| 查看隐藏文件 | ls -a |
查看当前目录下的隐藏文件 | 可以确认是否生成了 .git |
| 查看目录结构 | tree .git |
查看 .git 目录结构 |
学习 Git 内部原理时使用 |
查看 .git 内容 |
ls .git |
查看 .git 目录下有哪些文件 |
常见有 HEAD、objects、refs、index 等 |
| 当前仓库配置用户名 | git config user.name "zjh" |
给当前仓库配置用户名 | 只对当前仓库生效 |
| 当前仓库配置邮箱 | git config user.email "1937228573@qq.com" |
给当前仓库配置邮箱 | 只对当前仓库生效 |
| 全局配置用户名 | git config --global user.name "zjh" |
配置全局用户名 | 当前电脑所有 Git 仓库默认使用这个用户名 |
| 全局配置邮箱 | git config --global user.email "1234567890@qq.com" |
配置全局邮箱 | 当前电脑所有 Git 仓库默认使用这个邮箱 |
| 查看所有配置 | git config -l |
查看当前生效的 Git 配置 | 会同时显示全局配置和当前仓库配置 |
| 查看全局配置 | git config --global -l |
只查看全局配置 | 用来确认全局用户名和邮箱 |
| 删除当前仓库用户名 | git config --unset user.name |
删除当前仓库的用户名配置 | 不影响全局配置 |
| 删除当前仓库邮箱 | git config --unset user.email |
删除当前仓库的邮箱配置 | 不影响全局配置 |
| 删除全局用户名 | git config --global --unset user.name |
删除全局用户名配置 | 删除 --global 设置的内容必须加 --global |
| 删除全局邮箱 | git config --global --unset user.email |
删除全局邮箱配置 | 删除全局配置时使用 |
| 创建文件 | touch README.md |
创建一个空文件 | Linux 下常用创建文件命令 |
| 写入内容 | echo "hello git" > README.md |
向文件写入内容,覆盖原内容 | > 会覆盖原文件内容 |
| 追加内容 | echo "hello world" >> README.md |
向文件末尾追加内容 | >> 不会覆盖原内容 |
| 查看文件内容 | cat README.md |
查看文件内容 | 用来确认文件当前内容 |
| 查看仓库状态 | git status |
查看工作区、暂存区状态 | 最常用命令之一,能看到哪些文件被修改、哪些文件已暂存 |
| 添加指定文件到暂存区 | git add README.md |
把指定文件的修改添加到暂存区 | add 添加的是"修改",不是简单添加文件 |
| 添加多个文件到暂存区 | git add file1 file2 file3 |
一次性添加多个文件到暂存区 | 多个文件名之间用空格隔开 |
| 添加当前目录所有修改 | git add . |
把当前目录下所有修改添加到暂存区 | 新手慎用,容易把不想提交的文件也加进去 |
| 提交到版本库 | git commit -m "添加 README 文件" |
把暂存区内容提交到版本库 | -m 后面写本次提交说明 |
| 查看详细提交记录 | git log |
查看完整提交历史 | 包括 commit id、作者、时间、提交说明 |
| 简洁查看提交记录 | git log --oneline |
一行显示一个提交记录 | 日常更常用,方便看历史版本 |
| 另一种一行日志 | git log --pretty=oneline |
一行显示一个提交记录 | 老师课上使用过这种写法 |
| 查看工作区和暂存区差异 | git diff |
查看还没有 git add 的修改内容 |
默认比较工作区和暂存区 |
| 查看指定文件差异 | git diff README.md |
查看某个文件具体修改了什么 | 能看到哪一行新增、删除、修改 |
| 查看版本库和工作区差异 | git diff HEAD -- README.md |
查看当前版本库和工作区的区别 | HEAD 表示当前版本 |
| 查看 HEAD 指向 | cat .git/HEAD |
查看 HEAD 当前指向哪个分支 | 常见结果是 ref: refs/heads/master |
| 查看 master 指向 | cat .git/refs/heads/master |
查看 master 当前指向的 commit id | 里面保存的是最新一次提交的 commit id |
| 查看 Git 对象 | git cat-file -p commit_id |
查看某个 Git 对象的内容 | 可以查看 commit、tree、blob 对象 |
| 查看当前版本 | HEAD |
表示当前版本 | 常用于 reset、diff 等命令 |
| 表示上一个版本 | HEAD^ |
表示当前版本的上一个版本 | 常用于版本回退 |
| 表示上两个版本 | HEAD^^ |
表示当前版本的上上个版本 | ^ 可以连续写 |
| 表示上一个版本 | HEAD~1 |
表示当前版本往前 1 个版本 | 和 HEAD^ 类似 |
| 表示上两个版本 | HEAD~2 |
表示当前版本往前 2 个版本 | 数字表示往前几个版本 |
| 只回退版本库 | git reset --soft commit_id |
只让版本库回退,不动暂存区和工作区 | 代码和暂存区内容都保留 |
| 回退版本库和暂存区 | git reset --mixed commit_id |
回退版本库和暂存区,不动工作区 | --mixed 是默认选项 |
| 默认 reset | git reset commit_id |
默认等价于 git reset --mixed commit_id |
不写参数时就是 mixed |
| 强制回退所有区域 | git reset --hard commit_id |
工作区、暂存区、版本库全部回退 | 危险命令,会丢掉工作区修改,慎用 |
| 回退到上一个版本 | git reset --hard HEAD^ |
强制回退到上一个版本 | 已提交但没 push 时可用于撤销 commit |
| 回退到上一个版本 | git reset --hard HEAD~1 |
强制回退到上一个版本 | 和 HEAD^ 类似 |
| 回退到上两个版本 | git reset --hard HEAD~2 |
强制回退到上两个版本 | 根据数字决定回退几个版本 |
| 查看本地操作历史 | git reflog |
查看 HEAD 移动历史 | 用来找回被 reset 后 git log 看不到的 commit id |
| 根据 reflog 找回版本 | git reset --hard commit_id |
回到 reflog 中某个历史版本 | 前提是能找到对应 commit id |
| 撤销工作区修改 | git checkout -- README.md |
撤销 README.md 在工作区中的修改 | 适用于修改了文件但还没 git add |
| 新版撤销工作区修改 | git restore README.md |
撤销工作区修改 | 新版本 Git 推荐写法 |
| 取消暂存 | git reset HEAD README.md |
把 README.md 从暂存区撤回工作区 | 适用于已经 git add 但还没 git commit |
| 新版取消暂存 | git restore --staged README.md |
把文件从暂存区撤回来 | 新版本 Git 推荐写法 |
| 已 add 但未 commit 的完整撤销 | git reset HEAD README.md && git checkout -- README.md |
先取消暂存,再撤销工作区修改 | 对应"工作区 + 暂存区都有错误修改"的情况 |
| 已 commit 但未 push 的撤销 | git reset --hard HEAD^ |
回退到上一个提交 | 前提是还没有 push 到远程仓库 |
| 删除工作区文件 | rm file5 |
只删除工作区中的文件 | 删除后还需要 git add file5 |
| 提交删除操作到暂存区 | git add file5 |
把删除 file5 这个修改加入暂存区 | 删除也是一种修改,所以也可以 git add |
| 提交删除操作 | git commit -m "删除 file5" |
把删除操作提交到版本库 | 真正让版本库也删除该文件 |
| Git 删除文件 | git rm file4 |
删除工作区文件,并自动加入暂存区 | 等价于 rm file4 + git add file4 |
| 提交 git rm 删除 | git commit -m "删除 file4" |
提交删除操作 | git rm 后仍然需要 commit |
| 普通删除完整流程 | rm file5 && git add file5 && git commit -m "删除 file5" |
删除文件的三步流程 | 先删工作区,再加入暂存区,再提交 |
| Git 删除完整流程 | git rm file4 && git commit -m "删除 file4" |
删除文件的简化流程 | 推荐使用,少一步 |
| 最常用初始化流程 | mkdir gitcode && cd gitcode && git init |
创建目录并初始化仓库 | 新项目开始时使用 |
| 最常用提交流程 | git status && git add . && git commit -m "提交说明" |
查看状态、添加修改、提交版本 | 日常开发最常用流程 |
| 修改文件标准流程 | git status && git diff && git add README.md && git commit -m "修改 README 文件" |
修改文件后的标准提交步骤 | 先看状态和差异,再提交 |
| 查看历史标准流程 | git log --oneline |
快速查看提交历史 | 找 commit id 时常用 |
| 回退找回标准流程 | git reflog && git reset --hard commit_id |
找回历史版本 | reset 后后悔时使用 |
| 核心流程 | 工作区 --git add--> 暂存区 --git commit--> 版本库 |
Git 本地提交主线 | 必须记住 |
| 核心原则 | commit 只提交暂存区内容 |
没有 add 的内容不会被 commit | file4 add 了,file5 没 add,commit 时只提交 file4 |
| 核心原则 | Git 追踪的是修改,不是文件 |
新增、删除、修改都属于修改 | 所以删除文件后也要 git add |
| 核心警告 | 不要手动修改 .git 目录 |
.git 是版本库核心目录 |
乱改可能导致仓库损坏 |
| 核心警告 | git reset --hard 慎用 |
会回退工作区、暂存区、版本库 | 可能把没保存的代码直接干掉 |