git分支-基本分支与合并

问题假设

让我们通过一个简单的分支和合并的例子,演示在实际工作中可能会使用的工作流程。将按照以下步骤进行:

  • 在网站上进行一些工作。
  • 为正在开发的新用户故事创建一个分支。
  • 在该分支上进行一些工作。

在这个阶段,我们可能会接到一个电话,说另一个问题非常严重,需要一个热修复。将执行以下操作:

  • 切换到生产分支。
  • 创建一个分支来添加热修复。
  • 在测试通过后,合并热修复分支,并推送到生产环境。
  • 切换回原始的用户分支,并继续工作。

基础分支

首先,假设正在项目上工作,并且在主分支上已经有了几个提交。

要创建一个新的分支并立即切换到它,可以使用git checkout命令并加上-b选项。

$ git checkout -b iss53

Switched to a new branch "iss53"

这条指令相当于

$ git branch iss53

$ git checkout iss53

在网站上进行一些工作并提交了一些更改。这样做会推进iss53分支,因为我们已经检出了它(也就是说,我们的HEAD指向它)。

$ vim index.html

$ git commit -a -m 'Create new footer [issue 53]'

现在我们接到通知说网站出了问题,需要立即修复。使用git,不必将所做的iss53更改与修复一起部署,也不必在开始应用修复到生产环境之前花费大量精力来撤销那些更改。只需切换回主分支。

然而,在这样做之前,请注意,如果工作目录或暂存区有未提交的更改与要检出的分支冲突,Git 将不会让我们切换分支。最好在切换分支时保持干净的工作状态。有办法绕过这个问题(即存储和提交修订),我们后续会介绍。现在,让我们假设已经提交了所有的更改,所以可以切换回到主分支。

$ git checkout master

Switched to branch 'master'

在这一点上,当前项目工作目录恰好与开始处理问题#53之前的状态一样,我们可以专注于我们的热修复。这是一个重要的要点要记住:当切换分支时,git 会将工作目录重置为看起来像最后一次在该分支上提交时的样子。它会自动添加、删除和修改文件,以确保工作副本与分支在你最后一次提交时的样子一样。

接下来,我们有一个热修复要做。让我们创建一个热修复分支,在上面完成工作,直到它完成。

$ git checkout -b hotfix

Switched to a new branch 'hotfix'

$ vim index.html

$ git commit -a -m 'Fix broken email address'

[hotfix 1fb7853] Fix broken email address

 1 file changed, 2 insertions(+)

可以运行测试,确保热修复是我们想要的,最后将热修复分支合并回主分支,以部署到生产环境。可以使用git merge命令来完成这个操作。

$ git checkout master

$ git merge hotfix

Updating f42c576..3a0874c

Fast-forward

 index.html | 2 ++

 1 file changed, 2 insertions(+)

在本次合并中,会注意到“fast-forward”这个短语。这是因为合并进来的分支 hotfix 所指向的提交 C4 直接在当前所在的提交 C2 之前。Git 简单地将指针向前移动。换句话说,当尝试将一个提交与可以通过跟随第一个提交的历史到达的提交合并时,Git 通过向前移动指针来简化操作,因为没有需要合并的不同工作 —— 这被称为“fast-forward”。

我们的更改现在包含在主分支指向的提交快照中,现在我们可以部署这个修复。

在我们的超级重要的修复部署完成后,我们准备回到之前被打断的工作。首先我们最好删除 hotfix 分支,因为不再需要它 —— 主分支指向相同的位置。可以使用 `git branch` 的 `-d` 选项来删除它。

$ git branch -d hotfix

Deleted branch hotfix (3a0874c).

现在可以切换回到正在处理的关于问题 #53 的工作分支,并继续工作。

$ git checkout iss53

Switched to branch "iss53"

$ vim index.html

$ git commit -a -m 'Finish the new footer [issue 53]'

[iss53 ad82d7a] Finish the new footer [issue 53]

1 file changed, 1 insertion(+)

这里值得注意的是,在hotfix 分支中所做的工作并没有包含在你iss53 分支的文件中。如果需要将它拉取进来,可以通过运行 `git merge master` 将你的主分支合并到你的 iss53 分支中,或者可以等待在稍后决定将 iss53 分支合并回主分支时再集成这些更改。

基本合并

假设 #53 的工作已经完成,并准备好合并到主分支中。为了做到这一点,只需切换到想要合并到的分支,然后运行 git merge 命令:

$ git checkout master

Switched to branch 'master'

$ git merge iss53

Merge made by the 'recursive' strategy.

index.html |    1 +

1 file changed, 1 insertion(+)

这看起来与之前执行的 hotfix 合并有些不同。在这种情况下,开发历史与某个较早的点分叉了。因为当前所在的分支上的提交不是要合并的分支的直接祖先,Git 需要做一些工作。在这种情况下,Git 执行一个简单的三路合并,使用两个分支端指向的快照和这两个分支的共同祖先。

与仅仅向前移动分支指针不同,Git 创建了一个新的快照,它是这个三路合并的结果,并自动创建了一个指向它的新提交。这被称为合并提交,它是特殊的,因为它有多个父节点。

现在工作已经合并了,不再需要 iss53 分支。可以在问题跟踪系统中关闭这个问题,并删除这个分支:

$ git branch -d iss53

基本冲突合并

偶尔,这个过程不会顺利进行。如果在要合并的两个分支中的同一个文件的同一部分进行了不同的更改,Git 将无法干净地合并它们。如果对问题 #53 的修复修改了与 hotfix 分支相同的文件的相同部分,将会得到一个类似这样的合并冲突:

$ git merge iss53

Auto-merging index.html

CONFLICT (content): Merge conflict in index.html

Automatic merge failed; fix conflicts and then commit the result.

Git 没有自动创建一个新的合并提交。在解决冲突时暂停了这个过程。如果想在合并冲突后的任何时间点查看哪些文件没有合并,可以运行 `git status`:

$ git status

On branch master

You have unmerged paths.

  (fix conflicts and run "git commit")

Unmerged paths:

  (use "git add <file>..." to mark resolution)

    both modified:      index.html

no changes added to commit (use "git add" and/or "git commit -a")

任何存在合并冲突并且未解决的内容都被列为未合并。git 会向具有冲突的文件添加标准的冲突解决标记,这样就可以手动打开它们并解决这些冲突。冲突文件包含一个类似以下内容的部分:

<<<<<<< HEAD:index.html

<div id="footer">contact : email.support@github.com</div>

=======

<div id="footer">

 please contact us at support@github.com

</div>

>>>>>>> iss53:index.html

这意味着 HEAD 中的版本(master 分支,因为在运行合并命令时已经检出了它)是该块的顶部部分(在 ======= 之上的所有内容),而 iss53 分支中的版本看起来就像是底部部分的所有内容。为了解决冲突,必须选择一边或另一边,或者自己合并内容。例如,可以通过用以下内容替换整个块来解决这个冲突:

<div id="footer">

please contact us at email.support@github.com

</div>

这种解决方案同时包含了每个部分的一部分,而且 <<<<<<<、======= 和 >>>>>>> 这些行已经完全删除。在解决了每个文件中的每个冲突部分之后,对每个文件运行 git add 命令将其标记为已解决。将文件添加到暂存区中会将其标记为 git 中已解决的文件。

如果想使用图形工具来解决这些问题,可以运行 git mergetool 命令,它会启动一个合适的可视化合并工具,并指导我们解决冲突。

$ git mergetool

This message is displayed because 'merge.tool' is not configured.

See 'git mergetool --tool-help' or 'git help config' for more details.

'git mergetool' will now attempt to use one of the following tools:

opendiff kdiff3 tkdiff xxdiff meld tortoisemerge gvimdiff diffuse diffmerge ecmerge p4merge araxis bc3 codecompare vimdiff emerge

Merging:

index.html

Normal merge conflict for 'index.html':

  {local}: modified file

  {remote}: modified file

Hit return to start merge resolution tool (opendiff):

如果想使用除默认工具之外的合并工具(在这种情况下 git 选择了 opendiff,因为该命令在 macOS 上运行),可以在“以下工具之一”后面看到列出的所有支持的工具。只需输入想使用的工具的名称即可。

当退出合并工具后,git 会询问合并是否成功。如果告诉脚本成功了,它会暂存文件以标记为已解决。可以再次运行 git status 来验证所有冲突是否已解决:

$ git status

On branch master

All conflicts fixed but you are still merging.

  (use "git commit" to conclude merge)

Changes to be committed:

modified:   index.html

如果对此满意,并且验证了所有有冲突的内容都已经被暂存,可以输入 git commit 来完成合并提交。默认情况下,提交消息看起来像这样:

Merge branch 'iss53'

Conflicts:

    index.html

#

# It looks like you may be committing a merge.

# If this is not correct, please remove the file

# .git/MERGE_HEAD

# and try again.

# Please enter the commit message for your changes. Lines starting

# with '#' will be ignored, and an empty message aborts the commit.

# On branch master

# All conflicts fixed but you are still merging.

#

# Changes to be committed:

# modified:   index.html

#

如果认为修改这个提交消息,对于未来查看此合并的其他人会很有帮助的话,可以加入有关如何解决合并以及解释为什么做出这些更改的详细信息。

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

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

相关文章

线上研讨会 | 应对汽车毫米波雷达设计中的电磁挑战

智能汽车、新能源汽车最近几年一直是汽车行业关注的热点&#xff0c;随着5G技术越来越普及&#xff0c;汽车智能化发展将越来越迅速。从传统汽车到智能汽车&#xff0c;不是简单功能的增强&#xff0c;而是从单一功能的交通工具变成可移动的办公和娱乐空间&#xff0c;成为物联…

STM32实现软件SPI对W25Q64内存芯片实现读写操作

先看看本次实验的成果吧&#xff1a; 这么简单的一个程序&#xff0c;我学习了一个星期左右&#xff0c;终于把所有的关节都打通了。所有代码都能什么都不看背着敲出来了。为了使自己的记忆更为清晰&#xff0c;特意总结了一个思维导图&#xff0c;感觉自己即便是日后忘记了看一…

机器学习的15个概念

机器学习 有监督学习 有监督学习是利用训练数据集进行预测的机器学习任务。有监督学习可以分为分类和回归。回归用于预测“价格”“温度”或“距离”等连续值&#xff0c;而分类用于预测“是”或“否”、“垃圾邮件”或“非垃圾邮件”、“恶性”或“良性”等类别。 分类包含…

如何保护IP地址?安全匿名上网的方法

当互联网成为每个家庭的重要组成部分后&#xff0c;IP地址就成了你的虚拟地址。您的请求从该地址开始&#xff0c;然后 Internet 将消息发送回该地址。那么&#xff0c;您担心您的地址被泄露吗&#xff1f; 对于安全意识高或者某些业务需求的用户&#xff0c;如果您正在寻找保护…

C++ 静态库与动态库的生成和使用:基于 VS Studio 生成 newmat 矩阵库的静态库与动态库

文章目录 Part.I IntroductionChap.I 预备知识Chap.II 静态库与动态库区分 Part.II 静态库的生成与使用 (newmat)Chap.I 生成静态库Chap.II 使用静态库 Part.III 动态库的生成与使用 (newmat)Chap.I 生成动态库Chap.II 使用动态库 Part.IV 文件内容Chap.I test.cpp (静态库)Cha…

Hadoop Yarn

首先先从Yarn开始讲起&#xff0c;Yarn是Hadoop架构的资源管理器&#xff0c;可以管理mapreduce程序的资源分配和任务调度。 Yarn主要有ResourceManager、NodeManage、ApplicationMaster&#xff0c;Container ResourceMange负责管理全局的资源 NodeManage&#xff08;NM&a…

九河云:在AWS上实现跨region VPC互联

如何跨region实现不同VPC之间的对等链接&#xff1f;九河云为您介绍AWS跨region连接方案。 说明&#xff1a;VPC-A位于弗吉尼亚region&#xff0c;VPC-B位于俄勒冈region 本文将在同一账户的弗吉尼亚和俄勒冈VPC中各启用一台EC2&#xff08;本文已提前创建好VPC、EC2等资源&am…

Spring Boot中前端通过请求接口下载后端存放的Excel模板

导出工具类 package com.yutu.garden.utils;import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import org.apache.commons.io.IOUtils; import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.slf4j.Logger;…

云计算的安全需求

目录 一、概述 二、云安全服务基本能力要求 三、信息安全服务&#xff08;云计算安全类&#xff09;资质要求 3.1 概述 3.2 资质要求内容 3.2.1 组织与管理要求 3.2.2 技术能力要求 四、云安全主要合规要求 4.1 安全管理机构部门的建立 4.2 安全管理规范计划的编制 4…

C++ //练习 11.3 编写你自己的单词计数程序。

C Primer&#xff08;第5版&#xff09; 练习 11.3 练习 11.3 编写你自己的单词计数程序。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /*************************************************************************> …

2024最新AI创作系统ChatGPT源码+Ai绘画网站源码,GPTs应用、AI换脸、插件系统、GPT文档分析、GPT语音对话一站式解决方案

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持GPT…

记 log4j-over-slf4j.jar AND bound slf4j-log4j12.jar jar包冲突问题

报错信息如下 SLF4J: Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the class path, preempting StackOverflowError. SLF4J: See also http://www.slf4j.org/codes.html#log4jDelegationLoop for more details. Exception in thread “main” java.lan…

NineData云原生智能数据管理平台新功能发布|2024年3月版

数据库 DevOps - 大功能升级 SQL 开发早期主要提供 SQL 窗口&#xff08;IDE&#xff09;功能&#xff0c;在产品经过将近两年时间的打磨&#xff0c;新增了大量的企业级功能&#xff0c;已经服务了上万开发者&#xff0c;覆盖了数据库设计、开发、测试、变更等生命周期的功能…

神经网络与深度学习(二)

一、深度学习平台 张量&#xff08;Tensor&#xff09; 是一个物理量&#xff0c;对高维(维数 ≥ 2) 的物理量进行“量纲分析” 的一种工具。简单的可以理解为&#xff1a;一维数组称为矢量&#xff0c;二维数组为二阶张量&#xff0c;三维数组为三阶张量 计算图 用“结点”…

调用飞书获取用户Id接口成功,但是没有返回相应数据

原因&#xff1a; 该自建应用没有开放相应的数据权限。 解决办法&#xff1a; 在此处配置即可。

DETR【Transformer+目标检测】

End-to-End Object Detection with Transformers 2024 NVIDIA GTC&#xff0c;发布了地表最强的GPU B200&#xff0c;同时&#xff0c;黄仁勋对谈《Attention is All You Need》论文其中的7位作者&#xff0c;座谈的目的无非就是诉说&#xff0c;Transformer才是今天人工智能成…

【环境变量】命令行参数 | 概念 | 理解 | 命令行参数表 | bash进程

目录 四组概念 命令行参数概念&理解 查看命令函参数 命令行字符串&命令行参数表 命令行参数存在的意义 谁形成的命令行参数 父进程&子进程&数据段 bash进程 最近有点小忙&#xff0c;可能更新比较慢。 四组概念 竞争性: 系统进程数目众多&#xff0c…

构建企业级微服务平台:实现可扩展性、弹性和高效性

在软件开发的快速发展领域中&#xff0c;企业不断努力构建健壮、可扩展和高效的系统。随着微服务架构的出现&#xff0c;再加上云原生技术的应用&#xff0c;创建敏捷且具有弹性的平台的可能性是无限的。在本指南中&#xff0c;我们将深入探讨使用强大的工具和技术组合&#xf…

Python基于深度学习的人脸识别项目源码+演示视频,利用OpenCV进行人脸检测与识别 preview

​ 一、原理介绍 该人脸识别实例是一个基于深度学习和计算机视觉技术的应用&#xff0c;主要利用OpenCV和Python作为开发工具。系统采用了一系列算法和技术&#xff0c;其中包括以下几个关键步骤&#xff1a; 图像预处理&#xff1a;首先&#xff0c;对输入图像进行预处理&am…

.Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置

.Net Core/.Net6/.Net8 &#xff0c;启动配置/Program.cs 配置 没有废话&#xff0c;直接上代码调用 没有废话&#xff0c;直接上代码 /// <summary>/// 启动类/// </summary>public static class Mains{static IServiceCollection _services;static IMvcBuilder _…