Git 入门之道:从版本流转到基础操作

一: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 慎用 会回退工作区、暂存区、版本库 可能把没保存的代码直接干掉
相关推荐
dozenyaoyida21 分钟前
AI与大模型新闻日报 | 2026-09-30
大数据·人工智能·大模型·新闻
辻弋2011 小时前
【无标题】
大数据·服务器·前端·搜索引擎·开源软件
衡石科技1 小时前
让问数更自然:衡石 Data Agent 实践
大数据·bi·数据权限·data agent·自然语言问数
实验室管理云平台1 小时前
应用盛元广通的SPF系统后,养殖场死亡率降低约20%
大数据·人工智能
火山引擎和TA的超级拍档们4 小时前
产品情报局 04|客服Agent:大模型时代的智能客服新范式
大数据·人工智能
鲸能云4 小时前
【AI Agent】光储运维从 “展示数据“ 到 “自主决策“:运维 AI Agent 落地实践拆解
大数据·人工智能·ai agent·智能运维·光伏储能
Elastic 中国社区官方博客4 小时前
Kubernetes attributes processor v1:它对 EDOT Collector 意味着什么
java·大数据·elasticsearch·搜索引擎·贪心算法·kubernetes·全文检索
2601_955662464 小时前
文本转语音(TTS)技术选型与工程实践
大数据·人工智能·音视频·语音识别·媒体
Elastic 中国社区官方博客5 小时前
Elasticsearch Serverless 如何通过 hollow shards 将索引节点关闭次数降低 30%
大数据·数据库·elasticsearch·搜索引擎·serverless·全文检索
港股研究社5 小时前
餐饮IPO冰封期,袁记食品的“供应链平台”启示
大数据·人工智能·物联网