目录

1.Git,Github,Gitee

2.Git是一个去中心化的版本控制器

3.认识Gitee仓库

4.如何在linux中推送代码到远程仓库呢?

5.Git原理


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

项目GitGitHubGitee
本质工具/协议基于 Git 的服务/平台基于 Git 的服务/平台
定位版本控制引擎全球社交化编程平台中国本土化代码托管平台
使用场景本地版本控制全球开源协作、项目展示国内团队协作、快速访问、合规需求
依赖关系是核心,不依赖其他两者依赖 Git 作为底层技术依赖 Git 作为底层技术
如何工作通过 git 命令在本地操作通过 git 命令与远程仓库交互,并通过 Web 界面管理通过 git 命令与远程仓库交互,并通过 Web 界面管理

2.Git是一个去中心化的版本控制器

什么叫做去中心化呢?

先搞懂:什么是「版本控制」?

在讲去中心化之前,咱们先把基础概念落地。所谓版本控制,说白了就是给文件/项目做「时光机+备份册」

举个生活中的例子:

你写毕业论文,改了一版又一版,为了不弄丢之前的内容,只能不停另存为:

  • 论文_初稿.doc

  • 论文_修改1版.doc

  • 论文_最终版.doc

  • 论文_最终定稿版.doc

  • 论文_打死不改版.doc

是不是越改越乱?想找回某一版的一句话,翻半天找不到;多人一起改论文,还容易出现「你改了我也改,最后版本冲突全乱套」的情况。

版本控制工具,就是解决这个问题的。

它能自动记录每一次修改:谁改的、改了什么、什么时候改的,想回退到任意版本一键就能搞定,多人协作也不会乱。而Git,就是目前最主流、最好用的版本控制工具,核心特点就是去中心化


重点来了:Git的「去中心化」到底是啥?

想理解去中心化,咱们先对比它的反面——中心化,用「团队写文案」的场景一讲就透。

❌ 中心化模式:全靠一个「中心服务器」

传统的版本控制工具(比如SVN),就是典型的中心化。

可以理解成:所有文件都存在公司唯一一台电脑(中心服务器)上,所有人想改文件,必须连这台电脑。

  • A想改文案,要先从中心服务器下载文件;

  • 改完必须立刻传回服务器,不然B就没法改;

  • 一旦服务器宕机、断网,所有人都没法干活、没法看历史版本;

  • 服务器硬盘坏了,整个项目的所有版本记录直接丢失,彻底凉凉。

这种模式就像「全班同学只能用老师的一本作业本写作业,谁写谁抢,还不能离老师太远」,死板又脆弱。

✅ Git去中心化模式:人人都是「中心」

Git彻底打破了这个规则,它的去中心化核心逻辑是:

没有唯一的中心服务器,每个人的电脑里,都有一份完整的项目副本+所有历史版本记录。

还是用「团队写文案」举例:

  1. 克隆项目:你从远程仓库(比如Gitee、GitHub)复制项目时,不是只拿最新文件,而是把整个项目的所有版本、所有修改记录全下载到自己电脑;

  2. 本地操作:断网、没连远程仓库,照样改代码、写文案、提交修改、回退版本,所有操作都在本地完成,飞快又方便;

  3. 同步协作:联网后,把自己的修改推送到远程仓库,也能拉取别人的修改,远程仓库只是「大家同步内容的中转站」,不是必须依赖的中心;

简单总结:中心化是「大家围着一个中心转」,Git去中心化是「人人都有完整账本,想怎么改怎么改,同步时再对账」

就是每个人都可以在自己的电脑中(本地仓库)修改代码,修改代码之后,再推送到远端仓库上面即可。

那么这里有个关键点,就是你的本地仓库的内容和远端仓库的内容不一致的时候,你这个时候直接push,是会起冲突的(一般就是一个仓库多个人使用,如果是一个仓库就你自己一个人使用,就不需要担心这个问题),那么这个时候,咱们就需要先git pull把远端仓库的内容给拉取出来,拉取出来之后,就可以确保远端的内同步到了本地,此时就可以push,就没有问题了

3.认识Gitee仓库

咱们来看这个创建的远程仓库

选项区域具体字段含义与建议
基础信息仓库名称仓库的显示名,如 gitee测试仓库,建议使用英文或拼音,便于识别。
归属仓库属于你个人还是组织,截图中是你的个人账号,保持默认即可。
路径仓库的唯一访问标识(URL 后缀),如 gitee-testing-repository这是代码克隆时的关键路径
仓库介绍可选,建议填写 C++/Qt 学习测试仓库,用于练习 Git 操作,方便日后回顾。
权限设置开源 / 私有截图选了开源(所有人可见),如果是练习代码,开源无问题;若有隐私内容,建议改为私有
初始化设置初始化仓库勾选后会自动生成基础文件,强烈建议勾选,避免仓库为空带来的麻烦。
选择语言选了 C++,Gitee 会根据语言显示统计信息,符合你的学习方向。
添加 .gitignore选了 C++,这是核心!.gitignore 会自动忽略编译产生的 .oexe 等无用文件,必须保留
添加开源许可证可选,学习阶段可以留空不选。
模板与分支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'

2. 生成并配置 SSH 密钥(如果还没做)

按截图里的步骤执行:

# 1. 生成 RSA 密钥(一路回车即可,不要设置密码)
ssh-keygen -t rsa

# 2. 查看公钥内容
cat ~/.ssh/id_rsa.pub

把输出的全部内容复制,粘贴到 Gitee 「设置 → SSH 公钥」里保存。

3. 测试 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 的三个工作区域:

  1. 工作区:你直接编辑文件的目录

  2. 暂存区:准备下次提交的文件列表

  3. 版本库:存储项目完整历史和元数据的地方

比如,咱们现在要把一个文件提交到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 命令,本质就是在这三者之间移动文件:

  1. git add test.c → 把工作区的 test.c 「打包」放到暂存区(.git/index)
  2. git commit -m "备注" → 把暂存区的所有修改「归档」到本地仓库(.git/ 里的版本库)
  3. 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/ 里的具体版本

2. hooks/ 文件夹(钩子脚本)

里面都是 .sample 结尾的示例脚本,比如:

  • pre-commit.sample:提交前自动执行的脚本(比如检查代码格式、跑单元测试)

  • pre-push.sample:推送前自动执行的脚本(比如检查是否有敏感信息)

  • .sample 去掉,就变成真正生效的钩子,能帮你自动化流程

类比:就像你家的「智能开关」,开门自动开灯、出门自动断电 ——Git 在特定时机(提交、推送)自动跑你写的脚本。


3. logs/ 文件夹(操作日志)

  • logs/HEAD:记录你所有切换分支、提交代码的操作历史

  • logs/refs/:按分支 / 远程仓库细分日志,比如 logs/refs/heads/master 只记录 master 分支的操作

类比:就像你的「手机通话记录」,能查到你什么时候切了分支、什么时候提交了代码,方便找回误操作。


4. objects/ 文件夹(版本库核心)

这是 Git 最核心的地方,所有版本数据都存在这:

  • 36/6b/ef/ 这样的文件夹:按哈希值前两位分组,里面存的是具体的版本对象(代码、文件、提交记录)

  • info/:辅助信息,基本不用管

  • pack/:把多个对象打包成 .pack 文件,提升传输和存储效率(克隆、推送时会用到)

类比:就像档案馆的文件柜,每个文件柜(36/6b/)里放着不同版本的「档案」(代码、提交记录),Git 用哈希值当档案编号。


5. refs/ 文件夹(指针集合)

  • refs/heads/本地分支指针,比如 refs/heads/master 就是 master 分支,里面存着一串哈希值,指向 objects/ 里的最新提交

  • refs/remotes/远程分支指针,比如 refs/remotes/origin/master 记录了远程仓库 origin 上 master 分支的最新版本

  • refs/tags/标签指针,给某个版本起个固定名字(比如 v1.0),方便以后快速找到这个版本

类比:就像地图上的书签masterv1.0 都是书签,指向 objects/ 里的具体档案位置。

总结:

  • .git/objects/:Git 的「历史档案馆」,存所有版本数据
  • index:Git 的「打包台」,暂存你准备提交的修改
  • refs/ + HEAD:Git 的「导航系统」,告诉你现在在哪个分支、哪个版本
  • 其他文件:都是辅助工具,帮你管理配置、自动化流程、记录操作

好,那么还有几个git的指令

git log

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

而git status就是查看提交的状态

而git pull就是拉取的意思对吧

好,那么今天的关于git的原理的部分就讲到这里

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐