【版本控制】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 仓库副本。它用于多个开发人员之间共享和协作代码,并作为代码的中央存储库。远程仓库通常托管在代码托管平台(如 GitHubGitLabGitee 等)或者公司内部的 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)# 上面这串数字是提交对象的哈希值
  1. 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" 分支,但也可以根据项目需求自定义其他名称的分支。分支名称通常用来表示项目的不同功能特性、开发版本或者修复补丁等。

分支在 Git 中扮演了重要的角色,它们提供了一种轻松管理和组织项目开发的方式。通过分支,可以实现以下功能:

1. 并行开发:多个开发人员可以在不同的分支上同时进行工作,而不会相互干扰。

2. 功能开发:每个功能特性可以在独立的分支上进行开发,便于管理和跟踪功能的开发进度。

3. 版本控制:每个版本或发布可以在单独的分支上进行管理,使得可以方便地回溯历史版本或发布新版本。

4. 修复补丁:可以在分支上快速创建和提交修复程序,然后合并到主分支中。

5.实验性开发:可以在单独的分支上进行实验性的开发,不影响主分支或其他稳定分支。

分支的创建、切换、合并和删除等操作都可以通过 Git 提供的命令轻松完成。分支是 Git 版本控制系统中一个非常强大和灵活的特性,它使得团队能够更加高效地进行协作开发,并且更好地管理和组织项目的开发流程。

三、git的基本操作

Git 的基本操作涉及到对仓库的创建、配置、文件的添加、提交、查看状态、查看历史记录等操作。下面是一些常见的 Git 基本操作及其用法:

1. 初始化仓库

  • git init:在当前目录创建一个新的 Git 仓库。
  • git clone <remote-url>:从远程仓库克隆一个新的仓库到本地。

2. 配置用户信息

  • git config --global user.name "Your Name":配置全局用户名。
  • git config --global user.email "your.email@example.com":配置全局用户邮箱。

3. 添加文件

  • git add <file>:将指定文件添加到索引中。
  • git add .:将当前目录下所有文件添加到索引中。

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>:创建一个新的分支。

9.切换分支

  • git checkout <branchname>:切换到指定分支。

10.合并分支
git merge <branchname>:将指定分支合并到当前分支。

11. 远程操作
git remote add origin <remote-url>:添加远程仓库。
git push -u origin master:将本地仓库的更改推送到远程仓库。-u 会将本地分支与远程仓库同名分支关联起来,后续就只用git push了。
git pull origin master:从远程仓库拉取最新更改到本地仓库。如果分支关联起来了也只用git pull

12.文件比较
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 # 推入远端

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

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

相关文章

基于深度学习的海洋鱼类识别算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 ............................................................ % 对测试集进行分类预测 [Pr…

谷歌AI搜索惊现恶意网站推荐!用户安全再遭威胁?

近日&#xff0c;谷歌推出的新搜索生成体验(SGE)功能引发广泛关注。然而&#xff0c;这一旨在提升搜索体验的AI功能却陷入了争议&#xff0c;有报道称其可能在生成的响应中推广欺诈网站和恶意软件&#xff0c;为用户带来安全风险。 AI-321 | 专注于AI工具分享的网站 AI工具集 …

云电脑火爆出圈,如何选择和使用?--腾讯云、ToDesk云电脑、青椒云使用评测和攻略

前言&#xff1a; Hello大家好&#xff0c;我是Dream。在当下&#xff0c;科技的飞速发展已经深入影响着我们的日常生活&#xff0c;特别是随着物联网的兴起和5G网络的普及&#xff0c;云计算作为一个重要的技术概念也逐渐走进了我们的视野。云计算早已不再是一个陌生的名词&am…

ReactNative项目构建分析与思考之RN组件化

传统RN项目对比 ReactNative项目构建分析与思考之react-native-gradle-plugin ReactNative项目构建分析与思考之native_modules.gradle ReactNative项目构建分析与思考之 cli-config 在之前的文章中&#xff0c;已经对RN的默认项目有了一个详细的分析&#xff0c;下面我们来…

ElasticSearch启动报错:Exception in thread “main“ SettingsException

Exception in thread "main" SettingsException[Failed to load settings from [elasticsearch.yml]]; nested: ParsingException[Failed to parse object: expecting token of type [START_OBJECT] but found [VALUE_STRING]]; 这个报错说明elasticsearch.yml这个配…

企业如何进行数字化转型?

企业进行数字化转型是一个系统性工程&#xff0c;涉及战略规划、技术应用、组织变革和人才培养等多个方面。以下是实现企业数字化转型的一些关键步骤和要素&#xff1a; 1.战略规划与目标设定&#xff1a; 明确数字化转型的目标和愿景&#xff0c;确保与企业整体战略相一致。 …

Linux系统编程 - 进程异常自动重启

Linux系统编程 - 进程异常自动重启 文章目录 Linux系统编程 - 进程异常自动重启开篇基础概念守护进程僵死进程(zombie) 设计思路源码实现总结 开篇 在Linux平台&#xff0c;自研服务进程通常以守护进程的形式在后台常驻运行。但偶尔也会遇到服务进程异常crash&#xff0c;导致产…

Linux:rpm部署Jenkins(1)

1.获取Jenkins安装包 我这里使用的是centos7系统&#xff0c;ip为&#xff1a;192.168.6.6 2G运存 连接外网 Jenkins需要java环境&#xff0c;java的jdk包你可以去网上下载离线包&#xff0c;或者直接去yum安装&#xff0c;我这里使用的是yum安装 再去获取Jenkins的rpm包…

每日一题——LeetCode1720.解码异或后的数组

方法一 异或运算的性质 encoded[i−1]arr[i−1]⊕arr[i] 在等式两边同时异或arr[i−1] 由于&#xff1a; 一个数异或它自己&#xff0c;结果总是0。 0异或任何数&#xff0c;结果都是那个数本身。 所以等式可以转化为&#xff1a; arr[i]arr[i−1]⊕encoded[i−1] 由于 a…

量子时代隐患显露!苹果CPU漏洞被爆,Mac用户敏感数据易遭窃取

研究表明&#xff0c;一项使Apple M系列处理器速度更快的功能也使它们容易受到无法修补的新侧信道攻击。理论上&#xff0c;黑客可以提取秘密加密密钥&#xff0c;然后访问敏感数据。 这个新发现的概念验证攻击被称为“GoFetch”。 GoFetch基于一种称为数据内存依赖预取器&…

qrcode插件-生成二维码

安装 yarn add qrcodejs2 --save npm install qrcodejs2 --save 使用 <template><div><div id"qrcodeImg"></div><!-- 创建一个div&#xff0c;并设置id --></div> </template> <script> import QRCode from q…

Sequelize一个易用且基于 promise 的 Node.js ORM 工具

Sequelize中文文档|Sequelize中文网 Sequelize 是一个易用且基于 promise 的 Node.js ORM 工具 适用于 Postgres, MySQL, MariaDB, SQLite, DB2, Microsoft SQL Server, Snowflake, Oracle DB 和 Db2 for IBM i. 它具有强大的事务支持, 关联关系, 预读和延迟加载,读取复制等功…

洛谷刷题 | P1706 全排列问题

全排列问题 题目描述 按照字典序输出自然数 1 1 1 到 n n n 所有不重复的排列&#xff0c;即 n n n 的全排列&#xff0c;要求所产生的任一数字序列中不允许出现重复的数字。 输入格式 一个整数 n n n。 输出格式 由 1 ∼ n 1 \sim n 1∼n 组成的所有不重复的数字序…

Web3创作整理 - 2024-02-23 ~ 2024-03-25

Web3 创作整理 - 2024-02-23 ~ 2024-03-25 整理下3月份的文章&#xff0c;方便大家阅读 分类文章地址&#x1fad1;ETH什么是Dapp&#x1f3bc;ETH什么是以太坊&#x1f3b5;ETH如何才能拥有ETH&#x1f3b6;ETHBTC网络 vs ETH网络&#x1f399;️ETHETH网络中的区块链&#x1…

利用Python和IP技术实现智能旅游情报系统

文章目录 引言一、系统架构设计1. 数据采集模块2. 数据处理模块3. 用户界面模块 二、数据获取技术应用三、系统功能展示四、亮数据采集工具介绍五、总结六、号外 引言 随着旅游行业的不断发展&#xff0c;人们对旅游信息的需求也越来越大。为了帮助旅行者更好地规划行程&#…

Nodejs沙盒逃逸

Buffer 在较早一点的node.js版本中 (8.0 之前)&#xff0c;当 Buffer 的构造函数传入数字时, 会得到与数字长度一致的一个 Buffer&#xff0c;并且这个 Buffer 是未清零的。8.0 之后的版本可以通过另一个函数 Buffer.allocUnsafe(size) 来获得未清空的内存。 注&#xff1a;关…

P1219八皇后 (典DFS)

注意&#xff1a; 数组大小要开够&#xff0c;数据范围是6到13&#xff0c;要开到20&#xff0c;不然开到15数据点没法全部过。 代码&#xff1a; #include<algorithm> #include<iostream> #include<cstring> #include<queue>using namespace std;i…

Rocket mq

搭建服务【有2个】 一个是NameServer还有一个是Broker&#xff0c;要两个服务协同 后台启动服务 允许服务端自己创建topic&#xff0c;如果客户端传来的topic没有的话 然后搞个rocket mq的仪表盘&#xff0c;application.yml改成自己的地址【只需要指定NameServer的地址&#…

更灵活的定位内存地址的方法

文章目录 更灵活的定位内存地址的方法and和or指令关于ASCII码以字符形式给出的数据大小写转换的问题[bxidata]用[bxidata]的方式进行数组的处理SI和DI[bxsi]和[bxdi][bxsiidata]和[bxdiidata]不同的寻址方式的灵活应用题目示例 更灵活的定位内存地址的方法 and和or指令 1&…

Axure RP 8中文---快速原型设计工具,一站式解决方案

Axure RP 8是一款专业的快速原型设计工具&#xff0c;以其直观易用的界面和丰富的功能受到广大用户的青睐。它支持用户通过拖放操作快速创建交互式原型&#xff0c;包括线框图、流程图等&#xff0c;并具备高保真度的设计能力。Axure RP 8还提供了团队协作和共享功能&#xff0…