git分支 - 分支简介

分支

几乎每个版本控制系统都有某种形式的分支支持。分支意味着偏离了主开发线,并继续进行工作,而不会影响到主开发线。在许多版本控制系统工具中,这是一个比较昂贵的过程,通常需要创建源代码目录的一个新副本,对于大型项目来说可能需要很长时间。

一些人将git的分支模型称为其“杀手级特性”,它确实使git在版本控制系统社区中脱颖而出。为什么它如此特别呢?git分支的方式非常轻量级,使分支操作几乎瞬间完成,并且在分支之间来回切换通常也同样快速。与许多其他版本控制系统不同,git鼓励频繁地进行分支和合并工作流程。

分支简介

为了真正理解git如何进行分支,我们需要退一步看git如何存储其数据。

git不是将数据存储为一系列的变更集或差异,而是存储为一系列的快照。

当提交(commit)时,git会存储一个包含指向暂存内容快照的指针的提交对象。该对象还包含作者的姓名和电子邮件地址、键入的消息,以及指向直接在此提交之前出现的提交或提交的指针(其父提交或父提交):初始提交没有父提交,普通提交有一个父提交,合并两个或多个分支结果的提交有多个父提交。

为了形象化地描述这一点,我们直接应用git book上面的描述示例:

假设有一个包含三个文件的目录,将它们全部暂存并提交。暂存文件会为每个文件计算一个校验和(SHA-1哈希),将该文件的版本存储在git存储库中(git将它们称为blob),并将该校验和添加到暂存区:

$ git add README test.rb LICENSE

$ git commit -m 'Initial commit'

当运行 `git commit` 创建提交时,git 对每个子目录(在这种情况下,只是根项目目录)进行校验和,并将它们存储为树对象(tree object)在git存储库中。然后,git 创建一个提交对象(commit object),其中包含元数据和指向根项目树的指针,以便在需要时重新创建该快照。

git存储库现在包含五个对象:三个blob(每个表示三个文件中的一个的内容),一个树对象(tree),列出目录的内容并指定哪些文件名存储为哪些blob,并且一个提交(commit)包含指向根树的指针和所有提交元数据。

如果进行了一些更改并再次提交,下一个提交会存储一个指向其之前的提交的指针。

在git中,分支(branch)只是一个轻量级的可移动指针,指向这些提交中的一个。git中的默认分支名称是 master。当开始进行提交时,会得到一个指向最后一次提交的 master 分支。每次提交时,master 分支指针会自动向前移动。

创建新的分支

当创建一个新的分支时会发生什么呢?这样做会创建一个新的指针以便移动它。假设想创建一个名为 testing 的新分支。可以使用 git branch 命令来实现这一点。

$ git branch testing

这会创建一个指向当前所在的相同提交的新指针。

git是如何知道当前在哪个分支呢?它会保持一个称为 HEAD 的特殊指针。请注意,这与其他版本控制系统(如Subversion或CVS)中 HEAD 的概念大不相同。在git中,这是指向当前所在的本地分支的指针。在这种情况下,仍然处于 master 分支上。git branch 命令只是创建了一个新分支 - 它没有切换到该分支。

可以通过运行一个简单的 git log 命令来轻松查看这一点,该命令会显示分支指针指向的位置。这个选项被称为 --decorate。

$ git log --oneline --decorate

f30ab (HEAD -> master, testing) Add feature #32 - ability to add new formats to the central interface

34ac2 Fix bug #1328 - stack overflow under certain conditions

98ca9 Initial commit

可以看到master与testing都指向提交f30ab。

切换分支

应用git checkout切换到目标分支

$ git checkout testing

这有什么重要意义呢?让我们基于testing分支做一个提交来看:

$ vim test.rb

$ git commit -a -m 'Make a change'

这很有趣,因为现在testing 分支已经前进了,但是master 分支仍然指向运行 git checkout 切换分支时所在的提交,再让我们切换回 master 分支。

$ git checkout master

git log 并不总是显示所有的分支。

如果现在运行 git log,可能会想知道刚刚创建的 "testing" 分支去哪了,因为它不会出现在输出中。

NOTE:该分支并没有消失;git 只是不知道我们当前对该分支感兴趣,它试图向我们展示它认为我们感兴趣的内容。换句话说,默认情况下,git log 只会显示已经检出的分支下面的提交历史。

要显示所需分支的提交历史,必须明确指定它:git log testing。要显示所有分支,请在 git log 命令中添加 --all。

这个命令做了两件事情。它将 HEAD 指针移回指向 master 分支,并将工作目录中的文件恢复到 master 分支指向的快照。这也意味着从这一点开始所做的更改将与项目的旧版本分离。它实际上是将在 testing 分支中所做的工作回退,以便可以选择不同的方向。

需要注意的是,当在Git中切换分支时,工作目录中的文件会发生变化。如果切换到一个较旧的分支,工作目录将被恢复为看起来像在该分支上最后一次提交时的样子。如果Git无法干净地执行此操作,它将根本不允许进行切换。

现在让我们做一个新的更改并提交

$ vim test.rb

$ git commit -a -m 'Make other changes'

现在,项目历史已经分叉(请参阅分叉历史)。创建并切换到一个分支,在其中进行了一些工作,然后切换回主分支并进行了其他工作。这两个更改都在不同的分支中进行了隔离:当准备好时,可以在分支之间来回切换并将它们合并在一起。而所做的一切都是通过简单的分支、检出和提交命令完成的。

也可以通过 git log 命令轻松地查看这一点。如果运行 git log --oneline --decorate --graph --all,它将打印出提交历史,显示分支指针位置以及历史是如何分叉的。

$ git log --oneline --decorate --graph --all

* c2b9e (HEAD, master) Make other changes

| * 87ab2 (testing) Make a change

|/

* f30ab Add feature #32 - ability to add new formats to the central interface

* 34ac2 Fix bug #1328 - stack overflow under certain conditions

* 98ca9 Initial commit of my project

因为在 Git 中,一个分支实际上是一个简单的文件,它包含指向的提交的 40 个字符的 SHA-1 校验和,所以创建和销毁分支都是很廉价的。创建一个新分支就像向一个文件中写入 41 个字节一样快速和简单(40 个字符和一个换行符)。

这与大多数旧的版本控制系统工具创建分支的方式形成鲜明对比,这种方式涉及将所有项目文件复制到第二个目录中。这可能需要几秒甚至几分钟,具体取决于项目的大小,而在 git 中,这个过程总是瞬间完成。另外,因为我们在提交时记录了父提交,所以为了合并找到一个合适的合并基础是自动完成的,通常非常容易完成。这些功能有助于鼓励开发人员经常创建和使用分支。

让我们看看为什么应该这样做。

NOTE1:

创建一个新分支并立即切换到它是很常见的操作 - 这可以通过一个操作完成,即 git checkout -b <新分支名称>。

NOTE2:

从git版本2.23开始,可以使用git switch而不是git checkout来:

切换到一个已存在的分支:git switch testing-branch。

创建一个新的分支并切换到它:git switch -c new-branch。-c 标志代表创建,你也可以使用完整的标志:--create。

返回到之前检出的分支:git switch -

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第7章 数据安全

思维导图 7.1 引言 数据安全包括安全策略和过程的规划、建立与执行&#xff0c;为数据和信息资产提供正确的身份验证、授权、访问和审计。虽然数据安全的详细情况(如哪些数据需要保护)因行业和国家有所不同&#xff0c;但是数据安全实践的目标是相同的&#xff0c;即根据隐私和…

链表之双向链表的实现

铁汁们大家好&#xff0c;我们上一篇博客学习了单链表&#xff0c;这节课让我们继续往深学习&#xff0c;学习一下双线链表&#xff0c;话不多说&#xff0c;我们开始吧&#xff01; 目录 1.双向链表 2.顺序表和链表的优缺点 3.双向链表的实现 1.双向链表 1.我们要实现的双线…

Elasticsearch快速上手

基本概念 索引&#xff08;Index&#xff09; 索引是文档的容器&#xff0c;就像关系数据库中&#xff0c;要存储行记录必须先创建数据库和表一样。 类型&#xff08;Type&#xff09; ES6 及之前的版本还存在”类型“的概念&#xff0c;一个索引下可以存储多个类型的文档&am…

探索数据结构:特殊的双向队列

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 双向队列的定义 **双向队列(double‑ended queue)**是一种特殊的队列…

Ant Design Pro | 前端项目初始化

初始化项目 环境确认 这里使用的版本如下&#xff1a; 新建文件夹&#xff08;fapi&#xff09; 执行项目初始化命令 cmd进入命令行执行项目初始化命令&#xff0c;参考官网https://pro.ant.design/zh-CN/ # 使用 npm npm i ant-design/pro-cli -g # fapi-frontend是项目…

树莓派固件烧录教程(2024)

一、烧录工具准备 硬件准备&#xff1a; 16G及以上TF卡和读卡器&#xff0c;TF卡建议高速卡&#xff08;卡的读写速度直接影响树莓派的运行速度&#xff09;。 软件准备&#xff1a;&#xff08;下面二方法选其一即可&#xff09; 方法1&#xff1a;raspberry官方烧录工具R…

【高校科研前沿】中国科学院南京地理与湖泊研究所肖启涛博士为一作在Sci. Bull发文:我国湖泊二氧化碳从大气的源向汇转变

目录 1.文章简介 2.研究内容 3.文章引用 1.文章简介 论文名称&#xff1a;Lakes shifted from a carbon dioxide source to a sink over past two decades in China 第一作者及通讯作者&#xff1a;肖启涛&#xff08;博士生&#xff09;&#xff0c;段洪涛&#xff08;研究…

JavaSE继承和多态(下)

在了解多态之前我们先弄清以下三个概念&#xff1a; 方法的重写向上转型和向下转型动态绑定和静态绑定 一.方法的重写 重写(override)&#xff1a;也称为覆盖。重写是子类对父类非静态、非private修饰&#xff0c;非final修饰&#xff0c;非构造方法等的实现过程 进行重新编写,…

如何使用 langchain 与 openAI 连接

上一篇写了如何安装 langchain https://www.cnblogs.com/hailexuexi/p/18087602 这里主要说一个 langchain的使用 创建一个目录 langchain &#xff0c;在这个目录下创建两个文件 main.py 这段python代码&#xff0c;用到了openAI&#xff0c;需要openAI及FQ。这里只做…

c++的学习之路:16、string(3)

上章有一些东西当时没学到&#xff0c;这里学到了将在补充&#xff0c;文章末附上代码&#xff0c;思维导图。 目录 一、赋值重载 二、带模板的创建 三、析构函数 四、代码 五、思维导图 一、赋值重载 这里的赋值重载就是直接利用交换函数进行把传参生成的临时数据和需要…

IDEA中的Debug功能介绍

说明&#xff1a;本文介绍IDEA中的Debug功能&#xff0c;基于2023.2&#xff08;Ultimate Edition&#xff09;版本 简单介绍 首先&#xff0c;在程序需要停止的所在行号上&#xff0c;鼠标左键&#xff0c;可设置一个断点&#xff0c;是一个红色圆点标志&#xff0c;表示程序…

2023年下半年中级软件设计师上午真题及答案解析

01 02 03 04 05 06 07 08 09 10 篇幅有限&#xff0c;私我获取免费完整 pdf文件

php反序列化题目

[NewStarCTF 公开赛赛道]UnserializeOne 分析代码&#xff0c;最终需要调用到 file_get_contents 即可获得flag 从后往前分析 触发 __invoke 需要 以调用函数的方式调用一个对象 可以找到Start类 里的__isset中可以将类当作函数调用 所以需要调用到 __isset 就需要 isset()…

Steam上线真人乙游,女性玩家还愿意买单吗?

Steam上线了一款真人乙游《糟糕&#xff01;他们太爱我了怎么办&#xff1f;》&#xff08;以下简称《糟糕&#xff01;&#xff09;。 乍一听这个游戏名&#xff0c;似乎和《完蛋&#xff01;我被美女包围了&#xff01;》有异曲同工之妙&#xff0c;事实也确实如此&#xff…

实现通讯录(顺序表版本)

一、功能要求 &#xff08;1&#xff09;⾄少能够存储100个⼈的通讯信息 &#xff08;2&#xff09;能够保存⽤⼾信息&#xff1a;名字、性别、年龄、电话、地址等 &#xff08;3&#xff09;增加联系⼈信息 &#xff08;4&#xff09;删除指定联系⼈ &#xff08;5&#…

国内:深圳交通流量数据集

数据来源&#xff1a;深圳政府数据开放平台&#xff08;深圳市政府数据开放平台&#xff09;&#xff0c;这个官网上还有其他类数据集&#xff0c;值得收藏&#xff01;&#xff01;&#xff01; 数据集介绍&#xff1a;宝安区-G4高速西乡大道入口车流量统计 第一行每列的标题…

什么是超导悬浮?工作原理是什么?

某些材料在冷却到某个温度&#xff08;也称为“临界温度”&#xff09;以下时会完全失去电阻。 1910 年&#xff0c;一位名叫 Heike Kamerlingh Onnes 的荷兰物理学家发现了这一现象。他注意到低于一定温度时电阻突然下降&#xff0c;然后他大胆地声称发现了一种新的物质状态&a…

字符串处理

读取 先定义&#xff1a; char ch[100];string s; cin>>s或cin>>ch以空格或换行符结束gets(ch);//gets只能读字符数组&#xff0c;不能直接读字符串stringgets和getline会把第一次出现的换行符及先前的字符串读进去&#xff08;包括空格&#xff09;&#xff0…

利用Flutter框架实现iOS应用的跨平台发布策略

本文探讨了使用Flutter开发的iOS应用能否上架&#xff0c;以及上架的具体流程。苹果提供了App Store作为正式上架渠道&#xff0c;同时也有TestFlight供开发者进行内测。合规并通过审核后&#xff0c;Flutter应用可以顺利上架。但上架过程可能存在一些挑战&#xff0c;因此可能…

【Linux】正则表达式实验操作实例

正则表达式是一种强大的工具&#xff0c;用于在文本中查找、匹配和替换特定的字符串模式。 实验目的 掌握正则表达式的表达方式掌握grep/egrep命令的用法掌握sed 命令的用法掌握awk命令的用法 正则表达式 实验目的实验内容实验过程创建grep文件来进行如下操作用sed命令完成下列…