git分支-基本分支与合并

news2024/11/16 23:54:30

问题假设

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

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

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

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

基础分支

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

要创建一个新的分支并立即切换到它,可以使用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.coloradmin.cn/o/1567991.html

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

相关文章

LC 144.二叉树的前序遍历

二叉树的前序遍历 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a; root [1,null,2,3] 输出&#xff1a;[1,2,3] 示例 2&#xff1a; 输入&#xff1a; root [] 输出&#xff1a;[] 示例 3&#xff1a; 输入&…

2024年 CS2最佳游戏启动项

引言&#xff1a; Counter-Strike 2&#xff08;CS 2&#xff09;是一款备受瞩目的游戏&#xff0c;而启动选项则是影响游戏性能和体验的关键因素之一。然而&#xff0c;有关所有选项都应该强制使用的说法并不正确。事实上&#xff0c;大多数选项可能对某些计算机并不适用&…

go 指针和内存分配

定义 了解指针之前&#xff0c;先讲一下什么是变量。 每当我们编写任何程序时&#xff0c;我们都需要在内存中存储一些数据/信息。数据存储在特定地址的存储器中。内存地址看起来像0xAFFFF&#xff08;这是内存地址的十六进制表示&#xff09;。 现在&#xff0c;要访问数据…

讲讲你对数据结构-线性表了解多少?

线性表 - 数组和矩阵 当谈到线性表时&#xff0c;数组和矩阵是两种常见的数据结构。 数组&#xff08;Array&#xff09;&#xff1a; 数组是有序的元素集合&#xff0c;可以通过索引来访问和操作其中的元素。它是最简单、最基本的数据结构之一。数组的特点包括&#xff1a; …

ctf_show笔记篇(web入门---SSRF)

ssrf简介 ssrf产生原理&#xff1a; 服务端存在网络请求功能/函数&#xff0c;例如&#xff1a;file_get_contens()这一类类似于curl这种函数传入的参数用户是可控的没有对用户输入做过滤导致的ssrf漏洞 ssrf利用: 用于探测内网服务以及端口探针存活主机以及开放服务探针是否存…

计算机网络:局域网的数据链路层

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

【2024红明谷】三道Web题目的记录

红明谷 文章目录 红明谷Web1 | SOLVED LaterWeb2 | UNSOLVEDWeb3 | SOLVED 容器已经关咯&#xff0c;所以有些场景只能靠回忆描述啦&#xff0c;学习为主&#xff0c;题目只是一个载体~ 本次比赛学习为主&#xff0c;确实再一次感受到久违的web题目的魅力了&#xff0c;可能也是…

C++实现二叉搜索树的增删查改(非递归玩法)

文章目录 一、二叉搜索树的概念结构和时间复杂度二、二叉搜索树的插入三、二叉搜索树的查找四、二叉搜索树的删除&#xff08;最麻烦&#xff0c;情况最多&#xff0c;一一分析&#xff09;3.1首先我们按照一般情况下写&#xff0c;不考虑特殊情况下4.1.1左为空的情况&#xff…

小波降噪基础-python版本

这篇小文将使用小波多分辨分析对一个简单信号进行降噪&#xff0c;主要是降噪流程&#xff0c;为以后的小波更复杂的降噪算法打下良好的基础。降噪算法流程大致如下&#xff1a; &#xff08;1&#xff09;去趋势项&#xff08;如直流电流&#xff09;&#xff0c;并将数据归一…

词向量模型评估

一、既有范式 词向量的语言学特性&#xff1a;这部分主要通过一些具体的指标来评估词向量是否能捕捉到语言的内在规律&#xff0c;包括&#xff1a; 相似度评价指标&#xff1a;检查词向量空间中距离近的词是否与人类直觉一致&#xff0c;例如&#xff0c;利用余弦相似度来评估…

【嵌入式智能产品开发实战】(十三)—— 政安晨:通过ARM-Linux掌握基本技能【运行环境】

目录 简述 开始 操作系统环境下的程序运行 裸机环境下的程序运行 程序入口main()函数分析 BSS段的小提示 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 嵌入式智能产品开发实战 希望政安晨的博客能够对您有所裨益&#xff0c;如有不…

基于Java的高校成绩报送系统的设计与实现

基于Java的高校成绩报送系统的设计与实现 获取源码——》哔站搜&#xff1a;计算机专业毕设大全 获取源码——》哔站搜&#xff1a;计算机专业毕设大全

计算机基础入门7:大学计算机基础

第1章 计算机的基本概念 1.1 计算机概述 1、 电子计算机{电子模拟计算机&#xff0c;电子数字计算机} 2、 计算机之父——冯诺依曼(J. Von Neumann)&#xff0c;奠定现代计算机的体系结构。 3、 冯诺依曼在EDVAC设计方案中提出了“存储程序”原理 4、 计算机的三个特征&…

【Spring】SpringBoot整合Redis,用Redis实现限流(附Redis解压包)

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 本文介绍SpringBoot整合Redis并且进行接口的限流&#xff0c;文章主要介绍的是一种思想&#xff0c;具体代码还要结合实际。 一、Windows安装Redis Redis的解压包我放在了百度网盘上&#xff0c;有需要的可以下载。 R…

java自动化测试-03-05java基础之字符串

1、字符串的定义 String是变量类型&#xff0c;表示字符串类型 name是给这个变量起的名字&#xff0c;这个是可以随意取的&#xff0c;只要不是java的关键字就可以了 表示赋值&#xff0c;右边的的内容表示 变量值&#xff0c;对字符串变量进行 赋值&#xff0c;需要用双引号…

C++模板实参推断

模板实参推断 我们已经看到&#xff0c;对于函数模板&#xff0c;编译器利用调用中的函数实参来确定其模板参数。 从函数实参来确定模板实参的过程被称为模板实参推断。 也就是说&#xff0c;只有函数参数才配有模板实参推断&#xff0c;函数返回类型是不配有的 在模板实参…

每日面经分享(python part1)

Python中的深拷贝和浅拷贝的区别是什么&#xff1f; a. 浅拷贝创建一个新的对象&#xff0c;但其中的可变元素仍然共享引用。只有对象的第一层被复制&#xff0c;而更深层次的嵌套对象仍然是引用。更改其中一个对象的属性会影响到其他对象。 b. 深拷贝创建一个完全独立的新对象…

营销中的归因人工智能

Attribution AI in marketing 归因人工智能作为智能服务的一部分&#xff0c;是一种多渠道算法归因服务&#xff0c;根据特定结果计算客户互动的影响和增量影响。有了归因人工智能&#xff0c;营销人员可以通过了解每个客户互动对客户旅程每个阶段的影响来衡量和优化营销和广告…

MT3017 上色

思路&#xff1a;使用分治&#xff0c;在每个连续区域递归调用heng()和shu() #include <bits/stdc.h> using namespace std; int n, m; int h[5005];int shu(int l, int r) {return r - l 1; } int heng(int l, int r) {int hmin 0x3f3f3f3f;for (int i l; i < r;…

银行数字化转型导师坚鹏:银行数字化转型给总行带来的9大价值

银行数字化转型给总行带来的9大价值 银行数字化转型对总行的深远影响是多方面的&#xff0c;银行数字化转型导师坚鹏从以下9个方面进行详细分析&#xff0c;相信能够给您带来重要价值。 1. 客户价值 银行数字化转型可以利用大数据、智能化风控模型为客户设计、提供“千人千面…