Git 基本原理和常用操作

Git

Git 是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。由 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开源的版本控制软件。

Git 常用操作

git 提交流程:工作区 -> git add 到暂存区 -> git commit 到本地版本库 -> git push 到远程库

远程库:局域网有 Gitlab;互联网有 GitHub、Gitee

git commit -m ""![
Git中最重要的就是提交记录,其他如标签分支HEAD 都对提交记录的“指针”引用,指向这些提交记录。

  • 提交记录之间也存在“指针”引用,每个提交会指向其上一个提交。
  • 标签 就是对某一个提交记录的的 固定 “指针”引用,取一个别名更容易记忆一些关键节点。存储在工作区根目录下.git\refs\tags
  • 分支 也是指向某一个提交记录的“指针”引用,“指针”位置可变,如提交、更新、回滚。存储在工作区根目录下.git\refs\heads
  • HEAD:指向当前工作分支/活动分支(最新提交)的一个“指针”引用,存在在“.git/HEAD”文件中,存储的内容为“ref: refs/heads/master”。相当于在一个 commit 链表上的指针,链表上的每个节点都是一次 commit。

checkout

分支切换,使用 git checkout dev切换分支时,干了两件事:

  • ①、HEAD指向dev:修改HEAD的“指针”引用,指向dev分支。
  • ②、还原工作空间:把dev分支内容还原到工作空间。

切换时还没提交的代码怎么办?

  • 如果修改(包括未暂存、已暂存)和待切换的分支没有冲突,则切换成果,且未提交修改会一起带过去,所以要注意!
  • 如果有冲突,则会报错,提示先提交或隐藏,关于隐藏可查看后续章节内容“stash”。

checkout 也可用于撤销,只针对未提交的修改。

commit --amend

如果我们提交修改后发现有些文件没有添加,或者提交信息写错了,则可以通过 --amend 选项修正提交。

reset

重置版本,原理是通过移动 HEAD 指针,所以支持回退版本和重新恢复回退前的版本,可以实现版本之间的来回穿梭。

三种模式

  • soft,工作区、暂存区状态不变
  • mixed,默认模式,工作区不变,撤销暂存区状态
  • hard,强制回退,撤销工作区和暂存区状态!

注意,hard 模式 操作会丢失reset之前的未提交的代码!(也可以恢复但是比较麻烦)

revert

撤销提交,安全撤销某一个提交记录,基本原理就是创建一个新的提交,用原提交的逆向操作来完成撤销操作。注意,这不同于resetreset是回退版本,revert只是用于撤销某一次历史提交,操作是比较安全的。

merge

合并分支,把两个分支的修改内容合并到一起,git merge [branch],将分支[branch]合并到当前分支。根据要合并的内容的不同,具体合并过程就会有多种情况。

rebase

衍合分支,变基,把两个分支的修改内容合并到一起的办法有两种:mergerebase,作用都是一样的,区别是rebase的提交历史更简洁,干掉了提交分叉,但 merge 的提交历史更完整,更可追溯。

rebase 是一个相当强大的命令,rebase可以加上-i进行交互式地变基,我们可以在任何想要的修改完成之后停止,也可以添加文件或者是做其他想要做的事情。

rebase 命令推荐文章:

git rebase详解(图解+最简单示例,一次就懂)_风中一匹狼v的博客-CSDN博客

详解git rebase,让你走上git大神之路 - 知乎 (zhihu.com)

Git提交错了不用慌,这三招帮你修改记录 - 知乎 (zhihu.com)

git rebase的时候捅娄子了,怎么办?在线等…… - 知乎 (zhihu.com)

stash

隐藏操作,如果切换分支时,未提交修改的内容没有冲突,是可以成功切换的,未提交修改会被带过去。

但是如果有未提交修改,切换分支时报错,那么就可以把当前工作区、暂存区 未提交的内容“隐藏”起来,就像什么都没发生一样。

cherry-pick

拣选提交,选择一个commit,合并进当前分支。

状态模型

工作区(workspace)

当前工作空间,也就是在本地文件夹下看到的文件结构。初始化工作空间或者工作空间 clean 的时候,文件内容和 index 暂存区是一致的,随着修改,工作区文件在没有 add 到暂存区时候,工作区将和暂存区是不一致的。

当我们做出了新增/修改,在 add 之前,这些修改还在工作区,通常我们会在 IDE 中设置 默认将修改 add 到暂存区(至少我是这么搞的)。此时文件的状态为 已修改(modified)

暂存区(stage/index)

也被叫做索引,文件暂时存放的地方,所有暂时存放在暂存区中的文件将随着一个 commit 一起提交到 local repository 此时 local repository 里面文件将完全被暂存区所取代。

将工作区的修改 add 了之后,这些修改就在暂存区了。此时文件的状态为 已暂存(staged)

本地仓库(local repository)

即 .git 目录,git 是分布式版本控制系统,和其他版本控制系统不同的是他可以完全去中心化工作,你可以不用和中央服务器 (remote server) 进行通信,在本地即可进行全部离线操作,包括 log,history,commit,diff 等等。完成离线操作最核心是因为 git 有一个几乎和远程一样的本地仓库,所有本地离线操作都可以在本地完成,等需要的时候再和远程服务进行交互。

将暂存区的修改 commit 之后,这些修改就被会提交到本地仓库,并生成 commit 对象。此时文件的状态为 已提交(committed)

远程仓库(remote repository)

开发成员内共享,本地仓库会和远程仓库进行交互,也就能将其他人的修改更新到本地仓库,把自己的修改上传至远程仓库供其他人获取。结构大体和本地仓库一样。

当执行了 push 之后,对应的 commit 就被提交到远程仓库了。

对象模型

git 在本地是有一个完整的 git 仓库也就是 .git 文件目录,通过这个仓库,git 就可以完全离线化操作。在这个本地化的仓库中存储了 git 所有的模型对象。

git 主要有四个对象,分别是 Blob,Tree,Commit,Tag 他们都用 SHA-1 进行命名。SHA-1(Secure Hash Algorithm 1)是一种密码散列函数,即散列加密,SHA-1可以生成一个被称为消息摘要的160位(20字节)散列值,散列值通常的呈现形式为40个十六进制数。

Blob 对象

只用于存储单个文件内容,一般都是二进制的数据文件,不包含任何其他文件信息,比如不包含文件名和其他元数据。

Tree 对象

对应文件系统的目录结构,里面主要有:子目录 (tree),文件列表 (blob),文件类型以及一些数据文件权限模型等。

Commit 对象

是修改过的文件集的一个快照,随着一次 commit 操作,将创建一个 commit 对象,修改过的文件将会被提交到 local repository 中。通过 commit 对象,在版本化中可以检索出每次修改内容,是版本化的基石。

Tag 对象

tag 是一个"固化的分支",一旦打上 tag 之后,这个 tag 代表的内容将永远不可变,因为 tag 只会关联当时版本库中最后一个 commit 对象。一般应用或者软件版本的发布一般用 tag。

存储模型

Svn 等其他的 VCS 对文件版本的理念是以文件为水平维度,记录每个文件在每个版本下的 delta 改变。

Git 对文件版本的管理理念却是以每次提交为一次快照,而不是进行差异比较,提交时对所有修改过的文件做一次全量快照,然后存储快照引用。Git 在存储层,如果文件数据没有改变的文件,Git 只是存储指向源文件的一个引用,并不会直接多次存储文件,这一点可以在 pack 文件中看见。

参考文章&推荐阅读

  • 这才是真正的Git——Git内部原理揭秘! - 知乎 (zhihu.com)
  • 一文讲透 Git 底层数据结构和原理 - 知乎 (zhihu.com)
  • Git入门图文教程(1.5W字40图)🔥🔥–深入浅出、图文并茂 - 安木夕 - 博客园 (cnblogs.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/124656.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pytorch中如何加载数据、Tensorboard、Transforms的使用

一、Pytorch中如何加载数据 在Pytorch中涉及到如何读取数据,主要是两个类一个类是Dataset、Dataloader Dataset 提供一种方式获取数据,及其对应的label。主要包含以下两个功能: 如何获取每一个数据以及label 告诉我们总共有多少的数据 Datal…

C++多态【下】

文章目录 1.多态实现的底层1.1初识多态原理1.2深入理解虚函数表1.单继承虚函数表2.探究虚函数表存储数据3.知识点金4.多继承虚函数表 2.题目讲解 1.多态实现的底层 1.1初识多态原理 class Dad { public:virtual void Cook() { cout << "佛跳墙" << en…

Can‘t connect to local MySQL server through socket ‘/tmp/mysql.sock‘

最近在用django框架开发后端时&#xff0c;在运行 $python manage.py makemigrations 命令时&#xff0c;报了以上错误&#xff0c;错误显示连接mysql数据库失败&#xff0c;查看了mysql数据库初始化配置文件my.cnf&#xff0c;我的mysql.sock文件存放路径配置在了/usr/local…

【微服务部署】08-监控与告警

文章目录 1. PrometheusOperator1.1 优势1.2 配置脚本1.3 部署脚本 2. Granfana实现监控看板2.1 Granfana核心特性2.2 部署文件 3. prometheus-net收集自定义指标3.1 组件包3.2 使用场景 目前Kubernetes中最流行的监控解决方案是使用Prometheus和AlertManager 1. PrometheusOpe…

jar包或exe程序设置为windows服务

最近在使用java和python制作客户端时突发奇想&#xff0c;是否能够通过一种方法来讲jar包和exe程序打包成windows服务呢&#xff1f;简单了解了一下是可以的。 首先要用到的是winSW&#xff0c;制作windows服务的过程非常简单&#xff0c;仅需几步制作完成&#xff0c;也不需要…

ESP32-C3的存储器类型

本文主要参考ESP-IDF编程指南&#xff0c;一点小记录。 ESP32-C3的存储器有&#xff1a; ESP-IDF 区分了指令总线&#xff08;IRAM、IROM、RTC FAST memory&#xff09;和数据总线 (DRAM、DROM)。 内部SRAM的一部分是指令RAM(IRAM)。那为什么要把指令放在RAM中&#xff0c;就是…

Zookeeper简述

数新网络-让每个人享受数据的价值 官网现已全新升级—欢迎访问&#xff01; 前 言 ZooKeeper是一个开源的、高可用的、分布式的协调服务&#xff0c;由Apache软件基金会维护。它旨在帮助管理和协调分布式系统和应用程序&#xff0c;提供了一个可靠的平台&#xff0c;用于处理…

QT第二天

1.优化登陆界面&#xff0c;当点击登录按钮后&#xff0c;在该按钮对应的槽函数中&#xff0c;判断账户和密码框内的数据是否为admin和123456&#xff0c;如果账户密码匹配成功&#xff0c;则提示登陆成功并关闭登录界面&#xff0c;如果账户密码匹配失败&#xff0c;则提示登录…

嵌入式开发-11 Linux下GDB调试工具

目录 1 GDB简介 2 GDB基本命令 3 GDB调试程序 1 GDB简介 GDB是GNU开源组织发布的一个强大的Linux下的程序调试工具。 一般来说&#xff0c;GDB主要帮助你完成下面四个方面的功能&#xff1a; 1、启动你的程序&#xff0c;可以按照你的自定义的要求随心所欲的运行程序&#…

介绍PHP

PHP是一种流行的服务器端编程语言&#xff0c;用于开发Web应用程序。它是一种开源的编程语言&#xff0c;具有易学易用的语法和强大的功能。PHP支持在服务器上运行的动态网页和Web应用程序的快速开发。 PHP可以与HTML标记语言结合使用&#xff0c;从而能够生成动态的Web页面&a…

Python Opencv实践 - Harris角点检测

参考资料&#xff1a;https://blog.csdn.net/wsp_1138886114/article/details/90415190 import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/chinease_tower.jpg", cv.IMREAD_COLOR) plt.imshow(img[:,:,::-1])#…

CSS笔记(黑马程序员pink老师前端)浮动,清除浮动

浮动可以改变标签的默认排列方式。浮动元素常与标准流的父元素搭配使用. 网页布局第一准则:多个块级元素纵向排列找标准流&#xff0c;多个块级元素横向排列找浮动。 float属性用于创建浮动框&#xff0c;将其移动到一边&#xff0c;直到左边缘或右边缘触及包含块或另一个浮动框…

xss前十二关靶场练习

目录 一、xss原理和分类 1.原理 2.分类&#xff1a;xss分为存储型和反射型以及dom型 &#xff08;1&#xff09;反射性 &#xff08;2&#xff09;存储型 &#xff08;3&#xff09;dom型 二、靶场关卡练习​编辑 1.第一关 2.第二关 3.第三关 4.第四关 5.第五关 6…

Redis——认识Redis

简单介绍 Redis诞生于2009年&#xff0c;全称是Remote Dictionary Server&#xff0c;远程词典服务器&#xff0c;是一个基于内存的键值型NoSQL数据库。 特征 键值&#xff08;Key-value&#xff09;型&#xff0c;value支持多种不同数据结构&#xff0c;功能丰富单线程&…

对象模型和this指针(个人学习笔记黑马学习)

1、成员变量和成员函数 #include <iostream> using namespace std; #include <string>//成员变量和成员函数分开存储class Person {int m_A;//非静态成员变量 属于类的对象上的static int m_B;//静态成员变量 不属于类的对象上void func() {} //非静态成员函数 不…

博客程序系统其它功能扩充

一、注册功能 1、约定前后端接口 2、后端代码编写 WebServlet("/register") public class RegisterServlet extends HttpServlet {Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//设置…

《向量数据库指南》——提高向量数据库Milvus Cloud 2.3的运行效率

简介:向量数据库彻底改变了我们处理复杂数据结构的方式: 向量数据库彻底改变了我们处理复杂数据结构的方式,为高维矢量提供了高效的存储和检索。作为向量数据库专家和《向量数据库指南》的作者,我很高兴能与大家分享向量数据库运行效率方面的最新进展。在本文中,我们将探讨…

ARM编程模型-常用指令集

一、ARM指令集 ARM是RISC架构&#xff0c;所有的指令长度都是32位&#xff0c;并且大多数指令都在一个单周期内执行。主要特点&#xff1a;指令是条件执行的&#xff0c;内存访问使用Load/store架构。 二、Thumb 指令集 Thumb是一个16位的指令集&#xff0c;是ARM指令集的功能…

PandaGPT部署演示

PandaGPT 是一种通用的指令跟踪模型&#xff0c;可以看到和听到。实验表明&#xff0c;PandaGPT 可以执行复杂的任务&#xff0c;例如生成详细的图像描述、编写受视频启发的故事以及回答有关音频的问题。更有趣的是&#xff0c;PandaGPT 可以同时接受多模态输入并自然地组合它们…

嵌入式linux(imx6ull)下RS485接口配置

接口原理图如下&#xff1a; 由原理图可知收发需要收UART_CTS引脚控制,高电平时接收&#xff0c;低电平时发送。通过查看Documentation/devicetree/bindings/serial/fsl-imx-uart.yaml和Documentation/devicetree/bindings/serial/rs485.yaml两个说明文档&#xff0c;修改设备树…