目录
1.Git,Github,Gitee
那么咱们在讲解git之前,肯定得知道他们三者之间是什么关系吧
-
Git :是引擎 ,是核心的版本控制工具。
-
GitHub / Gitee :是车库 或协作车间 ,是基于 Git 的在线托管平台

那么这张图就可以很好的诠释他们之间的关系
Git:版本控制系统的核心
Git 是一个开源的分布式版本控制系统。它由 Linus Torvalds 创建,用于跟踪文件(尤其是代码文件)的变化。
GitHub:基于 Git 的全球性社交化编程平台
GitHub 是一个在线代码托管平台,它使用 Git 作为其底层的版本控制技术
-
远程仓库托管:为你提供一个在云端的 Git 仓库,你可以将本地仓库推送到 GitHub 上进行备份和共享。
-
协作功能 :提供了强大的代码协作工具,最著名的是 Pull Request,让开发者可以方便地审查代码、讨论修改并合并贡献。
GitHub 不提供 Git ,它基于 Git 并为其添加了 Web 界面和强大的协作功能。它是 Git 的服务器端。由于其庞大的社区,它已成为全球开源项目的中心。
Gitee(码云):中国本土化的 GitHub 替代品
Gitee 是由中国公司 OSCHINA 推出的在线代码托管平台,同样使用 Git 作为其底层技术。
Gitee 提供了与 GitHub 几乎相同的核心功能:
-
远程 Git 仓库托管。
-
Pull Request(在 Gitee 中称为 "Pull Request" 或 "合并请求")。
-
Issue 跟踪、Wiki、Webhook 等
-
关键点:
-
定位:它常被称为 "中国的 GitHub"。
-
优势:
-
访问速度:服务器在中国大陆,对国内用户来说,访问和克隆速度通常远快于 GitHub。
-
合规性与本地化:更符合中国的法律法规,并提供全中文的界面和文档,对中文用户更友好。
-
生态集成:与国内的云服务、CI/CD 工具等集成更好。
-
-
区别:社区规模和全球影响力目前不及 GitHub,但其在国内的普及率非常高。
-
可以怎么理解呢,就是git是版本控制器(它是核心),而gitee,github只是提供了一个代码版本管理的平台,就是在git这个核心的基础上,添加的web界面而已。而gitee是本土的,github则是全球范围内的,因为一些国际因素,访问github不是很快,所以就创造出了本土的可以代替github的gitee
| 项目 | Git | GitHub | Gitee |
|---|---|---|---|
| 本质 | 工具/协议 | 基于 Git 的服务/平台 | 基于 Git 的服务/平台 |
| 定位 | 版本控制引擎 | 全球社交化编程平台 | 中国本土化代码托管平台 |
| 使用场景 | 本地版本控制 | 全球开源协作、项目展示 | 国内团队协作、快速访问、合规需求 |
| 依赖关系 | 是核心,不依赖其他两者 | 依赖 Git 作为底层技术 | 依赖 Git 作为底层技术 |
| 如何工作 | 通过 git 命令在本地操作 |
通过 git 命令与远程仓库交互,并通过 Web 界面管理 |
通过 git 命令与远程仓库交互,并通过 Web 界面管理 |
2.Git是一个去中心化的版本控制器
什么叫做去中心化呢?
先搞懂:什么是「版本控制」?
在讲去中心化之前,咱们先把基础概念落地。所谓版本控制 ,说白了就是给文件/项目做「时光机+备份册」。
举个生活中的例子:
你写毕业论文,改了一版又一版,为了不弄丢之前的内容,只能不停另存为:
-
论文_初稿.doc
-
论文_修改1版.doc
-
论文_最终版.doc
-
论文_最终定稿版.doc
-
论文_打死不改版.doc
是不是越改越乱?想找回某一版的一句话,翻半天找不到;多人一起改论文,还容易出现「你改了我也改,最后版本冲突全乱套」的情况。
版本控制工具,就是解决这个问题的。
它能自动记录每一次修改:谁改的、改了什么、什么时候改的,想回退到任意版本一键就能搞定,多人协作也不会乱。而Git,就是目前最主流、最好用的版本控制工具,核心特点就是去中心化。
重点来了:Git的「去中心化」到底是啥?
想理解去中心化,咱们先对比它的反面------中心化,用「团队写文案」的场景一讲就透。
❌ 中心化模式:全靠一个「中心服务器」
传统的版本控制工具(比如SVN),就是典型的中心化。
可以理解成:所有文件都存在公司唯一一台电脑(中心服务器)上,所有人想改文件,必须连这台电脑。
-
A想改文案,要先从中心服务器下载文件;
-
改完必须立刻传回服务器,不然B就没法改;
-
一旦服务器宕机、断网,所有人都没法干活、没法看历史版本;
-
服务器硬盘坏了,整个项目的所有版本记录直接丢失,彻底凉凉。
这种模式就像「全班同学只能用老师的一本作业本写作业,谁写谁抢,还不能离老师太远」,死板又脆弱。
✅ Git去中心化模式:人人都是「中心」
Git彻底打破了这个规则,它的去中心化核心逻辑是:
没有唯一的中心服务器,每个人的电脑里,都有一份完整的项目副本+所有历史版本记录。
还是用「团队写文案」举例:
-
克隆项目 :你从远程仓库(比如Gitee、GitHub)复制项目时,不是只拿最新文件,而是把整个项目的所有版本、所有修改记录全下载到自己电脑;
-
本地操作:断网、没连远程仓库,照样改代码、写文案、提交修改、回退版本,所有操作都在本地完成,飞快又方便;
-
同步协作:联网后,把自己的修改推送到远程仓库,也能拉取别人的修改,远程仓库只是「大家同步内容的中转站」,不是必须依赖的中心;
简单总结:中心化是「大家围着一个中心转」,Git去中心化是「人人都有完整账本,想怎么改怎么改,同步时再对账」。
就是每个人都可以在自己的电脑中(本地仓库)修改代码,修改代码之后,再推送到远端仓库上面即可。
那么这里有个关键点,就是你的本地仓库的内容和远端仓库的内容不一致的时候,你这个时候直接push,是会起冲突的(一般就是一个仓库多个人使用,如果是一个仓库就你自己一个人使用,就不需要担心这个问题),那么这个时候,咱们就需要先git pull把远端仓库的内容给拉取出来,拉取出来之后,就可以确保远端的内同步到了本地,此时就可以push,就没有问题了
3.认识Gitee仓库

咱们来看这个创建的远程仓库
| 选项区域 | 具体字段 | 含义与建议 |
|---|---|---|
| 基础信息 | 仓库名称 | 仓库的显示名,如 gitee测试仓库,建议使用英文或拼音,便于识别。 |
| 归属 | 仓库属于你个人还是组织,截图中是你的个人账号,保持默认即可。 | |
| 路径 | 仓库的唯一访问标识(URL 后缀),如 gitee-testing-repository,这是代码克隆时的关键路径。 |
|
| 仓库介绍 | 可选,建议填写 C++/Qt 学习测试仓库,用于练习 Git 操作,方便日后回顾。 |
|
| 权限设置 | 开源 / 私有 | 截图选了开源 (所有人可见),如果是练习代码,开源无问题;若有隐私内容,建议改为私有。 |
| 初始化设置 | 初始化仓库 | 勾选后会自动生成基础文件,强烈建议勾选,避免仓库为空带来的麻烦。 |
| 选择语言 | 选了 C++,Gitee 会根据语言显示统计信息,符合你的学习方向。 |
|
| 添加 .gitignore | 选了 C++,这是核心!.gitignore 会自动忽略编译产生的 .o、exe 等无用文件,必须保留。 |
|
| 添加开源许可证 | 可选,学习阶段可以留空不选。 | |
| 模板与分支 | Readme 文件 | 勾选后生成说明文档,建议保留,可用于记录学习笔记。 |
| 分支模型 | 单分支模型(master),新手学习阶段足够用,无需修改。 |
其中,这个.gitignore文件还是很重要的,是因为如果说你的提交文件中,有不想要的文件,那么咱们直接把不想提交上去的那些文件的后缀名给添加到.gitignore文件中即可,这样的话,它push,就不会把你不想要添加的那些文件给推送到你的远端仓库了
4.如何在linux中推送代码到远程仓库呢?
其实,在这里,咱们需要知道的是,你的代码必须先放到本地仓库里面,然后放到本地仓库里面之后,你的本地仓库必须得跟远程仓库进行关联,这样之后,你的代码才可以推送到远端仓库
好,那么咱们来看一张图片

那么咱们在这里的关联仓库的方式,咱们直接采用克隆的方式吧,就是把远端仓库克隆到本地来
以我的这个为例子
# 复制你截图里的 git clone 命令
git clone git@gitee.com:people-disperse-at-all-costs/gitee-testing-repository.git
# 进入仓库目录
cd gitee-testing-repository
克隆完成后,本地仓库已经自动和远程关联好了,直接写代码、提交、推送即可。
但是,如果你的linux账号第一次使用git的话,在这个之前,还必须得做一件事情,那就是先配置 Git 身份
复制 Gitee 提示里的命令,在终端执行:
git config --global user.name '人因不惜而散'
git config --global user.email 'nihaishiyaolikai@qq.com'
- 生成并配置 SSH 密钥(如果还没做)
按截图里的步骤执行:
# 1. 生成 RSA 密钥(一路回车即可,不要设置密码)
ssh-keygen -t rsa
# 2. 查看公钥内容
cat ~/.ssh/id_rsa.pub
把输出的全部内容复制,粘贴到 Gitee 「设置 → SSH 公钥」里保存。
-
测试 SSH 连接是否成功
ssh -T git@gitee.com
看到 Hi 人因不惜而散! You've successfully authenticated... 就说明配置好了。

那么咱们最后克隆的时候,看到这种情况,就是已经克隆好了,就是你的远程仓库就已经克隆到了本地了,然后你提交代码,直接先提交到本地仓库,然后再push到远程仓库即可
别忘了进入你的那个本地仓库里面再进行提交
添加所有文件到暂存区 git add .
提交到本地仓库,备注信息写清楚 git commit -m "第一次提交,添加C++测试代码"
最后git push即可
这个其实也是,咱们提交代码的三板斧
你包括想在window上面提交你的代码到gitee仓库的话

比如,咱们提交gitee测试代码仓库的话
也是必须得先克隆,将远程仓库克隆到本地才可以


这个里面的url其实就是写

Gitee 仓库的完整地址
之后就可以正常的去提交就可以了
5.Git原理
Git 的三个工作区域:
-
工作区:你直接编辑文件的目录
-
暂存区:准备下次提交的文件列表
-
版本库:存储项目完整历史和元数据的地方

比如,咱们现在要把一个文件提交到gitee远程仓库中

记住这个核心关系:
-
git add = 把文件改动"标记"为准备提交
-
git commit = 把标记的文件"永久保存"为一个版本
-
git push = 把本地版本"同步"到远程仓库
好,那么咱们更加细节的来认识一下这几个:
工作区:
你写代码的文件夹(比如 gitee-testing-repository/):叫「工作区」(存放你能看到的代码文件,比如 test.c);

就是你看到的或者文件夹里面的就是工作区
暂存区:
工作区里的隐藏文件夹 .git/:这才是 Git 的「本地仓库核心」,包含所有版本记录、分支、暂存区、配置等关键数据;
暂存区(Stage/Index)是 .git 目录下的一个特殊文件(.git/index),可以理解成「待提交的临时清单」。
所以,暂存区是在.git目录里面的

而.git又是在工作区中的,那么咱们tree .git看看

那么这个index就是暂存区
而本地仓库就是:
「本地仓库」是一个整体概念:包含「工作区 + .git 目录(核心)」。
| 概念 | 类比 | 存储位置 | 核心作用 |
|---|---|---|---|
| 工作区 | 你的办公桌(放文件) | 可见的代码文件夹(如 test.c) | 你写代码、改代码的地方 |
| 暂存区 | 快递打包台 | .git/index 文件 | 临时存放「准备提交到仓库的修改」 |
| 本地仓库(.git) | 公司的档案库 | .git/ 目录(隐藏) | 永久保存所有提交的版本记录 |
你执行的 Git 命令,本质就是在这三者之间移动文件:
git add test.c→ 把工作区的 test.c 「打包」放到暂存区(.git/index);git commit -m "备注"→ 把暂存区的所有修改「归档」到本地仓库(.git/ 里的版本库);git push→ 把本地仓库的归档记录,同步到远程 Gitee 仓库。
暂存区属于本地仓库的一部分,且精准存储在 .git/index 文件中;
「本地仓库」是整体(工作区 + .git 目录),.git 目录 是本地仓库的核心(包含暂存区、版本记录等);
但是版本库呢?版本库又是在哪里呢?
.git/ 目录下的 objects/ 文件夹 就是 Git 的「版本库」------ 所有提交的代码、文件、版本记录,最终都会以「对象」的形式存在这里。

对,那么其实就是这个东西

那么咱们来看一下这个git里面都有什么吧

objects/:就是档案库本体,存着所有版本的代码、文件、提交记录index:就是快递打包台(暂存区),临时放你准备提交的修改refs/+HEAD:就是导航系统,告诉你现在在哪个分支、哪个版本- 其他文件:都是辅助工具(配置、钩子、日志等)
| 文件 / 文件夹 | 大白话作用 |
|---|---|
| branches/ | 老版本 Git 用来存分支的,现在基本不用了,忽略就行 |
| COMMIT_EDITMSG | 你上次写 git commit 时输入的提交信息,Git 临时存这里,方便你改 |
| config | 这个仓库的专属配置,比如远程仓库地址(origin)、用户信息等,只对当前仓库生效 |
| description | 仓库描述,给 Git 自带的网页工具看的,我们平时基本用不上 |
| HEAD | 当前位置导航 ,告诉你现在在哪个分支 / 哪个版本,比如 ref: refs/heads/master 就是「我在 master 分支」 |
| index | 暂存区(打包台) ,存你 git add 后的文件清单,准备提交到版本库的东西都在这 |
| info/ | 里面的 exclude 是本地忽略文件 ,和 .gitignore 功能一样,但只对你自己生效,不会被提交到仓库 |
| logs/ | 操作日志,记录你所有 checkout、commit、merge 操作,用来找回误操作的版本 |
| objects/ | 版本库本体(档案库),所有代码版本、文件内容、提交记录都存在这,是 Git 的核心数据 |
| packed-refs | 把多个 refs(分支 / 标签)打包成一个文件,提升查找效率,相当于把很多小纸条订成一本 |
| refs/ | 指针集合 ,每个分支 / 标签都是一个指针,指向 objects/ 里的具体版本 |
hooks/文件夹(钩子脚本)
里面都是 .sample 结尾的示例脚本,比如:
-
pre-commit.sample:提交前自动执行的脚本(比如检查代码格式、跑单元测试) -
pre-push.sample:推送前自动执行的脚本(比如检查是否有敏感信息) -
把
.sample去掉,就变成真正生效的钩子,能帮你自动化流程
类比:就像你家的「智能开关」,开门自动开灯、出门自动断电 ------Git 在特定时机(提交、推送)自动跑你写的脚本。
logs/文件夹(操作日志)
-
logs/HEAD:记录你所有切换分支、提交代码的操作历史 -
logs/refs/:按分支 / 远程仓库细分日志,比如logs/refs/heads/master只记录 master 分支的操作
类比:就像你的「手机通话记录」,能查到你什么时候切了分支、什么时候提交了代码,方便找回误操作。
objects/文件夹(版本库核心)
这是 Git 最核心的地方,所有版本数据都存在这:
-
像
36/、6b/、ef/这样的文件夹:按哈希值前两位分组,里面存的是具体的版本对象(代码、文件、提交记录) -
info/:辅助信息,基本不用管 -
pack/:把多个对象打包成.pack文件,提升传输和存储效率(克隆、推送时会用到)
类比:就像档案馆的文件柜 ,每个文件柜(
36/、6b/)里放着不同版本的「档案」(代码、提交记录),Git 用哈希值当档案编号。
refs/文件夹(指针集合)
-
refs/heads/:本地分支指针 ,比如refs/heads/master就是 master 分支,里面存着一串哈希值,指向objects/里的最新提交 -
refs/remotes/:远程分支指针 ,比如refs/remotes/origin/master记录了远程仓库 origin 上 master 分支的最新版本 -
refs/tags/:标签指针,给某个版本起个固定名字(比如 v1.0),方便以后快速找到这个版本
类比:就像地图上的书签 ,
master、v1.0都是书签,指向objects/里的具体档案位置。
总结:
.git/objects/:Git 的「历史档案馆」,存所有版本数据index:Git 的「打包台」,暂存你准备提交的修改refs/+HEAD:Git 的「导航系统」,告诉你现在在哪个分支、哪个版本- 其他文件:都是辅助工具,帮你管理配置、自动化流程、记录操作
好,那么还有几个git的指令
git log

就是查看最近的一个提交日志

而git status就是查看提交的状态
而git pull就是拉取的意思对吧
好,那么今天的关于git的原理的部分就讲到这里