Git & GitHub & Gitee & GitLab 技术(1)--之Git

Git & GitHub & Gitee & GitLab 技术(1)

一、Git 的概述及其入门操作

1.1 Git 的概述

Git 是一个免费且开源分布式版本控制系统,设计用于处理从小型到非常大型的各种项目,以快速高效的方式。
Git 速度极快,拥有庞大的图形界面、托管服务和命令行工具生态系统。
(有兴趣的可以去了解一下 git 的发展历史廖雪峰Git 的诞生引用资料https://liaoxuefeng.com/books/git/what-is-git/birth-of-git/index.html)

那么问题来了:Git 作为一款分布式版本控制工具,你肯定会有这样的疑惑: 1.版本控制是怎么回事?2.分布式又是什么意思?

1.1.1 版本控制

下图是一个即将大四毕业的“本科牲”正在赶工她的毕业设计,以下就是她的历代修改的毕设版本

在这里插入图片描述


在企业开发过程中,若仅依靠单一文件夹来管理多个版本文件,不仅操作效率低下,还会严重影响团队协作。这种简单的个人开发模式显然无法满足团队协同工作的需求。

为此,版本控制系统应运而生

定义:用于记录文件和代码修改历史的版本控制系统,便于回溯变更、对比差异和恢复数据。
核心功能:
完整保存每次修改记录
支持回溯至任意历史版本
实现多人协作时的版本同步

是否必须进行版本管理
最直观例子(不使用版本控制的灾难现场)
你和同学一起写项目:
你改了登录功能
同学改了注册功能
​两人互相传文件: 项目最终版 、 项目真最终版 、 项目绝对最终版2
​某天你改错代码,项目跑不起来
​找不到之前好的版本 → 项目直接报废

用 Git 版本控制后
每次改完都提交,历史全保存
​写错了直接回退到上一个正常版本
​多人同时写,自动合并,不会互相覆盖
​文件永远只有一份,不会乱

所以为什么要做版本控制就显而易见了

  1. 防止代码改崩、无法恢复
  2. 多人同时写代码不混乱、不覆盖
  3. 随时查看谁在什么时候改了什么
  4. 能回到任何一个历史版本

1.1.2 分布式 VS 集中式

集中式版本控制系统(eg : SVN、CVS等):所谓的集中式版本控制就是将历代的版本文件都存放在同一个中央服务器中统一管理,而个人电脑是没有版本修改记录的。在多人协同开发一个项目时改写代码时需要先从中央服务器获取最新版本的代码,然后开始编写,编写完成后再推送上中央服务器让其进行迭代,版本更新且记录日志。

集中式版本控制系统


缺点:

  1. 单点故障风险:服务器宕机,所有人无法提交、更新、回溯代码。
  2. 必须联网:断网时几乎无法进行版本操作,只能本地改代码。
  3. 分支管理弱:创建、合并分支慢且复杂,不适合敏捷开发。
  4. 性能差:代码库变大后,拉取、提交速度明显变
  5. 历史依赖服务器:本地没有完整版本历史,丢失服务器数据就全丢

分布式版本控制系统(代表:Git):就是每个开发者本地都有完整的版本库(代码+全部的提交历史),不依赖中央服务器即可完成所有版本控制操作。提交、分支、回滚等操作本地完成,速度极快。(核心思想:每台电脑都是一个独立的服务器,节点之间平等,通过网络同步代码)

分布式版本控制系统


优点:

  1. 无单点故障
    服务器挂了不影响本地开发,随时可恢复
  2. 断网可用
    离线可提交、查看历史、创建分支,联网后再推送
  3. 分支极强
    创建/合并分支极快,适合多人并行、敏捷开发
  4. 速度快
    本地操作无网络延迟,大项目也流畅
  5. 数据安全
    每人都有完整备份,服务器数据丢失可恢复
  6. 协作灵活
    支持多种协作模式(Github/Gitlab流程、多仓库同步)

1.2 Git 的工作机制和代码托管中心

Git 的工作机制
Git 是分布式版本控制系统,整体分为四个核心区域,数据在区域之间单向或双向流动:

  1. 工作区
    本地存放代码、编辑代码的目录,是用户直接操作的区域。
  2. 暂存区
    临时存放工作区的修改,用于标记哪些文件即将进入版本记录。
    通过 git add 将工作区修改加入暂存区。
  3. 本地仓库
    保存项目所有历史版本和提交记录,由 Git 自动管理。
    通过 git commit 将暂存区内容永久保存到本地仓库。
    通过 git checkout 可切换版本,将本地仓库内容覆盖到工作区。
  4. 远程仓库
    托管在网络上的仓库(如 GitHub、Gitee),用于团队协作和代码备份。
    通过 git push 将本地仓库推送到远程仓库。
    通过 git pull 将远程仓库最新代码拉取到本地仓库与工作区。
在这里插入图片描述


在编写项目时,(情景1:如果刚加入团队但已经编写了一个已经差不多完工的项目)那就要求在远程库先****clone下最新版项目到本地库和工作区先检查分支(git branch -a),切换到团队指定的开发分支,再开始开发;(情景2:已经在团队内部)那在每次将要编写代码时先拉取(pull)远程库最新的版本后,先检查分支(git branch -a),切换到团队指定的开发分支,工作区编写完成,add到暂存区,随即commit到本地库,再到push本地库代码之前还要pull远程库的最新版本(以免push本地库到远程库时,两库版本不一致导致remote rejected)。简单一句话:先pull,再改写代码;写完代码后先pull再push.后面工作也是按这个流程循环。

关键注意事项
  • 频繁执行 git pull 能减少大规模冲突概率,但需注意合并策略1--rebase 或默认合并)。
  • 提交信息应清晰描述变更内容,便于团队追溯。
  • 使用 git status 检查工作区状态,确保无遗漏文件或冲突未解决。

总而言之:Git 通过工作区编写、暂存区临时存档、本地仓库记录版本、远程仓库协同共享,实现代码的版本管理与团队协作。

代码托管中心
是基于网络服务器的远程代码仓库,一般我们简单称为远程库。
->局域网 [GitLab]
->互联网 [GitHub (外网)、Gitee码云(国内网站)]

1.3 Git 的安装

官网 (git-scm.com)
引用教程Git 详细安装教程(详解 Git 安装过程的每一个步骤)https://blog.ZEEKLOG.net/mukes/article/details/115693833

GIt 安装到哪都没问题,最主要的是你项目的代码放在哪(那才是最占内存的)

1.4 Git 的常用命令

1.4.1 设置用户签名

设置用户名:git config --global user.name 用户名 设置邮箱:git config --global user.email 邮箱 

(建议和GitHub用同一个好记)
如何判断已经设置好了?
在C:\Users\现在所用的用户名.gitconfig 即可看到设置的内容

在这里插入图片描述


如果不设置后续推送时会出错

1.4.2 git 初始化本地库

在这里插入图片描述


输入 git init 初始化本地库

在这里插入图片描述


初始化过后就会出现一个隐藏的.git文件,证明初始化成功!

在这里插入图片描述

1.4.3 查看本地库状态

git status 
在这里插入图片描述

1.4.4 将文件添加/移除至缓存区

添加

gitadd 文件名.后缀 

移除

gitrm--cached 文件名.后缀 

示例:

在这里插入图片描述
在这里插入图片描述


在这里插入图片描述

1.4.5 提交本地库

git commit -m"日志提交信息" 文件名.后缀 
在这里插入图片描述

1.4.6 查看版本信息

git reflog ---简略 git log ---详细 
在这里插入图片描述

1.4.7 版本穿梭

git reset --hard 版本号(前7位) 
在这里插入图片描述


穿梭的原理图

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


切换版本底层原理还是移动HEAD指针

1.5 Git 的分支

1.5.1 分支及其好处

在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。

下图引用ZEEKLOG- Git笔记(三)---- Git分支操作https://blog.ZEEKLOG.net/weixin_51202460/article/details/124643483

好处:
Git 分支最核心的好处是隔离开发、保护核心代码,避免个人 / 团队的代码互相干扰、污染稳定版本;
其次能灵活管控开发节奏,支持并行开发、紧急修复,大幅提升团队效率;
还能简化冲突解决、便于代码评审,让之前总结的 “先 pull 再开发、先 pull 再 push” 流程落地更顺畅。
简单来说:用分支开发,不用再担心 “改坏代码”“和同事冲突”,团队也能做到 “多人并行开发、版本稳定可控”。

1.5.2 分支具体操作命令

基础:

1.查看本地所有分支(*标注当前所在分支) git branch -v2.创建新分支(基于当前分支创建,不切换) # 格式:git branch 新分支名git branch feature/user-login 3. 切换到已存在的本地分支 git checkout develop # 或git switch develop 4.合并指定分支到当前分支 # 格式:git merge 要合并的分支名git merge feature/user-login 
其中合并分支分两种情况

1:正常合并(主线没改;分支改完后合并到主线上)
2:冲突合并(主线和要合并到主线的分支都修改)
那就要vim 文件名.后缀手动修改后再git add 文件名.后缀,后再git commit -m "XXX"(这句不带文件名)–>成功

示例:
现在master 和 test1 两分支的test1.txt文件都做了修改并commit

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在branch testl change<<<<<<< HEAD和>>>>>>> test1 这两行之间改写完后:wq保存并退出编辑

在这里插入图片描述


在这里插入图片描述


成功合并

在这里插入图片描述

1.6 团队协作

团队协作大概流程图

在这里插入图片描述


在这里插入图片描述

拓展

一些命令:
vim 中 Esc+yy是 复制 ; p是黏贴

进入文本时:点击i开始编辑文本;Esc+输入:wq退出并保存

查看文件夹下的文件ll;查看文件夹下的所有文件包括隐藏的ll -a

查看 cat 文件名.后缀

有兴趣可以去了解些Linux命令(Linux和Git是"一家")小杰的网工专栏


下图(豆包)

↩︎

Read more

华为OD机试双机位C卷 - 比赛 / 评委评分 (C++ & Python & JAVA & JS & GO)

华为OD机试双机位C卷 - 比赛 / 评委评分 (C++ & Python & JAVA & JS & GO)

比赛 华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 100分题型 华为OD机试双机位C卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录|机考题库 + 算法考点详解 题目描述 一个有N个选手参加比赛,选手编号为1~N(3<=N<=100),有M(3<=M<=10)个评委对选手进行打分。 打分规则为每个评委对选手打分,最高分10分,最低分1分。 请计算得分最多的3位选手的编号。 如果得分相同,则得分高分值最多的选手排名靠前 (10分数量相同,则比较9分的数量,以此类推,用例中不会出现多个选手得分完全相同的情况)。 输入描述 第一行为半角逗号分割的两个正整数,第一个数字表示M(3<=M<=10)个评委,第二个数字表示N(3<=N<=100)

By Ne0inhk
【C++算法刷题营地】—— 【string类面试题】Cyber顶级骇客带你速刷 C++ string类 中的常见算法题

【C++算法刷题营地】—— 【string类面试题】Cyber顶级骇客带你速刷 C++ string类 中的常见算法题

⚡ CYBER_PROFILE ⚡ /// SYSTEM READY /// [WARNING]: DETECTING HIGH ENERGY 🌊 🌉 🌊 心手合一 · 水到渠成 >>> ACCESS TERMINAL <<<[ 🦾 作者主页 ][ 🔥 C语言核心 ][ 💾 编程百度 ][ 📡 代码仓库 ] --------------------------------------- Running Process: 100% | Latency: 0ms 索引与导读 * 一、字符串转换 * 1)字符串转换整数 * 关键点拨 * 完整代码 * 最直接的替代接口:stoi * 小试牛刀:整数转字符串 * 2)字符串相加 * 关键点拨 * 完整代码 * 3)仅仅反转字母 * 关键点拨 * 完整代码 * 4)反转字符串 * 4.

By Ne0inhk
【算法竞赛】C/C++ 的输入输出你真的玩会了吗?

【算法竞赛】C/C++ 的输入输出你真的玩会了吗?

🔭 个人主页:散峰而望 《C语言:从基础到进阶》《编程工具的下载和使用》《C语言刷题》《算法竞赛从入门到获奖》《人工智能AI学习》《AI Agent》 愿为出海月,不做归山云 🎬博主简介 文章目录 * 前言 * 1. OJ(online judge)题目输入情况汇总 * 1.1 单组测试用例 * 1.2 多组测试用例 * 1.2.1 测试数据组数已知 * 1.2.2 测试数据组未知 * 1.2.3 特殊值结束测试数据 * 2. 输入时特殊技巧 * 2.1 含空格字符串的特殊处理方式 * 2.2 数字的特殊处理方式 * 3. scanf/printf 和

By Ne0inhk
C++ 多线程同步之条件变量(condition_variable)实战

C++ 多线程同步之条件变量(condition_variable)实战

C++ 多线程同步之条件变量(condition_variable)实战 💡 学习目标:掌握 C++ 标准库中条件变量的使用方法,理解条件变量与互斥锁的协同工作机制,能够解决多线程间的等待-通知问题。 💡 学习重点:std::condition_variable 的核心接口、wait() 与 notify_one()/notify_all() 的配合使用、生产者-消费者模型的实现。 49.1 条件变量的引入场景 在多线程编程中,我们经常会遇到线程需要等待某个条件满足后再执行的场景。 比如生产者线程生产数据后,消费者线程才能消费;队列不为空时,消费者才能从中取数据。 如果仅用互斥锁实现,消费者线程只能不断轮询检查条件,这会造成 CPU 资源的浪费。 ⚠️ 注意事项:单纯的轮询会导致 CPU 空转,降低程序运行效率,条件变量就是为解决这类问题而生的。 举个简单的轮询反例,消费者不断检查队列是否有数据: #include<iostream>

By Ne0inhk