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,一经查实,立即删除!

相关文章

域名抢注和域名注册

随着互联网的发展&#xff0c;域名已经成为了企业和个人在网络上展示自己的重要标志。如何获得一段好记、易拼写、有意义的域名&#xff0c;是很多人都面临的问题。本文将介绍域名抢注和域名注册的相关内容&#xff0c;并推荐ym.qqmu.com这个可靠的域名注册平台。 一、什么是域…

Vue-2.1scoped样式冲突

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

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

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

springboot项目静态资源映射

1. springboot项目静态资源映射 import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.context.annotation.Bean; import

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…

BS EN 12104-2023 软木地砖检测

软木地砖是指含有烧结成分的软木制成的块状砖&#xff0c;可用于地面覆盖物&#xff0c;装饰层等&#xff0c;具有脚感柔软舒适&#xff0c;防滑性能好&#xff0c;静音等性能&#xff0c;同时也其耐磨性较差&#xff0c;不易清洁。 BS EN 12104-2023软木地砖测试 测试项目 测…

Linux 指令心法(七)`cat` 查看、合并和创建文本文件

文章目录 命令的概述和用途命令的用法命令行选项和参数的详细说明命令的示例命令的注意事项或提示 命令的概述和用途 cat 是 “concatenate” 的缩写&#xff0c;它是一个 Linux 和 Unix 系统中的命令&#xff0c;用于查看、合并和创建文本文件。cat 主要用于以下几个方面&…

MongoDB-索引Index

索引Index 索引-Indexa) 概述b) 索引的类型b.1) 单字段索引b.2) 复合索引b.3) 其他索引 c) 索引的管理操作c.1) 索引的查看c.2) 索引的创建c.3) 索引的移除 d) 索引的使用d.1) 执行计划d.2) 涵盖的查询 索引-Index a) 概述 索引支持在MongoDB中高效地执行查询。如果没有索引&…

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)

如何设计一个安全的对外接口?

转载 https://blog.csdn.net/weixin_46742102/article/details/108831868?spm1001.2101.3001.6650.1&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-108831868-blog-125359890.235%5Ev38%5Epc_relevant_anti_t3_base&depth_1-utm_…

Java中的枚举是什么?

Java枚举详解 枚举&#xff08;Enum&#xff09;是Java编程语言中的一种特殊数据类型&#xff0c;它用于表示一组具名的常量。枚举提供了一种更加类型安全和易于理解的方式来表示常量值&#xff0c;使代码更加清晰和可维护。 为什么需要枚举&#xff1f; 在介绍Java枚举的具…

你知道npm、yarn、pnpm的区别吗?

npm 嵌套的 node_modules 结构 npm 在早期采用的是嵌套的 node_modules 结构&#xff0c;“node_modules” 文件夹通常包含项目依赖的模块。在项目中使用多个依赖并且这些依赖本身也有它们自己的依赖时&#xff0c;就会出现嵌套的 “node_modules” 结构。 嵌套的 “node_mo…

【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. 概念介绍 我们在本章…