Git 版本控制系统(上):架构原理与操作入门

目录

  • 前言
  • [一、Git 的起源与历史背景](#一、Git 的起源与历史背景)
    • [1.1 Linux 内核开发的版本管理困境](#1.1 Linux 内核开发的版本管理困境)
    • [1.2 Git 的诞生与命名](#1.2 Git 的诞生与命名)
  • 二、理解版本控制的核心概念
    • [2.1 什么是版本控制?](#2.1 什么是版本控制?)
    • [2.2 高效版本控制的实现原理](#2.2 高效版本控制的实现原理)
  • [三、Git 的核心机制与仓库概念](#三、Git 的核心机制与仓库概念)
    • [3.1 什么是仓库(Repository)?](#3.1 什么是仓库(Repository)?)
  • [四、Git 与 GitHub/Gitee 的关系辨析](#四、Git 与 GitHub/Gitee 的关系辨析)
    • [4.1 为什么要区分 Git 和 GitHub/Gitee?](#4.1 为什么要区分 Git 和 GitHub/Gitee?)
      • [4.1.1 Git:本地版本控制器](#4.1.1 Git:本地版本控制器)
      • [4.1.2 GitHub & Gitee:远程托管平台](#4.1.2 GitHub & Gitee:远程托管平台)
    • [4.2 分布式与去中心化架构](#4.2 分布式与去中心化架构)
  • 五、远端代码托管平台与仓库创建
    • [5.1 为什么需要远端平台](#5.1 为什么需要远端平台)
    • [5.2 Gitee 注册与登录](#5.2 Gitee 注册与登录)
    • [5.3 创建远端仓库](#5.3 创建远端仓库)
      • [5.3.1 基本信息](#5.3.1 基本信息)
      • [5.3.2 可见性选择](#5.3.2 可见性选择)
      • [5.3.3 初始化仓库选项(重点)](#5.3.3 初始化仓库选项(重点))
      • [5.3.4 设置模板选项](#5.3.4 设置模板选项)
    • [5.4 创建后的仓库页面](#5.4 创建后的仓库页面)
    • [5.5 邀请协作者(团队开发)](#5.5 邀请协作者(团队开发))
      • [5.5.1 邀请方式](#5.5.1 邀请方式)
      • [5.5.2 角色权限](#5.5.2 角色权限)
      • [5.5.3 审核机制](#5.5.3 审核机制)
  • [六、本地 Git 环境准备](#六、本地 Git 环境准备)
    • [6.1 安装 Git](#6.1 安装 Git)
    • [6.2 配置用户身份](#6.2 配置用户身份)
  • 七、将远端仓库克隆到本地
    • [7.1 获取仓库地址](#7.1 获取仓库地址)
    • [7.2 执行克隆命令](#7.2 执行克隆命令)
    • [7.3 HTTPS 认证方式](#7.3 HTTPS 认证方式)
  • [八、Git 三板斧:add、commit、push](#八、Git 三板斧:add、commit、push)
    • [8.1 三板斧的完整工作流](#8.1 三板斧的完整工作流)
      • [8.1.1 工作区(Working Directory)](#8.1.1 工作区(Working Directory))
      • [8.1.2 暂存区(Staging Area / Index)](#8.1.2 暂存区(Staging Area / Index))
      • [8.1.3 本地仓库(Local Repository)](#8.1.3 本地仓库(Local Repository))
      • [8.1.4 远端仓库(Remote Repository)](#8.1.4 远端仓库(Remote Repository))
    • [8.2 实操演示:第一次提交](#8.2 实操演示:第一次提交)
    • [8.3 推送到远端](#8.3 推送到远端)
    • [8.4 查看当前状态](#8.4 查看当前状态)
  • 结语

🎬 云泽Q个人主页
🔥 专栏传送入口 : 《C语言》《数据结构》《C++》《Linux》《蓝桥杯系列》《笔试算法》《AI赋能》《STM32》《Python

⛺️遇见安然遇见你,不负代码不负卿~


前言

大家好啊,我是云泽Q,欢迎阅读我的文章,一名热爱计算机技术的在校大学生,喜欢在课余时间做一些计算机技术的总结性文章,希望我的文章能为你解答困惑~

一、Git 的起源与历史背景

1.1 Linux 内核开发的版本管理困境

要理解 Git,我们得先聊聊它的历史,这段历史和 Linux 有着极深的渊源。

在 Linux 内核开源之后,全球的工程师都参与到了开发中。那时候大家是怎么提交代码的呢?主要是通过邮件。开发者把代码片段写在邮件里发给 Linus Torvalds(Linux 之父),然后由 Linus 手动进行合并。大家可以想象一下那个画面:Linus 每天面对着海量的邮件,通过 Ctrl+CCtrl+V 把代码一段段粘贴到一起。这种方式不仅工作量巨大,而且极其容易出错,效率非常低。

1.2 Git 的诞生与命名

面对这种困境,Linus 尝试寻找现成的版本控制工具。但是,当时市面上大多数优秀的版本控制软件都是收费的,这与 Linux 的开源理念严重冲突,也会提高 Linux 的传播门槛。

期间发生过一件趣事:有一家版本控制公司曾经免费提供定制版软件给 Linux 社区使用。但是,后来因为社区里有人尝试破解该软件被发现,这家公司一气之下收回了授权。

这件事彻底激怒了 Linus,他决定不再依赖他人,而是自己动手,丰衣足食。他在极短的时间内,从零开始实现了一个版本控制系统,并将其命名为 Git

关于 Git 这个名字,它的全称是 Global Information Tracker(全球信息追踪器)。Git 一经推出就立即开源,并迅速被原来的 Linux 开发者群体采用。凭借开源和高效的巨大优势,它逐步取代了 SVN,成为了当今主流的版本控制工具。所以我们要清楚,Git 的作者就是 Linux 的创始人 Linus Torvalds。

二、理解版本控制的核心概念

2.1 什么是版本控制?

我们要如何通俗地理解"版本控制"呢?我们可以拿学生提交实验报告来举个例子。

假设有两个学生,李四和张三,还有一位 C 语言老师(对应现实中的项目经理或产品经理)。

  • 李四的做法:他每次修改实验报告时,都是直接在原文件上改。改完保存,之前的内容就没了。如果老师让他"把昨天的版本发给我看看",李四就傻眼了,因为他无法回溯历史版本。
  • 张三的做法:张三很聪明,他对每一次修改都保留备份。比如第一次写完叫 V1,第二次修改后叫 V2,以此类推。这样,无论什么时候,他都可以随时恢复任意一个历史版本。

在软件开发中,程序员对应的就是张三或李四,而代码就是那份实验报告。如果我们像李四那样写代码,一旦改错了或者需求变了想回退,那就是一场灾难。

2.2 高效版本控制的实现原理

既然张三的方法好,那我们是不是把整个文件每次都复制一份存起来就行了?

对于小文件(比如几百 KB 的实验报告),手动全量备份是可行的。但在大型项目中,比如 Linux 内核有数百兆甚至上 G 的代码,如果每次只改了一行字,你就把几百兆的文件完整复制一份,这会浪费大量的存储空间。

Git 之所以高效,是因为它不采用全量备份 ,而是只记录"修改动作"

我们可以看一张示意图来理解这个过程:

假设我们有 V1、V2、V3 等多个版本。Git 不会把 V2 的完整内容存下来,它只会记录从 V1 到 V2 发生了什么变化。比如:

  • 第五行 :删除 XXXX
  • 第六行 :修改 mian -> main
  • 第七行 :增加 printf("helloworld");

这些修改记录会生成一个唯一的标识,我们称之为 修改ID(在 Git 中通常称为 Commit ID)。

基于初始版本(V1)和这一系列的修改记录,Git 可以正向生成新版本(执行修改动作),也可以逆向回退旧版本(执行逆操作)。这就是为什么 Git 既快又省空间的原因。

三、Git 的核心机制与仓库概念

3.1 什么是仓库(Repository)?

刚才提到的张三为每位同学(王五、赵六等)创建独立文件夹存放版本,这些文件夹其实就是"仓库"的概念。

在 Git 中,当你在一个项目目录下初始化 Git 时,它会创建一个隐藏的目录(通常是 .git),这就是你的本地仓库 。这个仓库会自动管理该项目所有的历史版本及其修改记录。你不需要自己手动去建文件夹、重命名文件,Git 帮你把这些繁琐的"备份说明"工作全部自动化了。

本质上,Git 就是用 C/C++ 编写的一个软件,它把这种聪明的管理方式通过代码实现了出来。

四、Git 与 GitHub/Gitee 的关系辨析

4.1 为什么要区分 Git 和 GitHub/Gitee?

很多初学者容易混淆这两个概念。我们需要明确:Git 是一个软件工具,而 GitHub 和 Gitee 是基于 Git 的网站平台。

4.1.1 Git:本地版本控制器

Git 本身是一个命令行工具(虽然也有小乌龟等图形化界面,但核心是命令行)。它具有两个核心功能:

  1. 版本控制功能:在本地记录代码的修改历史。
  2. 网络同步功能:Git 本身设计之初就是一个分布式系统,它具备网络通信能力,可以将数据推送到远程,或者从远程拉取数据。

4.1.2 GitHub & Gitee:远程托管平台

随着发展,我们需要一个公共的地方来提供数据备份和管理服务。万一你本地的电脑坏了、磁盘坏了、操作系统挂了,那你所有的代码和版本记录就都没了。

这时候就需要一个"云端"的仓库。于是出现了 GitHub(国外)和 Gitee(国内,码云)。

  • 本质:它们本质上是网站。
  • 早期定位:用来做本地仓库同步到远端的功能。也就是所谓的"备份"。如果你的本地仓库挂了,你还可以从远端把代码拉下来。
  • 现代功能:随着发展,它们提供了图形化界面、网络级的 Data 操作、多人协作功能等。甚至现在你在 Gitee 网站上直接修改代码,它底层也是通过 Git 机制在网站的服务器端进行管理,并自动同步到你的本地(如果你配置了关联的话)。

4.2 分布式与去中心化架构

Git 被称为"去中心化的、分布式的多版本控制器"。这是什么意思呢?

看这张架构图,我们可以看到 Windows 平台和 Linux 平台上都运行着 Git。

  • CS 一体:Git 既是客户端(Client)也是服务端(Server)。每一台安装了 Git 的电脑,都是一个完整的版本库。
  • 对等关系:不像 SVN 那样必须依赖一个中心服务器,Git 的每个节点地位都是平等的。你可以把你的仓库同步给别人的电脑,别人也可以同步给你。

GitHub 和 Gitee 只是充当了一个大家都认可的"中心节点"或者是"公共交换站"的角色,方便大家进行代码的汇聚和分发。但即便没有它们,Git 依然可以在局域网内的两台电脑之间直接进行版本管理和同步。

五、远端代码托管平台与仓库创建

5.1 为什么需要远端平台

本地仓库的管理固然重要------你在自己的机器上建仓库、提交修改、用 Git 做版本管理,这一切都能独立完成。但问题是,只有你自己能访问。一旦涉及团队协作,或者你想把代码备份到远端防止本地硬盘损坏,本地仓库就不够用了。

所以我们需要把本地仓库同步到远端。反过来也一样,我们可以在远端先把仓库建好,再拉取到本地进行开发。本地仓库和远端仓库本质上完全一样,只是存放位置不同。

虽然国内常用的远端平台有 Gitee(码云)和 GitHub。由于网络原因,GitHub 在国内访问时经常不稳定,所以我们文章中的实操统一使用 Gitee。

5.2 Gitee 注册与登录

Gitee 的注册流程跟注册任何普通网站一模一样------填用户名、设密码、绑邮箱,没什么特殊之处。注册完成后直接登录即可。如有困惑可以看这篇文章零基础学会使用 Gitee:环境搭建与代码托管实战

5.3 创建远端仓库

登录 Gitee 后,点击右上角的加号按钮,选择"新建仓库",进入创建页面。创建时需要填写以下几项内容:

5.3.1 基本信息

  • 仓库名称 :必填项。路径会自动根据名称生成。比如填 Test_delete,路径就是 /test_delete
  • 仓库介绍 :选填,简单描述这个仓库的用途即可。比如写"一个测试的git仓库"。

5.3.2 可见性选择

  • 开源(所有人可见):任何人都能浏览你的代码仓库。
  • 私有(仅仓库成员可见):只有你邀请的协作者才能看到,适合商业项目或不公开的个人项目。

5.3.3 初始化仓库选项(重点)

创建时强烈建议勾选**"初始化仓库"**,它包含三个子选项:

  • 选择语言 :比如选择 C++。选择语言后,系统会自动生成对应的 .gitignore 文件。
  • 添加 .gitignore :与语言选择联动,会自动匹配 C++ 项目中需要忽略的文件类型(如编译产生的 .o 文件、可执行文件等),避免把无关的垃圾文件提交到仓库中。
  • 添加开源许可证(License):这个选项非常重要。开源不等于"任何人都可以随便用"。开源许可证是一份法律声明,明确规定了他人在学习、修改、分发、商用等场景下各自的权利和义务。如果不选许可证,别人就不知道该怎么合法使用你的代码。所以务必勾选。

5.3.4 设置模板选项

还可以勾选**"设置模板"**,它会在仓库中自动添加一些文档模板:

  • Readme 文件:强烈建议勾选。Readme 就是项目的"产品说明书",里面通常包含项目介绍、软件架构、安装教程、使用说明、参与贡献、特性等内容。
  • Issue 模板文件:初学者暂时用不上,可以不选。
  • Pull Request 模板文件:初学者暂时用不上,可以不选。

填写完毕后,点击底部的**"创建"**按钮,远端仓库就建好了。

5.4 创建后的仓库页面

仓库创建完成后,你会看到仓库的主页,包含以下几个区域:

  • 文件列表 :初始化后默认包含 .gitignoreREADME.en.mdREADME.md 三个文件。
  • 顶部提示:如果创建时没有选择开源许可证,页面顶部会有一条醒目的提示------"你当前开源项目尚未选择许可证(LICENSE),点此选择并创建开源许可",点击可以后续补选。
  • Readme 预览区:页面中部会直接渲染 README.md 的内容,展示项目介绍、软件架构、安装教程等结构化信息。
  • 右侧信息栏 :显示仓库简介、分支数量(默认 master)、标签数、Stars 数、Watching 数、Forks 数等统计信息。

5.5 邀请协作者(团队开发)

如果你的项目需要多人协作,可以通过仓库的**"管理"**页面邀请其他成员加入:

5.5.1 邀请方式

  • 链接邀请:生成一个邀请链接,有效期为 3 天,任何人拿到链接都可以加入。
  • 二维码邀请:生成一个二维码,扫码即可加入,适合面对面协作场景。
  • 直接添加 :通过对方的 Gitee 用户名直接添加。

5.5.2 角色权限

邀请成员时需要为其分配角色权限:

  • 管理员:拥有仓库的所有权限,适合项目经理。
  • 开发者:可以推送代码、创建分支、提交 PR,适合实际写代码的人。
  • 观察者:只能查看代码,不能修改,适合产品经理或老板。
  • 报告者:只能提交 Issue。

5.5.3 审核机制

如果担心随便有人通过链接加入,可以开启**"强制审核"**。开启后,所有通过链接邀请的人都需要管理员审核通过后才能正式加入仓库。

六、本地 Git 环境准备

6.1 安装 Git

要在本地使用 Git 管理代码,首先得安装 Git 客户端。以 CentOS 系统为例,在终端中执行:

bash 复制代码
sudo yum install -y git

安装完成后,通过以下命令验证是否安装成功:

bash 复制代码
which git
# 输出: /usr/bin/git

git --version
# 输出: git version 1.8.3.1

注意 :如果执行 yum install git 时出现 HTTP Error 403 - Forbidden 的报错,通常是因为 CentOS 7 的官方镜像源已经停止维护,需要更换为 vault 源或第三方源。

6.2 配置用户身份

安装完 Git 后,必须先配置用户名和邮箱(填你自己的即可,我下面只是以我为例做演示),否则后续提交代码会报错:

bash 复制代码
git config --global user.name '云泽'
git config --global user.email '2392709001@qq.com'

如果不配置就执行 git commit,系统会报错:

复制代码
*** Please tell me who you are.
Run
  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"
to set your account's default identity.
fatal: empty ident name (for <yunze@...>) not allowed

重要提醒:本地配置的用户名和邮箱,尽量和 Gitee 账号的用户名、邮箱保持一致。如果不一致,Gitee 就无法正确识别你的提交记录,页面上那些代表提交贡献的**"小绿点"**可能不会点亮,因为系统不认为那是你提交的。

七、将远端仓库克隆到本地

7.1 获取仓库地址

在 Gitee 仓库主页,点击**"克隆/下载"**按钮,会弹出一个对话框,提供多种协议地址:

  • HTTPS :最常用的方式(这里就推荐HTTPS即可),地址格式如 https://gitee.com/yunzeQ/test_delete.git
  • SSH:需要配置 SSH 密钥,适合频繁操作。
  • SVN:兼容旧版 SVN 客户端。

点击地址右侧的复制按钮 ,就可以把仓库地址复制到剪贴板。

7.2 执行克隆命令

在本地终端中,切换到你想存放代码的目录,执行:

bash 复制代码
git clone https://gitee.com/yunzeQ/test_delete.git

克隆完成后,当前目录下会多出一个与仓库同名的文件夹(如 test_delete),里面包含了远端仓库的所有文件和 .git 目录。

7.3 HTTPS 认证方式

使用 HTTPS 协议克隆和推送时,每次操作都会要求输入账号密码进行验证:

复制代码
Username for 'https://gitee.com': yunzeQ
Password for 'https://yunzeQ@gitee.com': 私人令牌

⚠️ 安全建议:出于安全考虑,Gitee 建议配置并使用**私人令牌(Personal Access Token)**替代登录密码进行克隆、推送等操作。私人令牌可以在 Gitee 的安全设置中生成,权限可控,且可以随时撤销。

八、Git 三板斧:add、commit、push

8.1 三板斧的完整工作流

Git 的核心操作可以概括为三板斧:

bash 复制代码
git add .          # 把工作区的修改添加到暂存区
git commit -m "XXX" # 把暂存区的内容提交到本地仓库
git push           # 把本地仓库的提交推送到远端仓库

这三步分别对应三个不同的区域:

命令 动作 源区域 目标区域
git add 添加修改 工作区 暂存区
git commit 提交记录 暂存区 本地仓库
git push 推送同步 本地仓库 远端仓库

8.1.1 工作区(Working Directory)

就是你实际写代码的地方,也就是 git clone 下来的那个文件夹里,你看得见、摸得着的所有文件。

8.1.2 暂存区(Staging Area / Index)

这是一个"中转站"。你修改了文件后,先用 git add 把修改"标记"一下放进暂存区,相当于告诉 Git:"这些修改我确认了,准备提交。"

8.1.3 本地仓库(Local Repository)

执行 git commit 后,暂存区里的内容被正式记录到本地仓库中,生成一条永久不可篡改的提交记录。

8.1.4 远端仓库(Remote Repository)

执行 git push 后,本地仓库的提交被同步到 Gitee 这样的远端平台上,团队成员就能看到你的最新代码。

8.2 实操演示:第一次提交

假设你在克隆下来的仓库中新增了进度条相关的代码文件(main.cprocess.cprocess.hMakefile),然后执行以下操作:

bash 复制代码
# 第一步:将所有修改添加到暂存区
git add .

# 第二步:提交到本地仓库,附带日志信息
git commit -m "进度条代码"

# 输出示例:
# [master 27ef2e4] 进度条代码
#  4 files changed, 172 insertions(+)
#  create mode 100644 Makefile
#  create mode 100644 main.c
#  create mode 100644 process.c
#  create mode 100644 process.h

8.3 推送到远端

本地提交完成后,执行 git push 将代码推送到远端:

bash 复制代码
git push

如果是第一次推送,可能会看到一条警告信息:

复制代码
warning: push.default is unset; its implicit value is changing in
Git 2.0 from 'matching' to 'simple'. To squelch this message
and maintain the current behavior after the default changes, use:
  git config --global push.default matching
To squelch this message and adopt the new behavior now, use:
  git config --global push.default simple

按照提示执行以下命令即可消除警告:

bash 复制代码
git config --global push.default simple

推送成功后,输出类似:

复制代码
Counting objects: 10, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (9/9), done.
Writing objects: 100% (9/9), 2.43 KiB | 0 bytes/s, done.
remote: Powered by GITEE.COM
To https://gitee.com/yunzeQ/test_delete.git
   342354e..db849ff  master -> master

此时刷新 Gitee 页面,就能看到你推送的新文件了。

8.4 查看当前状态

在任意时刻,可以通过 git status 查看仓库当前状态:

bash 复制代码
git status

# 输出示例:
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#   (use "git push" to publish your local commits)
# nothing to commit, working directory clean
  • ahead of 'origin/master' by 2 commits:说明本地有 2 个提交还没推送到远端。
  • nothing to commit, working directory clean:说明工作区是干净的,没有未提交的修改。

写到这里也是发现git的内容非常多,所以该部分也分为两篇来写~

该篇到此结束~


结语

相关推荐
中科院提名者1 小时前
深度学习语音增强架构演进的具体原因,从DNN开始
深度学习·架构·dnn
陈皮糖..1 小时前
基于 Keepalived 的传统 Web 高可用架构的容器化改造与可观测性升级
运维·docker·性能优化·架构·云计算·prometheus
凌云若寒1 小时前
CODESOFT试用流程
linux·运维·网络·数据库·sentinel
薄雾晚晴2 小时前
大模型Skill暴论:所有Skill终将消亡?最新Skill方法论与模型增强开发实战
前端·后端·架构
绝世唐门三哥2 小时前
Git - git stash 语法演进与实战指南
前端·git
吴声子夜歌2 小时前
Linux命令——学习Shell(三)
linux·chrome·学习
腾渊信息科技公司2 小时前
腾渊科技重磅出品——工业智能体落地实战:从单点AI到智能体集群的架构演进
人工智能·科技·架构·工业智能体·腾渊科技·腾渊信息科技·腾渊工业智能体
OceanBase数据库官方博客2 小时前
深度拆解seekdb:AI Native Database 的技术架构与核心能力
数据库·人工智能·架构
大模型码小白2 小时前
【AI大模型】DeepSeek Harness 深度解析:大模型评测框架的架构与实践
java·运维·人工智能·spring·架构·自动化