【版本控制】git使用指南
Git 是一个免费、开源的分布式版本控制系统,最初由 Linus Torvalds 于2005年创建。它旨在管理项目的源代码,并提供了跟踪更改、协作开发、版本控制、分支管理等功能。
一、版本控制概念
版本控制系统(Version Control System,VCS)是一种用于管理项目文件和源代码版本的软件工具。它记录了文件的历史更改,并允许开发者查看、比较和恢复不同版本的文件。
1、版本追踪:版本控制系统跟踪文件的所有更改,并记录每个版本的详细信息,如修改人、时间、提交注释等。这使得开发者可以了解每个文件的历史更改记录。
2、并行开发:多个开发者可以同时在同一个项目上进行工作,每个人都可以在独立的分支上进行修改,然后将更改合并到主分支中。这样可以提高团队的协作效率。
3、版本回滚:版本控制系统允许开发者轻松地回滚到之前的任何版本,即使在文件被意外修改或删除后也可以恢复到之前的状态。
4、分支管理:版本控制系统支持创建和管理分支,开发者可以在不影响主线开发的情况下进行特性开发、bug 修复等工作。这使得开发过程更加灵活和可控。
5、协作开发:版本控制系统提供了一种方便的方式来协作开发项目。开发者可以共享代码库,并通过提交和合并请求来协作开发、审查代码,方便多人合作开发项目。
6、备份和恢复:版本控制系统充当了项目的备份工具,可以确保项目的所有历史版本都得到了保存。即使出现了数据丢失或损坏的情况,也可以通过版本控制系统来恢复数据。个人开发时也可以存多个版本log,用于备份恢复。
7、跟踪变更:版本控制系统可以记录每个文件的详细更改,包括新增、修改和删除操作。这使得开发者可以了解每个文件的修改历史,方便进行代码审查和错误排查。
二、git的工作原理
Git 的工作原理涉及到几个重要的概念和组件,包括仓库(Repository)、对象数据库(Object Database)、索引(Index)和分支(Branch)。下面是 Git 的工作原理的简要介绍:
2.1 仓库(Repository)
Git 将项目的所有文件和历史版本存储在一个称为仓库的目录中。每个仓库包含项目的完整历史记录和所有文件的当前状态。
Git 仓库通常分为本地仓库
(Local Repository)和远程仓库
(Remote Repository)两种类型。
本地仓库 :本地仓库是存储在本地计算机上的 Git 仓库副本。它包含了完整的项目历史记录、分支、提交等信息。本地仓库通常用于开发人员在本地进行代码的修改、提交、版本控制等操作。您可以在本地仓库中创建分支、合并分支、提交更改等操作,所有这些操作都不需要网络连接,而是在本地进行的。
远程仓库:远程仓库是存储在远程服务器上的 Git 仓库副本。它用于多个开发人员之间共享和协作代码,并作为代码的中央存储库。远程仓库通常托管在代码托管平台(如 GitHub
、GitLab
、Gitee
等)或者公司内部的 Git 服务器上。开发人员可以将本地仓库中的更改推送(push)到远程仓库,或者从远程仓库拉取(pull)最新的代码更改。
2.2 对象数据库(Object Database)
在 Git 中,对象数据库(Object Database)是一个存储 Git 版本库中所有数据对象的重要组成部分。它通常位于 .git/objects
目录下。
Git 中的对象是指存储在版本库中的数据实体,主要包括以下几种类型的对象:
1、Blob 对象(文件内容对象):
Blob 对象存储的是文件的内容。在 Git 中,每个文件的内容都被存储为一个 Blob 对象。Blob 对象通过 SHA-1 校验和
来标识,并且它们是不可修改的,即一旦创建就不能修改。
2、Tree 对象(目录对象):
Tree 对象存储的是文件和子目录的列表以及它们的权限和文件名等信息。每个提交对象都包含一个指向根 Tree 对象的引用,通过 Tree 对象可以构建整个目录结构。
3、Commit 对象(提交对象):
Commit 对象包含了一次提交的元数据信息,包括作者、提交者、提交时间、提交信息等。每个提交对象都包含一个指向对应的 Tree 对象的引用,以及可能存在的一个或多个父提交对象的引用(如果是合并提交的话)。
$ git log# commit 8c99d09c27215262526763862d44626ccd7c5875 (HEAD -> master)# 上面这串数字是提交对象的哈希值
4、Tag 对象(标签对象):
Tag 对象用于给某个特定的提交打标签,标识出一个重要的里程碑或版本号。Tag 对象通常包含了标签名称、标签信息、标签创建者等信息,以及指向被标记的提交对象的引用。
这些对象被存储在 Git 的对象数据库中,每个对象都有一个唯一的 SHA-1 校验和作为其标识符。Git 使用对象数据库来管理和存储所有的项目数据,包括文件内容、目录结构、提交历史等。
对象数据库是 Git 版本控制系统的核心组件,它提供了高效的数据存储和检索功能,确保了版本库的完整性和可靠性。
2.3 索引(Index):
索引是一个暂存区域
,用于存储当前工作目录中的更改,记录了当前工作目录中文件的状态和更改,但尚未提交到仓库中。索引是一个中间状态,介于工作目录和仓库之间。
当对文件进行修改并使用 git add
命令将这些更改添加到索引中时,Git 会根据文件的路径和内容生成一个校验和(checksum)来标识这些更改,用于确定文件内容是否发生了变化。
当执行 git commit
命令时,Git 会使用当前索引中的文件状态创建一个新的提交对象,并为该提交对象分配一个唯一的 SHA-1 校验和
作为其标识符。因此,每个提交对象都有一个唯一的 ID。
索引与当前工作目录和提交历史相关联,用于暂存和准备提交更改。提交对象具有唯一的标识符,用于标识每次提交的内容。
2.4 分支(Branch):
在 Git 中,分支(Branch)是指向 Git 仓库中的一个提交对象
的可变指针。它实际上是一个轻量级的指针
,指向了项目提交历史中的某一个提交对象。分支可以看作是一系列提交的引用,它们按照提交顺序形成了一个分支的历史记录。
每个分支都有一个名称,可以通过这个名称来引用分支。在 Git 中,默认的主分支通常被称为 "master"
分支,但也可以根据项目需求自定义其他名称的分支。分支名称通常用来表示项目的不同功能特性、开发版本或者修复补丁等。
本地会有一个HEAD
标签,代表处于工作区的分支。
分支在 Git 中扮演了重要的角色,它们提供了一种轻松管理和组织项目开发的方式。通过分支,可以实现以下功能:
1. 并行开发:多个开发人员可以在不同的分支上同时进行工作,而不会相互干扰。
2. 功能开发:每个功能特性可以在独立的分支上进行开发,便于管理和跟踪功能的开发进度。
3. 版本控制:每个版本或发布可以在单独的分支上进行管理,使得可以方便地回溯历史版本或发布新版本。
4. 修复补丁:可以在分支上快速创建和提交修复程序,然后合并到主分支中。
5.实验性开发:可以在单独的分支上进行实验性的开发,不影响主分支或其他稳定分支。
分支的创建、切换、合并和删除等操作都可以通过 Git 提供的命令轻松完成。分支是 Git 版本控制系统中一个非常强大和灵活的特性,它使得团队能够更加高效地进行协作开发,并且更好地管理和组织项目的开发流程。
三、git的基本操作
Git 的基本操作涉及到对仓库的创建、配置、文件的添加、提交、查看状态、查看历史记录等操作。下面是一些常见的 Git 基本操作及其用法:
1. 初始化仓库:
git init
:在当前目录创建一个新的 Git 仓库。
git clone <remote-url>
:从远程仓库克隆一个新的仓库到本地,并将远程仓库的地址保存为origin。也就是说这个origin是指向远程仓库的引用名。
2. 配置用户信息:
git config --global user.name "Your Name"
:配置全局用户名。
git config --global user.email "your.email@example.com"
:配置全局用户邮箱。
3. 文件:
git add <file>
:将指定文件添加到索引中。
git add .
:将当前目录下所有文件添加到索引中。
git reset HEAD <file_name>
:将文件从暂存区回退到工作区
**4.提交更改**:
git commit -m “Commit message”:将索引中的更改提交到本地仓库,并附上提交信息。
git commit --amend` : 将索引中的修改合并到最新的提交上。
5. 查看状态:
git status
:查看工作区和索引的状态,了解文件的修改状态。
6. 查看历史记录:
git log
:查看提交历史记录。
7.撤销回退:
git checkout -- <file>
:撤销对文件的修改,将文件恢复到最近一次提交的状态。
git reset HEAD <file>
:将文件从索引中移除,取消添加到暂存区的更改。
git reset [commitId]
:回退到commitId,改动全部返还给工作区
git reset [commitId] --hard
:回退到commitId,但是会删除全部的改动
8. 分支操作:
git branch <branchname>
:本地仓库创建一个新的分支。
git checkout <branchname>
:本地仓库切换到指定分支。
git merge <branchname>
:将指定分支合并到当前HEAD分支。
git checkout -b [local_branch_name] origin/[remote_branch_name]
: 本地创建一个新的分支,更新到远程的一个分支,然后切换到这个新分支。
git branch --set-upstream-to=origin/master master
:将本地的master分支和远程的master分支绑定
9. 远程操作:
git remote add origin <remote-url>
:添加远程仓库。
git push -u origin master
:将本地仓库的更改推送到远程仓库。-u 会将本地分支与远程仓库同名分支关联起来,后续就只用git push
了。
git pull origin master
:从远程仓库拉取最新更改到本地仓库。如果分支关联起来了也只用git pull
git pull -- rebase
:拉取远程分支,使用rebase方式
git push --set-upstream origin [name1]:[name2]
:将本地name1分支推送到远程的name2分支,并关联起来
git ls-remote --tags origin
: 显示远程仓库的分支的标签
10.文件比较:
git diff [commit1]
:查看暂存区和commit1
(提交对象的哈希值)提交之间的差异
git diff [commit1][commit2]
:查看commit2
相对commit1
提交而言的差异。
四、git实战
# test1 : 初始化git仓并链接到远程分支
git config --global user.email "***.***.com" # 配置全局邮箱
git config --global user.name "***" # 配置全局用户名
git init # 将当前文件夹变成git文件夹
echo "123" > 1.txt # 生成一个txt文件,写入"123"
git add . # 将修改全部添加到暂存区(索引)
git commit -m "***" # 将暂存区中的修改添加到本地仓库 PS:必须commit一次
git remote add origin https://gitee.com/***/git-demo.git # 链接远程仓库
git push -u origin master # 推入远程分支并于同名分支相关联
# test2 :推入另一个分支,假设远程有test分支,现在本地只有master
git branch test # 本地创建test分支
git checkout test # 本地切换分支到test分支
echo "123" > 2.txt # 生成一个txt文件,写入"123"
git add .
git commit -m "2"
git push -u origin test # 将本地test分支推入远程同名分支并关联
# test3 : 多人合作,假如远程有你没有的文件,需要先拉取远程pull同步
echo "123" > 3.txt
git add .
git commit -m "3"
git push # error:提示远程有你没有的文件
git pull --rebase origin master # 拉取远程提交历史到本地,再合并,即本地的修改最新
git status # 解冲突,建议用vscode。
# 如果没有冲突,直接 git push
git add . # 补充解冲突而修改的文件
git commit --amend # 将本次修改合并到上个提交对象
git push # 推入远端
# test4:绑定远程分支,pull并推送
git init # 新建一个git仓库,分支自动取名为master
echo "1" > 1.txt # 工作区模拟一次更改
git add . # 保存到暂存区
git commit -m "1" # 本地提交一笔log到本地仓库
git remote add origin git@gitee.com:****/git-demo.git # 将本地的仓库和远程的仓库关联起来
git branch --set-upstream-to=origin/master master # 将本地master分支和远程的master分支关联起来
git pull --rebase # 拉取远程分支,在远程分支的log基础上加上当前的这笔修改
git push # 推送到远程分支
test 5: 切换分支
git clone git@gitee.com:****/git-demo.git #下载远程仓库到本地,并关联master和远程的默认分支
git branch test # 新建一个test分支
git checkout test #切换到test分支
git echo "1" > 1.txt # 模拟一次更改
git add . # 保存到暂存区
git commit -m "1" # 提交一笔更改log到本地仓库
git push # 推入远程仓库默认分支
相关文章:

【版本控制】git使用指南
Git 是一个免费、开源的分布式版本控制系统,最初由 Linus Torvalds 于2005年创建。它旨在管理项目的源代码,并提供了跟踪更改、协作开发、版本控制、分支管理等功能。 一、版本控制概念 版本控制系统(Version Control System,VC…...

Flask 与小程序 的图片数据交互 过程及探讨研究学习
今天不知道怎么的,之前拿编程浪子地作品抄过来粘上用好好的,昨天开始照片突的就不显示了。 今天不妨再耐味地细细探究一下微信小程序wxml 和flask服务器端是怎么jpg图片数据交互的。 mina/pages/food/index.wxml <!--index.wxml--> <!--1px …...

【JavaEE】初识线程,线程与进程的区别
文章目录 ✍线程是什么?✍线程和进程的区别✍线程的创建1.继承 Thread 类2.实现Runnable接口3.匿名内部类4.匿名内部类创建 Runnable ⼦类对象5.lambda 表达式创建 Runnable ⼦类对象 ✍线程是什么? ⼀个线程就是⼀个 “执行流”. 每个线程之间都可以按…...
Kafka高级面试题-2024
Kafka中的Topic和Partition有什么关系? 在Kafka中,Topic和Partition是两个密切相关的概念。 Topic是Kafka中消息的逻辑分类,可以看作是一个消息的存储类别。它是按照不同的主题对消息进行分类,并且可以用于区分和筛选数据。每个…...
Qt——Qt文本读写之QFile与QTextStream的使用总结(打开文本文件,修改内容后保存至该文件中)
【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C++语言开发基础总结》 《从0到1学习嵌入式Linux开发》 《QT开发实战》 《Android开发实战》...
掌握Java中的super关键字
super 是 Java 中的一个关键字,它在继承的上下文中特别有用。super 引用了当前对象的直接父类,它可以用来访问父类中的属性、方法和构造函数。以下是 super 的几个主要用途: 1. 调用父类的构造函数 在子类的构造函数中,你可以使…...

STM32之HAL开发——系统定时器(SysTick)
系统定时器(SysTick)介绍 SysTick—系统定时器是属于 CM3 内核中的一个外设,内嵌在 NVIC 中。系统定时器是一个 24bit的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般我们设置系统时钟 SYSCLK等于 72M。当…...

Redis 不再“开源”:中国面临的挑战与策略应对
Redis 不再“开源”,使用双许可证 3 月 20 号,Redis 的 CEO Rowan Trollope 在官网上宣布了《Redis 采用双源许可证》的消息。他表示,今后 Redis 的所有新版本都将使用开源代码可用的许可证,不再使用 BSD 协议,而是采用…...

刚刚,百度和苹果宣布联名
百度 Apple 就在刚刚,财联社报道,百度将为苹果今年发布的 iPhone16、Mac 系统和 iOS18 提供 AI 功能。 苹果曾与阿里以及另外一家国产大模型公司进行过洽谈,最后确定由百度提供这项服务,苹果预计采取 API 接口的方式计费。 苹果将…...

HTTP系列之HTTP缓存 —— 强缓存和协商缓存
文章目录 HTTP缓存强缓存协商缓存状态码区别缓存优先级如何设置强缓存和协商缓存使用场景 HTTP缓存 HTTP缓存时利用HTTP响应头将所请求的资源在浏览器进行缓存,缓存方式分两种:强缓存和协商缓存。 浏览器缓存是指将之前请求过的资源在浏览器进行缓存&am…...

代码+视频,R语言logistic回归交互项(交互作用)的可视化分析
交互作用效应(p for Interaction)在SCI文章中可以算是一个必杀技,几乎在高分的SCI中必出现,因为把人群分为亚组后再进行统计可以增强文章结果的可靠性,不仅如此,交互作用还可以使用来进行数据挖掘。在既往文章中,我们已…...

实验3 中文分词
必做题: 数据准备:academy_titles.txt为“考硕考博”板块的帖子标题,job_titles.txt为“招聘信息”板块的帖子标题,使用jieba工具对academy_titles.txt进行分词,接着去除停用词,然后统计词频,最…...

ReentrantLock 原理
(一)、非公平锁实现原理 1、加锁解锁流程 先从构造器开始看,默认为非公平锁实现 public ReentrantLock() {sync new NonfairSync(); } NonfairSync 继承自 AQS 没有竞争时 加锁流程 构造器构造,默认构造非公平锁(无竞争,第一个线程尝试…...

星云小窝项目1.0——项目介绍(一)
星云小窝项目1.0——项目介绍(一) 文章目录 前言1. 介绍页面2. 首页2.1. 游客模式2.2. 注册用户后 3. 星云笔记3.1. 星云笔记首页3.2. 星云笔记 个人中心3.2. 星云笔记 系统管理3.3. 星云笔记 文章展示3.3. 星云笔记 新建文章 4. 数据中心5. 交流评论6. …...
VR虚拟仿真在线模拟旅游专业情景
旅游专业运用VR虚拟仿真教学的教学优势主要包括: 1. 增强教学效果:VR技术能够提供身临其境的体验,使学生更容易理解和记住某些概念和理论。例如,学生可以通过虚拟旅行来了解某个国家的文化、历史和景点,这将比传统的课…...

ROS 2边学边练(3)-- 何为节点(nodes)
在接触节点这个概念之前,我们先来看看下面这张动态图,更方便我们理解一些概念和交互过程。 (相信大家的英文基础哈) 概念 如上图所示,这里面其实涉及到了三个概念(功能),分别是节点…...

MySQL的主从复制和读写分离
目录 相关知识: 1. 主从复制和读写分离 2. mysql 支持的复制类型 对比: 一. 主从复制 1. 原理和工作过程 工作过程: 注意: 中继日志(Relay Log): 2. 一些理解问题 2.1 为什么要复制 …...
C# 多态 派生类 abstract virtual new
静态多态函数重载运算符重载 动态多态abstract 和 virtual的区别定义与用途:成员实现:继承与重写:与接口的区别: 使用抽象类的好处主要体现在以下几个方面:代码重用:设计灵活性:接口定义&#x…...

【爬虫基础】第10讲 urlerror的使用及捕获异常
URLError是Python中的一个异常类,用于处理与URL相关的错误。它是urllib.error模块中的一个类。 URLError通常在以下情况下被引发: 网络连接问题:例如无法连接到服务器、超时等。URL不正确:例如无效的URL、无法解析主机名等。服务…...
绍兴越城中墙建材蒸压加气混凝土砌块使用注意事项可送塔山府山北海蕺山城南稽山迪荡灵芝东湖皋埠马山斗门鉴湖东浦孙端陶堰富盛
绍兴越城中墙建材蒸压加气混凝土砌块使用注意事项可送塔山府山北海蕺山城南稽山迪荡灵芝东湖皋埠马山斗门鉴湖东浦孙端陶堰富盛 使用蒸压加气混凝土砌块时需要注意以下事项: 选择符合国家标准的产品:选购时应查看产品质量证明书,确保产品符合…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...