🔥个人主页: Milestone-里程碑
❄️个人专栏: <<力扣hot100>> <<C++>><<Linux>>
🌟心向往之行必能至
目录
[一 .git初识](#一 .git初识)
[2.1 Linux(centos/ubuntu)](#2.1 Linux(centos/ubuntu))
[2.2 Windows](#2.2 Windows)
[3.1 创建本地仓库](#3.1 创建本地仓库)
[3.2 三大核心工作区:工作区 暂存区 版本库](#3.2 三大核心工作区:工作区 暂存区 版本库)
[工作区(Working Directory)------你的"代码实验室"](#工作区(Working Directory)——你的“代码实验室”)
[暂存区(Staging Area)------代码的"待机区"](#暂存区(Staging Area)——代码的“待机区”)
[五.git本地的核心操作:添加 提交和查看历史命令](#五.git本地的核心操作:添加 提交和查看历史命令)
[5.1 添加文件到仓库(工作区->暂存区->版本库)](#5.1 添加文件到仓库(工作区->暂存区->版本库))
[5.2 查看历史提交命令](#5.2 查看历史提交命令)
[5.3 查看.git文件](#5.3 查看.git文件)
一 .git初识
在没有版本控制工具之前,我们管理文件版本的方式往往是"复制副本"--比如:

这种操作存在明显两个明显缺点
- 版本混乱:随着版本的不断增多,无法清晰的知道每个版本修改的内容
- 协作困难:多人协作不方便,同时修改一个文件容易造成一些问题
因此就有大佬发明了版本控制器,
为了能够更⽅便我们管理这些不同版本的⽂件,便有了版本控制器。所谓的版本控制器,就是能让你 了解到⼀个⽂件的历史,以及它的发展过程的系统。通俗的讲就是⼀个可以记录⼯程的每⼀次改动和 版本迭代的⼀个管理系统,同时也⽅便多⼈协同作业。
目前主流的版本控制器就是git,也是我们要学习的,
Git 可以控制电脑上所有格式的⽂件,例如 doc、excel、dwg、dgn、rvt等等。对于我们开发⼈员来说,Git 最重要的就是可以帮助我们管理软件开发项⽬中的源代码⽂件**!**
注意事项: 所有的版本控制系统,Git 也不例外,只能跟踪⽂本⽂件的改动(TXT文件,网页,程序代码...),和每次代码改动的细节。
eg:⽐如在第5⾏加了⼀个单词 "Linux",在第8⾏删了⼀个单词 "Windows"。
⽽图⽚、视频这些⼆进制⽂件,虽然也能由版本控制系统管理,但没法跟踪⽂件的变化,只能把⼆进 制⽂件每次改动串起来,也就是只知道图⽚从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。
二.Git安装
支持跨平台操作
Git 是开放源代码的代码托管⼯具,最早是在Linux下开发的。开始也只能应⽤于Linux平台,后⾯慢慢的被移植到windows下,现在,Git可以在Linux、Unix、Mac和Windows这⼏⼤平台上正常运⾏了。
2.1 Linux(centos/ubuntu)
centos
bash
# 1. 检查是否已安装 Git(未安装会提示 "command not found")
[root@VM-4-4-centos ~]# git
# 2. 安装 Git,普通账户需要sudo,root不用
[root@VM-4-4-centos ~]# (sudo) yum -y install git
# 3. 验证安装(显示版本号即成功)
[root@VM-4-4-centos ~]# git --version
ubuntu 操作类似,只是安装变为了
bash
sudo apt-get install git -y
2.2 Windows
参考链接:3.安装git和图形化界面工具_哔哩哔哩_bilibili
三.Git本地仓库核心:初始化与概念
3.1 创建本地仓库
仓库是进⾏版本控制的⼀个⽂件⽬录。我们要想对⽂件进⾏版本控制,就必须先创建
⼀个仓库出来。
创建⼀个 Git 本地仓库对应的命令为 git init ,注意命令要在⽂件⽬录下执⾏,例如:
bash
//1.创建目录
lcb@hcss-ecs-1cde:~$ mkdir gitcode
lcb@hcss-ecs-1cde:~$ cd gitcode
lcb@hcss-ecs-1cde:~/gitcode$ ls
//2.初始化仓库
lcb@hcss-ecs-1cde:~/gitcode$ git init
Initialized empty Git repository in /home/lcb/gitcode/.git/
//3.查看仓库
lcb@hcss-ecs-1cde:~/gitcode$ ls -a
. .. .git
我们发现,当前⽬录下多了⼀个 .git 的隐藏⽂件, .git ⽬录是 Git 来跟踪管理仓库的,不要**⼿动**
修改这个⽬录⾥⾯的⽂件,不然改乱了,就把 Git 仓库给破坏了。
其中包含 Git 仓库的诸多细节,有兴趣的同志可以进⼊看看
bash
lcb@hcss-ecs-1cde:~/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
3.2 三大核心工作区:工作区 暂存区 版本库
Git本地仓库的操作过程/文件的提交过程 ,工作区->暂存区->版本库
工作区(Working Directory)------你的"代码实验室"
-
定义:肉眼可见的项目目录,所有文件修改的"第一现场"。
-
特点:
-
直接编辑文件,修改实时生效。
-
未添加到暂存区的改动,Git不会跟踪!
-
暂存区(Staging Area)------代码的"待机区"
-
定义 :
.git/index文件,记录下一次提交的修改快照。 -
核心作用:
-
选择性提交 :通过**
git add** 挑选部分修改进入暂存区。 -
版本缓冲:允许分批次准备代码,再统一提交。
-
版本库(Repository)------代码的"时光机"
-
-
定义 :隐藏的
.git目录,存储项目的完整历史记录。 -
核心组成:
-
提交历史 :每次
git commit生成一个不可变的快照。 -
分支与标签:管理代码演进的指针。
-
-

图中左侧为工作区,右侧为版本库
- git在创建仓库时,会自动创建一个且只有一个master分支,和一个指向master的HEAD指针
- objects就是版本控制器,记录每一版本,其中暂且区和master都有索引,指向objects
- 在对工作区修改/新增文件,再通过git add时,暂存区目录树的文件索引会新增修改
- 当执行命令git commit,master分支做出更新,此时本地仓库修改/新增的才真正写入版本库
三者操作流程:在工作区修改文件->git add提交到暂存区 ->git commit再将暂存区的变化提交到版本库
四.Git配置:设置用户身份
git每次提交都会记录提交者的用户信息,因此初始化仓库需要配置好个人信息,优先配置姓名与邮箱
bash
//配置姓名和邮箱
lcb@hcss-ecs-1cde:~/gitcode/.git$ git config user.name "Milestone"
lcb@hcss-ecs-1cde:~/gitcode/.git$ git config user.email "123456@qq.com"
//查看配置情况
lcb@hcss-ecs-1cde:~/gitcode/.git$ git config -l
user.name=19174291684
user.email=3451978561@qq.com
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
user.name=Milestone
user.email=123456@qq.com
//全局配置(当台电脑的所有git仓库都成立)
lcb@hcss-ecs-1cde:~/gitcode/.git$ git config --global user.name "XXX"
lcb@hcss-ecs-1cde:~/gitcode/.git$ git config --global user.email "XXX@qq.com"
lcb@hcss-ecs-1cde:~/gitcode/.git$ git config -l
user.name=XXX
user.email=XXX@qq.com
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
user.name=Milestone
user.email=123456@qq.com
//删除配置信息(global可带可不带)
lcb@hcss-ecs-1cde:~/gitcode/.git$ git config --global --unset user.name
lcb@hcss-ecs-1cde:~/gitcode/.git$ git config --global --unset user.email
- 建议姓名与邮箱与自己的gitee/GitHub一致,防止出现误解
- global不带上,无论是配置还是删除,都只在当前目录的仓库下生效
五.git本地的核心操作:添加 提交和查看历史命令
5.1 添加文件到仓库(工作区->暂存区->版本库)
Git文件添加需要经过暂存区,且支持单个或者多个文件操作
场景一:新增一个文件并提交
- **新建一个ReadMe文件,**打开输入Hello Milestone
- 添加到暂存区 :通过git add ReadMe将文件添加到暂存区
- **提交到版本库:**使用git commit -m"",双引号内部填充你提交的目的,一定要 也可指定文件提交
提交成功后,Git 会提示 "1 file changed, 1 insertions (+)",表示 "1 个文件被修改,新增 1 行内容",符合预期。
bash
lcb@hcss-ecs-1cde:~/gitcode$ vim ReadMe
lcb@hcss-ecs-1cde:~/gitcode$ git add ReadMe
lcb@hcss-ecs-1cde:~/gitcode$ git commit -m"add first file"
[master (root-commit) ef866eb] add first file
1 file changed, 1 insertion(+)
create mode 100644 ReadMe
场景二:批量添加多个文件
- 创建多个文件,touch file1 file2 file 3
- 提交到暂且区,既可git 文件名一个一个提交 也可git 文件名1 文件名2...,一次提交多个, 也可以git ,,提交当前目录的所有文件
- 提交到版本库,git commit -m"add 3 files" ,同时可以看到文件变化
bash
lcb@hcss-ecs-1cde:~/gitcode$ touch file1 file2 file3
lcb@hcss-ecs-1cde:~/gitcode$ git add file1
lcb@hcss-ecs-1cde:~/gitcode$ git add file2 file3
lcb@hcss-ecs-1cde:~/gitcode$ git commit -m"add 3 files"
[master d908770] add 3 files
3 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 file1
create mode 100644 file2
create mode 100644 file3
5.2 查看历史提交命令
用git log命令可查看所有提交记录,支持多种格式展示:
- 完整历史:
git log,显示每个版本的作者、提交时间、提交说明及commit id(版本号); - 简化展示:
git log --pretty=oneline,一行显示一个版本,包含commit id和提交说明
bash
lcb@hcss-ecs-1cde:~/gitcode$ git log
commit d908770ac1a99192cb8f272a3f4cb0ef9397ba99 (HEAD -> master)
Author: Milestone <3451978561@qq.com>
Date: Sun Jan 11 10:21:25 2026 +0800
add 3 files
commit ef866eba4f5a0727c0ce203db456b4e098743da1
Author: Milestone <3451978561@qq.com>
Date: Sun Jan 11 10:13:41 2026 +0800
add first file
lcb@hcss-ecs-1cde:~/gitcode$ git log --pretty=oneline
d908770ac1a99192cb8f272a3f4cb0ef9397ba99 (HEAD -> master) add 3 files
5.3 查看.git文件
先来看看.git的目录结构
bash
lcb@hcss-ecs-1cde:~/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
│ ├── 14
│ │ └── db9e31a49e865f88d288e094b8f966cfb61af4
│ ├── 93
│ │ └── 405992a282d22cca0d036c5f58279be5d1bee7
│ ├── a2
│ │ └── 35663f71d81435036448d67e6f7745450d4200
│ ├── d9
│ │ └── 08770ac1a99192cb8f272a3f4cb0ef9397ba99
│ ├── e6
│ │ └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
│ ├── ef
│ │ └── 866eba4f5a0727c0ce203db456b4e098743da1
│ ├── info
│ └── pack
└── refs
├── heads
│ └── master
└── tags
18 directories, 28 files
- index就是我们的暂存区,我们git add文件就是提交到这里
- HEAD就是指向master分支的指针
bash
lcb@hcss-ecs-1cde:~/gitcode$ cat .git/HEAD
ref: refs/heads/master
//master的默认分支
lcb@hcss-ecs-1cde:~/gitcode$ cat .git/refs/heads/master
d908770ac1a99192cb8f272a3f4cb0ef9397ba99
d908770ac1a99192cb8f272a3f4cb0ef9397ba99,这个打印出来的就是最新commit的id
- objects 为 Git 的对象库,⾥⾯包含了创建的各种版本库对象及内容。当执⾏ git add 命令
时,暂存区的⽬录树被更新,同时⼯作区修改(或新增)的⽂件内容被写⼊到对象库中的⼀个新的对象中,就位于 ".git/objects" ⽬录下,让我们来看看这些对象有何⽤处:
bash
lcb@hcss-ecs-1cde:~/gitcode$ ls .git/objects
14 93 a2 d9 e6 ef info pack
查找 object 时要将 commit id 分成2部分,其前2位是⽂件夹名称,后38位是⽂件名称。
找到这个⽂件之后,⼀般不能直接看到⾥⾯是什么,该类⽂件是经过 sha (安全哈希算法)加密过的⽂件,好在我们可以使⽤git cat-file 命令来查看版本库对象的内容:
bash
lcb@hcss-ecs-1cde:~/gitcode$ git cat-file -p d908770ac1a99192cb8f272a3f4cb0ef9397ba99
tree 93405992a282d22cca0d036c5f58279be5d1bee7
parent ef866eba4f5a0727c0ce203db456b4e098743da1
author Milestone <3451978561@qq.com> 1768098085 +0800
committer Milestone <3451978561@qq.com> 1768098085 +0800
add 3 files
我们可以发现这就是我们最近的一次提交
其中,还有一行 tree 93405992a282d22cca0d036c5f58279be5d1bee7,我们使用同样的方法,看看结果:
bash
lcb@hcss-ecs-1cde:~/gitcode$ git cat-file -p 93405992a282d22cca0d036c5f58279be5d1bee7
100644 blob a235663f71d81435036448d67e6f7745450d4200 ReadMe
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 file1
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 file2
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 file3
我们再对ReadMe对应的a235663f71d81435036448d67e6f7745450d4200查看,发现就是我们提交的内容
bash
lcb@hcss-ecs-1cde:~/gitcode$ git cat-file -p a235663f71d81435036448d67e6f7745450d4200
Hello Milestone
总结
- index: 暂存区, git add 后会更新该内容。
HEAD: 默认指向 master 分支的⼀个指针。
refs/heads/master: 文件里保存当前 master 分支的最新 commit id (git commit后会更新) 。
objects: 包含了创建的各种版本库对象及内容,可以简单理解为放了 git 维护的所有修改。(一层一层查询,可查看提交内容)
六.Git追踪管理的是修改

- 对前面的ReadMe文件进行添加Hello world
- 使用git status,查看状态
bash
lcb@hcss-ecs-1cde:~/gitcode$ vim ReadMe
lcb@hcss-ecs-1cde:~/gitcode$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: ReadMe
可以发现,它提示我们master没有修改,但工作区的ReadMe进行了修改
如果只是普通 小型文件,我们使用cat可以,但如果一个大项目呢?
- 使用 git diff 文件名
bash
lcb@hcss-ecs-1cde:~/gitcode$ git diff ReadMe
diff --git a/ReadMe b/ReadMe
index a235663..317320a 100644
--- a/ReadMe
+++ b/ReadMe
@@ -1 +1,2 @@
Hello Milestone
+Hello world
- 其中a/ReadMe就是修改前 b/ReadMe就是修改后
- 而 -也代表修改前,-1 就代表修改前的第一行内容
- +代表修改后 +1,2 代表修改后的第一行到第二行内容
将ReadMe提交再查看状态
bash
lcb@hcss-ecs-1cde:~/gitcode$ git add ReadMe
lcb@hcss-ecs-1cde:~/gitcode$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: ReadMe
lcb@hcss-ecs-1cde:~/gitcode$ git commit -m"modify ReadMe"
[master 9abf140] modify ReadMe
1 file changed, 1 insertion(+)
lcb@hcss-ecs-1cde:~/gitcode$ git status
On branch master
nothing to commit, working tree clean
可以发现
- git add后,提示我们暂存区被修改了,和被修改的文件
- git commit后告诉我们,没有被修改的了
