Linux-git的使用

目录

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

项目 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彻底打破了这个规则,它的去中心化核心逻辑是:

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

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

  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'
  1. 生成并配置 SSH 密钥(如果还没做)

按截图里的步骤执行:

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

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

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

  1. 测试 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/ 里的具体版本
  1. hooks/ 文件夹(钩子脚本)

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

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

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

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

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


  1. logs/ 文件夹(操作日志)
  • logs/HEAD:记录你所有切换分支、提交代码的操作历史

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

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


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

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

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

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

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

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


  1. 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的原理的部分就讲到这里

相关推荐
YuQiao03031 小时前
Ubuntu怎么弄得像windows:Dash to Panel
linux·ubuntu·dash
玖剹1 小时前
gitee在Linux下的使用
linux·运维·gitee
路由侠内网穿透.1 小时前
本地部署中间件系统 JBoss 并实现外部访问
运维·服务器·网络·网络协议·中间件
Sunny_yiyi1 小时前
阿里云轻量服务器安装nginx(不期而遇)
服务器·nginx·阿里云
白云偷星子1 小时前
云原生笔记5
linux·运维·笔记·云原生·tomcat
嵌入小生0071 小时前
网络通信 --- TCP并发服务器/IO模型/多路复用IO相关函数接口 --- Linux
服务器·网络·select·tcp并发服务器·fcntl·io模型·多路复用io
艾莉丝努力练剑1 小时前
【QT】常用控件(一):初识控件,熟悉QWidget
android·linux·数据库·qt·学习·mysql·qt5
liuluyang5301 小时前
Linux IIO ADC 驱动简介
linux
大母猴啃编程1 小时前
Socket编程UDP
linux·网络·c++·网络协议·udp