Git基础

1、本地版本控制系统、集中式版本控制系统与分布式版本控制系统

       文档: Git - 关于版本控制
        1. 本地版本控制系统(Local Version Control System):
   本地版本控制系统是最简单的版本控制系统,它基于文件的复制和备份来记录和管理版本历史。开发人员在自己的计算机上维护一个本地代码库,可以通过手动复制和备份文件来跟踪和管理版本变化。这种系统只能由单个开发者在单个计算机上使用,无法实现多人协作和远程访问。

        2. 集中式版本控制系统(Centralized Version Control System,简称 CVCS)是一种版本管理系统,其中所有源代码和版本历史都存储在中央服务器上。开发者通过从中央服务器中拉取最新版本的代码,并将自己的更改推送到中央服务器来协作工作。每个开发者只能在一个中央代码库中工作,且需要定期与中央服务器进行通信以同步代码。

       3.  分布式版本控制系统(Distributed Version Control System,简称 DVCS)也是一种版本管理系统,不同于CVCS,每个开发者都拥有一个完整的代码副本,包括整个代码库和完整的版本历史记录。开发者可以在本地独立工作,无需频繁与中央服务器进行通信。DVCS 允许开发者在本地创建分支、进行更改、提交更改,并与其他开发者共享和合并这些更改。

        分布式版本控制系统每个开发者都有完整的代码库的拷贝,包括完整的历史记录。开发者可以在本地独立工作,并记录所有版本的历史。这意味着开发者可以在没有网络连接的情况下进行提交、分支、合并等操作,并具备本地备份能力。分布式版本控制系统支持多人协作和远程访问,开发者可以轻松地共享代码、合并更改,并在分布式环境中进行同步。缺点:分布式版本控制系统对于初学者来说可能复杂一些,需要努力理解和掌握分布式工作流程和协作方式。
常见的分布式版本控制系统有Git和Mercurial。

        简而言之,集中式版本控制系统依赖于中央服务器来存储和管理代码库,开发者需要通过与中央服务器的交互来进行协作。而分布式版本控制系统则将完整的代码库和版本历史记录分发到每个开发者的本地,开发者可以在本地独立工作,通过合并操作来进行代码的同步和协作。
 

2、分布式版本控制系统的提交与协作原理?

       “分布式版本控制系统中,每个开发者都可以在没有网络连接的情况下进行提交、分支、合并等操作”,为什么可以在没有网络连接的情况下进行提交、分支、合并等操作?开发者是在本地进行提交,那为什么还可以支持多人协作和远程访问? 

        在分布式版本控制系统(Distributed Version Control System,DVCS)中,每个开发者都可以在没有网络连接的情况下进行提交、分支、合并等操作的原因是每个开发者都拥有完整的代码库的副本。在一个分布式版本控制系统中,每个开发者都有一个完整的代码库复制品,包含了完整的历史记录和分支信息。这意味着每个开发者都可以在本地进行提交、分支、合并等操作,而无需依赖网络连接,无需与远程代码库进行通信。

        当网络连接恢复时,开发者可以将本地的提交、分支和合并操作同步到远程代码库中,并与其他开发者共享代码更改,因此支持多人协作和远程访问。分布式版本控制系统的这种权威性和灵活性使得开发者可以在独立的环境中进行工作,并在需要的时候才与其他开发者进行同步和协作。

3、为什么要版本控制?

对比文件在各个状态的区别

使文件回溯到某个指定的历史状态  

4、​​​​​​​Git文件的三种状态与GIt项目的三个section

1、Git文件的三种状态:已提交(commited)、已修改(modifiled)、和已暂存(staged) 

        已提交:表示数据已经安全地保存在本地数据库中。

        已修改:表示修改了文件,但还没保存到数据库中。

        已暂存:表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。

2、与此对应的是GIt项目的三个section:工作区、暂存区、Git目录。

  • 工作区是对项目的某个版本独立提取出来的内容。这些从Gt仓库的本地压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。修改后的文件放至暂存区。
  • 暂存区是一个文件,保存了下次将要提交的文件列表信息,一般在Gt仓库目录中。暂存区中“commit”才是真正的提交保存了。
  • ​​​​​​​Git仓库目录是Git用来保存项目的元数据和对象数据库的地方。这是GIt中最重要的部分,从其它计算机克隆仓库时,复制的就是这里的数据

    当从其他计算机克隆一个 Git 仓库时,复制的是整个 Git 仓库目录中的数据,而不仅仅是工作目录中的文件。这是因为 Git 采用了分布式版本控制系统的设计理念,每个克隆的仓库都是一个完整的副本,包含完整的历史记录、分支信息和元数据。该副本称为本地仓库。
    Git 的核心是一个版本控制数据库,数据库中存储了代码的完整历史和所有版本的元数据。当你克隆一个 Git 仓库时,实际上是将整个版本控制数据库完整地复制到本地计算机上。
    这样,当你在本地进行提交、分支、合并等操作时,Git 可以在本地仓库中处理这些操作,而不需要依赖网络连接和远程仓库。
    通过复制整个仓库目录中的数据,包括版本控制数据库和工作目录中的文件,Git 可以在本地完整地重现远程仓库的状态和历史,使得你可以在本地进行代码管理和版本控制的操作。同时,这也意味着你可以在没有网络连接的情况下进行提交、分支、合并等操作,只需要依赖本地仓库即可.

3、Git中的文件的状态变化周期:

  • 请记住:对于一个刚刚clone到本地的repo,所有文件都是Unmodified状态.

    新创建文件:echo 'Hello World' > a.md
    就创建了一个名为a.md的文件
    可以使用git status命令查看文件状态:
    ​​​​​​​刚刚创建的文件,使用git add指令将文件提交到了暂存区,此时文件显示可以被提交了“commit”。

    此时再执行一个git commit就将暂存区的文件提交了。如果只输入git commit,则会跳转至一个交互的文件界面,可以在里面编辑一些提交信息。也可以在git commi后面加上一些参数,就不会发生跳转了。

    撤销提交申请:git reset命令

    创建文件:echo '文件内容' > 文件名
    查看文件状态:git status
    提交至缓存区:git add
    提交文件:git commit
    撤销提交申请:git reset
    ​​​​​​

4、分支的概念

这个可视化工具可以方便地学习分支变化:Learn Git Branching

分支是git最重要的的特性。
Gt的分支非常轻量,原因是它本质上仅仅是指向提交对象的可变指针。​​​​​​​

使用git branch命令创建分支:git branch    分支名    (这会在当前所提交的对象上面创建一个指针)
例如:git branch   dev-1
所以在演示模型里此时看到,增加了一个“dev-1”的指针,指向了c2。main指针与dev-1指针同时指向了c2结点。
那么git又是怎么知道当前在哪一个分支上呢?也很简单,它有一个名为HEAD的特殊指针,指向当前所在的本地分支。(上面的演示中,main后面的*就是HEAD指针(头指针))
可以使用chekout命令,切换HEAD指针,移动到另一个分支上面。
例如:上面的演示中,HEAD分支在main上面,使用git chekout dev-1命令,可以是HEAD指针切换到dev-1上面。

可以使用git chekout -b创建并切换分支。
每次都要记得git commit
可以使用git merge命令合并分支。
例如:先把HEAD指针切换回main上,再将dev-1分支合并到main分支上:
 

git checkout main 
git merge dev-1

这时我们会发现并没有所谓的"合并”,而是main指针向前移动到dev-1指针的位置,这种叫作fast-forward merge.
如果顺着一个分支走下去能够到达另一个分支,那么Git在合并两者的时候,只会简单
的将指针向前推进(指针右移),因为这种情况下的合并操作没有需要解决的分歧一这
就叫做"快进(fast-forward)"。如果不能fast-forward merge,就会变成typical merge.(演示)
继续演示:

所以,C1,C2……都是提交后更新?

注:即使满足fast-forward条件,也可通过指定-no-ff参数转为typical merge.
如果合并过程中存在冲突,需要解决冲突,然后执行git merge continue继续完成合并。

远程分支:Git - 远程分支

5、 Git的工作流程

注意与之前提到的GitHub Flow区分开。GitHub Flow是协作流。Git是本地操作流。

Git的工作流程如下:

1.在工作区中修改文件。

2.将你想要下次提交的更改选择性地暂存,这样只会将更改的部分添加到暂存区。

3.提交更新,找到暂存区的文件,将快照永久性存储到Gt目录。


1、确认本地Git已经安装好

检查git --version 是否出现git的版本即可。

2、做一些基本配置,这里主要配置全局user信息:​​​​​​​

git config -global user.name "双引号中写你的用户名"
git config -global user.email "双引号中写你的邮箱"

3、通过SSH访问GitHub:

终端输入ssh-keygen
然后输入文件名:ssh_Github_identification
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
这两行提示中,输入的密码将会成为为私钥设置的密码短语。
再执行: mv ssh_Github_identification ~/.ssh/ssh_Github_identification

将文件移至ssh目录下,方便使用。
下面的操作可以看教程:
新增 SSH 密钥到 GitHub 帐户 - GitHub 文档
 

此时是使用了 `ssh-keygen` 命令来生成 SSH 密钥对。这对密钥包括一个私钥和一个公钥,它们通常用于身份验证和安全通信。

1. 生成密钥对:`ssh-keygen` 命令生成了一个 RSA 密钥对,包括一个私钥和一个公钥。

2. 密钥保存位置:系统要求你指定一个保存密钥的文件位置。我将私钥和公钥保存在了一个名为 `ssh_Github_identification` 的文件中。
(通常,这两个密钥应该保存在默认的 `~/.ssh` 目录中,以确保 SSH 客户端能够找到它们。如果你选择将其保存在非默认位置,记得以后在使用 SSH 时要指定这个自定义路径。)

3. 密码短语:可以选择为私钥设置密码短语。密码短语是私钥的额外保护层,用于加强安全性。

4. 密钥指纹:SSH 生成了密钥的指纹,它是密钥的唯一标识符。它以 SHA256 格式显示,并附带一个随机艺术图像。指纹和随机艺术图像通常用于验证密钥的完整性。

​​​​​​​4、基本操作

1、使用Git clone命令克隆远程仓库到本地:
git clone github上仓库的链接

例如:

2、创建本地仓库

使用mkdir创建一个本地仓库,使用git init命令初始化本地仓库成为一个git的一个管理仓库。
可以使用git status命令查看文件状态:

这表示当前分支和远程的分支保持一致。

​​​​​​​3、远程仓库交互

我们本地的代码都是通过git clone从远程拉取的,我们可以使用git remote命令查看远程仓库:
1、终端输入:git remote     会显示:origin

2、输入 git remote -v  显示当前Git仓库中配置的所有远程仓库的详细信息,包括远程仓库的名称和URL。

运行`git remote -v`命令会输出类似下面的信息:
origin  https://github.com/user/repo.git (fetch)
origin  https://github.com/user/repo.git (push)

fetch是拉代码,push是推代码。

git fetch origin是拉取远程仓库代码(将远程仓库中的代码更新至本地仓库,如果没有显示,则代码两处的代码是一致的),
git pull origin:这个代码更经常使用,pull = fetch + merge
用于从名为"origin"的远程仓库拉取最新的代码更新到本地仓库并自动合并(merge)到当前分支。
3、添加其他远程仓库:git remote add
`git remote add`是一个Git命令,用于将一个远程仓库添加到当前的本地仓库中,并命名该远程仓库的别名。命令的语法如下:
git remote add <远程仓库别名> <远程仓库URL>

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

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

相关文章

Vue-2.1scoped样式冲突

默认情况&#xff1a;写在组件中的样式会全局生效->因此很容易造成多个组件之间的样式冲突问题 1.全局样式&#xff1a;默认组件中的样式会作用到全局 2.局部样式&#xff1a;可以给组件加上scoped属性&#xff0c;可以让样式只作用于当前组件 <style scoped> <…

轻松实现时间录入自由!如何在Microsoft Word中轻松插入格式化的日期和时间

在文档中插入当前日期和时间有几个原因。你可能希望将其插入信函或页眉或页脚中。无论是什么原因&#xff0c;Word都可以轻松地将日期和时间插入文档。 如果希望在打开或打印文档时自动更新日期和时间&#xff0c;可以将其作为自动更新的字段插入。该字段也可以随时手动更新。…

H5逆向之远程RPC

引言前一讲说过H5 怎么去抓包,逆向分析。其中说到RPC。这一节详细讲一下。有一种情况,JS 比较复杂,混淆的厉害。 这个时候就用到RPC。原理就是,hook web 浏览器,直接调用js 里边的方法。 Node 服务。为什么用到Node 服务,先来看下这架构 Node 对外提供各种接口,外部可以…

AVS3:DMVR

AVS3中引入了解码端运动矢量修正&#xff08;DMVR,Decoder side Motion Vector Refinement&#xff09;技术&#xff0c;AVS3中的DMVR技术和G.266/VVC类似&#xff0c;它可以在解码端生成运动参数从而减少传输运动参数的码率开销。它的基本思想是将skip/direct模式生成的前后向…

Swagger使用详解

目录 一、简介 二、SwaggerTest项目搭建 1. pom.xml 2. entity类 3. controller层 三、基本使用 1. 导入相关依赖 2. 编写配置文件 2.1 配置基本信息 2.2 配置接口信息 2.3 配置分组信息 2.3.1 分组名修改 2.3.2 设置多个分组 四、常用注解使用 1. ApiModel 2.A…

IDEA的使用(三)Debug(断点调试)(IntelliJ IDEA 2022.1.3版本)

编程过程中如果出现错误&#xff0c;需要查找和定位错误时&#xff0c;借助程序调试可以快速查找错误。 编写好程序后&#xff0c;可能出现的情况&#xff1a; 1.没有bug。 使用Debug的情况&#xff1a; 2.运行后&#xff0c;出现错误或者异常信息&#xff0c;但是通过日志文件…

go的面向对象学习

文章目录 面向对象编程(上)1.问题与解决思路2.结构体1》Golang语言面向对象编程说明2》结构体与结构体变量(实例/对象)的关系的示意图3》入门案例(using struct to solve the problem of cat growing) 3.结构体的具体应用4.创建结构体变量和访问结构体字段5.struct类型的内存分…

vue3 组件v-model绑定props里的值,修改组件的值要触发回调

很早之前就写了&#xff0c;一直没写篇博客记录下 <select v-model"typeVal" />const emit defineEmits([update:type]); const props defineProps({type: { type: String, default: }, });const typeVal computed({get() {return props.type;},set(value…

Docker-compose创建LNMP服务并运行Wordpress网站平台

一、部署过程 1.安装Docker #关闭防火墙 systemctl stop firewalld.service setenforce 0#安装依赖包 yum install -y yum-utils device-mapper-persistent-data lvm2 #设置阿里云镜像源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/d…

17基于matlab卡尔曼滤波的行人跟踪算法,并给出算法估计误差结果,判断算法的跟踪精确性,程序已调通,可直接运行,基于MATLAB平台,可直接拍下。

17基于matlab卡尔曼滤波的行人跟踪算法&#xff0c;并给出算法估计误差结果&#xff0c;判断算法的跟踪精确性&#xff0c;程序已调通&#xff0c;可直接运行&#xff0c;基于MATLAB平台&#xff0c;可直接拍下。 17matlab卡尔曼滤波行人跟踪 (xiaohongshu.com)

【Redis学习1】Redis持久化机制详解

Redis持久化机制详解 一、Redis为什么需要持久化机制 Redis一般用作缓存&#xff0c;其数据存储在内存中&#xff0c;当Redis宕机后&#xff0c;内存中的数据将会丢失。因此使用缓存的时候&#xff0c;我们经常需要对内存中的数据进行持久化也就是将内存中的数据写入到硬盘中…

Jetpack:004-如何使用文本组件

文章目录 1. 概念介绍2. 使用方法2.1 通用参数2.2 专用参数 3. 示例代码4. 内容总结 我们在上一章回中介绍了Jetpack组件在布局中的对齐方式&#xff0c;本章回中主要介绍文 本组件的使用方法。闲话休提&#xff0c;让我们一起Talk Android Jetpack吧 1. 概念介绍 我们在本章…

基于ffmpeg给视频添加时间字幕

FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序&#xff0c;我们可以基于ffmpeg对视频进行各种操作。本文主要介绍基于ffmpeg给视频添加字幕&#xff0c;字幕的内容为视频所播放的时间&#xff08;故需要安装ffmpeg&#xff0c;具…

ssti 前置学习

python venv环境 可以把它想象成一个容器&#xff0c;该容器供你用来存放你的Python脚本以及安装各种Python第三方模块&#xff0c;容器里的环境和本机是完全分开的 创建venv环境安装flask #apt install python3.10-venv #cd /opt #python3 -m venv flask1 #cd /opt 选…

吃透底层:从路由到前缀树

前言 今天学到关于路由相关文章&#xff0c;发现动态路由中有一个很常见的实现方式是前缀树&#xff0c;很感兴趣这个算法&#xff0c;故进行记录。 前缀树 Trie&#xff08;又被叫做字典树&#xff09;可以看作是一个确定有限状态自动机&#xff0c;尽管边上的符号一般是隐含…

Netty通信在中间件组件中的广泛使用-Dubbo3举例

Netty是一个高性能异步IO通信框架&#xff0c;封装了NIO&#xff0c;对各种bug做了很好的优化解决。所以很多中间件底层的通信都会使用Netty&#xff0c;比如说&#xff1a;Dubbo3&#xff0c;rocketmq&#xff0c;ElasticSearch等。 比方说&#xff0c;我们使用dubbo作为rpc跨…

基于SSM线上课程管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

C++构造函数

在本文中&#xff0c;您将学习C 中的构造函数。您将学习什么是构造函数&#xff0c;如何创建它以及C 中的构造函数类型。 构造函数是成员函数的一种特殊类型&#xff0c;它在创建对象时会自动对其进行初始化。编译器通过其名称和返回类型将给定的成员函数标识为构造函数。构造函…

各报文段格式集合

数据链路层-- MAC帧 前导码8B&#xff1a;数据链路层将封装好的MAC帧交付给物理层进行发送&#xff0c;物理层在发送MAC帧前&#xff0c;还要在前面添加8字节的前导码&#xff08;分为7字节的前同步码1字节的帧开始定界符&#xff09;MAC地址长度6B数据长度46&#xff5e;1500B…

爬取微博热榜并将其存储为csv文件

&#x1f64c;秋名山码民的主页 &#x1f602;oi退役选手&#xff0c;Java、大数据、单片机、IoT均有所涉猎&#xff0c;热爱技术&#xff0c;技术无罪 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 获取源码&#xff0c;添加WX 目录 前言1.…