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

#

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

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

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

相关文章

原型链污染攻击也称JavaScript Prototype 污染攻击

JavaScript数据类型 let和var关键字的区别 使用var或let关键字可以定义变量 let和var的区别如下&#xff1a; var是全局作用域&#xff0c;let 只在当前代码块内有效 当在代码块外访问let声明的变量时会报错 var有变量提升&#xff0c;let没有变量提升 let必须先声明…

U-net在乳腺癌医学图像分割方面的应用

图像几何变换和生成对抗网络 通过旋转、反转、剪切图像对乳腺医学图像进行数据增强之后&#xff0c;可以提高模型的准确性。但是当前简单的分割和几何变换在医疗图像数据中不会简单使用&#xff0c;而是会集合生成对抗网络&#xff08;GAN&#xff09;结合使用。使用生成对抗网…

zookeeper监听集群节点的实现zkclient组件实现方案(Java版)

ZooKeeper Watcher 机制 client 向zookeeper 注册监听client注册的同时会存储一个WatchManager对象向zookeeper发生改变则notification client 并发送一个WatchManager对象,然后client再更新该对象 package com.jacky.zk.demo;import org.I0Itec.zkclient.IZkChildListener;…

https访问http的minio 图片展示不出来

问题描述&#xff1a;请求到的图片地址单独访问能显示&#xff0c;但是在网页中展示不出来 原因&#xff1a;https中直接访问http是不行的&#xff0c;需要用nginx再转发一下 nginx配置如下&#xff08;注意&#xff1a;9000是minio默认端口&#xff0c;已经占用&#xff0c;…

基于Spring Boot的餐厅点餐系统

基于Spring Boot的餐厅点餐系统 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.3.9 部分系统展示 管理员登录界面 用户注册登录界面 …

MySQL-视图:视图概述、创建、查看、更新、修改、删除

第14章 视图 1. 常见的数据库对象2. 视图概述2.1 为什么使用视图&#xff1f;2.2 视图的理解 3. 创建视图3.1 创建单表视图3.2 创建多表联合视图3.3 基于视图创建视图 4. 查看视图5. 更新视图的数据5.1 一般情况5.2 不可更新的视图 6. 修改、删除视图6.1 修改视图6.2 删除视图 …

uniapp微信小程序真机图片不显示

不同设备可能出现部分设备显示不了图片&#xff0c;解决办法&#xff1a;图片地址直接使用&#xff0c;不要拼接&#xff1a; https://images.weserv.nl/?urlhttp

hive 慢sql 查询

hive 慢sql 查询 查找 hive 执行日志存储路径&#xff08;一般是 hive-audit.log &#xff09; 比如&#xff1a;/var/log/Bigdata/audit/hive/hiveserver/hive-audit.log 解析日志 获取 执行时间 执行 OperationId 执行人 UserNameroot 执行sql 数据分隔符为 \001 并写入 hiv…

【Java】:继承

目录 1.为什么需要继承 2.继承的概念 3.继承的语法 4.父类成员访问 4.1子类和父类不存在同名成员变量 1.子类和父类不存在同名成员变量 2.子类和父类成员变量同名 4.2子类中访问父类的成员方法 1.成员方法名字不同 2.成员方法名字相同 5.super关键字 6.子类构造方法 …

使用Flutter创建带有图标提示的TextField

在移动应用开发中&#xff0c;TextField是一种常用的用户输入小部件。然而&#xff0c;有时向用户提供有关他们应该输入什么的提示或说明是很有帮助的。在本教程中&#xff0c;我们将创建一个Flutter应用程序&#xff0c;演示如何在TextField旁边包含一个图标提示。 编写代码 …

WPS二次开发系列:如何获取应用签名SHA256值

在申请WPS SDK授权版时候需要开发者提供应用包名和签名&#xff0c;应用包名好说&#xff0c;那如何生成符合WPS要求的应用签名&#xff08;SHA256)呢&#xff0c;经笔者亲测&#xff0c;有如下两种方式可以实现获取第三方应用签名值&#xff08;SHA256&#xff09; 1. 方法一&…

Day43 动态规划 part05

Day43 动态规划 part05 1049.最后一块石头的重量II 我的思路: 提示说和划分两个和相等的子集差不多&#xff0c;猛然想到&#xff0c;这道题不就是划分子集&#xff0c;用sum - 和最大*2 代码就是划分和相同的子集的变形 解答&#xff1a; class Solution {public int last…

一站式指南:Flutter应用如何顺利登陆苹果App Store

引言 &#x1f680; Flutter作为一种跨平台的移动应用程序开发框架&#xff0c;为开发者提供了便利&#xff0c;使他们能够通过单一的代码库构建出高性能、高保真度的应用程序&#xff0c;同时支持Android和iOS两个平台。然而&#xff0c;完成Flutter应用程序的开发只是第一步…

Spring Boot 学习(1)——环境搭建

一只老辣鸟的自我救赎 不科普&#xff0c;简单记录学习过程。 开发环境约束&#xff1a; jdk1.8 Spring Boot 1.5.9 Spring 4.3.13 Maven 3.3.3 Intellij IDEA 2017 【脑瓜灵光的开发环境随意&#xff0c;不灵光尽量按上述约束设置。看了好些教程总…

商务电子邮件: 在WorkPlace中高效且安全

高效和安全的沟通是任何组织成功的核心。在我们关于电子邮件类型的系列文章的第二期中&#xff0c;我们将重点关注商业电子邮件在促进无缝交互中的关键作用。当你身处重要的工作场环境时&#xff0c;本系列的每篇文章都提供了电子邮件的不同维度的视角。 “2024年&#xff0c;全…

从开放GPT3.5看大模型发展

当地时间周一(4月1日)&#xff0c;人工智能(AI)公司OpenAI宣布&#xff0c;将允许用户直接使用ChatGPT&#xff0c;而无需注册该项服务&#xff0c;这将让人们更加容易体验人工智能的潜力。 图片来源&#xff1a;OpenAI官网截图 OpenAI表示&#xff0c;它将从周一开始逐步推出…

tomcat-连接器架构设计

一、NioEndpoint组件 Tomcat的NioEndPoint组件实现了I/O多路复用模型&#xff0c;接下来我会介绍NioEndpoint的实现原理。 1.总体工作流程 我们知道&#xff0c;对于Java的多路复用器的使用&#xff0c;无非是两步&#xff1a; 1.创建一个Seletor&#xff0c;在它身上注册各…

asf是什么格式的文件?用手机怎么打开?

由于手机操作系统和硬件的限制&#xff0c;大部分手机并不直接支持asf文件的播放。因此&#xff0c;如果你想在手机上打开asf文件&#xff0c;你可能需要先将文件转换为手机支持的格式&#xff0c;如MP4。可以通过使用一些视频转换软件来实现&#xff0c;比如野葱视频转换器。 …

docker容器技术篇:Docker API配置与常用操作

docker容器技术篇&#xff1a;Docker API配置与使用 一、API具体是什么&#xff1f; 百科解释应用程序接口&#xff08;API&#xff09;&#xff0c;又称为应用编程接口&#xff0c;就是软件系统不同组成部分衔接的约定&#xff0c;蒙了吧&#xff01;&#xff01;&#xff0…

docker部署nacos,单例模式(standalone),使用mysql数据库

文章目录 前言安装创建文件夹"假装"安装一下nacos拷贝文件夹删除“假装”安装的nacos容器生成nacos所需的mysql表获取mysql-schema.sql文件创建一个mysql的schema 重新生成新的nacos容器 制作docker-compose.yaml文件查看网站 前言 此处有本人写得简易版本安装&…