Git 分支 - 分支的新建与合并 分支的新建与合并 让我们来看一个简单的分支新建与分支合并的例子,实际工作中你可能会用到类似的工作流。 你将经历如下步骤: 开发某个网站。 为实现某个新的需求,创

news/2024/5/13 20:35:01/文章来源:https://blog.csdn.net/P397226804/article/details/73136696

Git 分支 - 分支的新建与合并

分支的新建与合并

让我们来看一个简单的分支新建与分支合并的例子,实际工作中你可能会用到类似的工作流。 你将经历如下步骤:

  1. 开发某个网站。

  2. 为实现某个新的需求,创建一个分支。

  3. 在这个分支上开展工作。

正在此时,你突然接到一个电话说有个很严重的问题需要紧急修补。 你将按照如下方式来处理:

  1. 切换到你的线上分支(production branch)。

  2. 为这个紧急任务新建一个分支,并在其中修复它。

  3. 在测试通过之后,切换回线上分支,然后合并这个修补分支,最后将改动推送到线上分支。

  4. 切换回你最初工作的分支上,继续工作。

新建分支

首先,我们假设你正在你的项目上工作,并且已经有一些提交。

一个简单的提交历史。
Figure 18. 一个简单提交历史

现在,你已经决定要解决你的公司使用的问题追踪系统中的 #53 问题。 想要新建一个分支并同时切换到那个分支上,你可以运行一个带有 -b 参数的 git checkout 命令:

$ git checkout -b iss53
Switched to a new branch "iss53"

它是下面两条命令的简写:

$ git branch iss53
$ git checkout iss53
创建一个新分支指针。
Figure 19. 创建一个新分支指针

你继续在 #53 问题上工作,并且做了一些提交。 在此过程中,iss53 分支在不断的向前推进,因为你已经检出到该分支(也就是说,你的 HEAD 指针指向了 iss53 分支)

$ vim index.html
$ git commit -a -m 'added a new footer [issue 53]'
iss53 分支随着工作的进展向前推进。
Figure 20. iss53 分支随着工作的进展向前推进

现在你接到那个电话,有个紧急问题等待你来解决。 有了 Git 的帮助,你不必把这个紧急问题和 iss53 的修改混在一起,你也不需要花大力气来还原关于 53# 问题的修改,然后再添加关于这个紧急问题的修改,最后将这个修改提交到线上分支。 你所要做的仅仅是切换回 master 分支。

但是,在你这么做之前,要留意你的工作目录和暂存区里那些还没有被提交的修改,它可能会和你即将检出的分支产生冲突从而阻止 Git 切换到该分支。 最好的方法是,在你切换分支之前,保持好一个干净的状态。 有一些方法可以绕过这个问题(即,保存进度(stashing) 和 修补提交(commit amending)),我们会在 储藏与清理 中看到关于这两个命令的介绍。 现在,我们假设你已经把你的修改全部提交了,这时你可以切换回 master 分支了:

$ git checkout master
Switched to branch 'master'

这个时候,你的工作目录和你在开始 #53 问题之前一模一样,现在你可以专心修复紧急问题了。 请牢记:当你切换分支的时候,Git 会重置你的工作目录,使其看起来像回到了你在那个分支上最后一次提交的样子。 Git 会自动添加、删除、修改文件以确保此时你的工作目录和这个分支最后一次提交时的样子一模一样。

接下来,你要修复这个紧急问题。 让我们建立一个针对该紧急问题的分支(hotfix branch),在该分支上工作直到问题解决:

$ git checkout -b hotfix
Switched to a new branch 'hotfix'
$ vim index.html
$ git commit -a -m 'fixed the broken email address'
[hotfix 1fb7853] fixed the broken email address1 file changed, 2 insertions(+)
基于 `master` 分支的紧急问题分支(hotfix branch)。
Figure 21. 基于  master 分支的紧急问题分支  hotfix branch

你可以运行你的测试,确保你的修改是正确的,然后将其合并回你的 master 分支来部署到线上。 你可以使用 git merge 命令来达到上述目的:

$ git checkout master
$ git merge hotfix
Updating f42c576..3a0874c
Fast-forwardindex.html | 2 ++1 file changed, 2 insertions(+)

在合并的时候,你应该注意到了"快进(fast-forward)"这个词。 由于当前 master 分支所指向的提交是你当前提交(有关 hotfix 的提交)的直接上游,所以 Git 只是简单的将指针向前移动。 换句话说,当你试图合并两个分支时,如果顺着一个分支走下去能够到达另一个分支,那么 Git 在合并两者的时候,只会简单的将指针向前推进(指针右移),因为这种情况下的合并操作没有需要解决的分歧——这就叫做 “快进(fast-forward)”。

现在,最新的修改已经在 master 分支所指向的提交快照中,你可以着手发布该修复了。

`master` 被快进到 `hotfix`。
Figure 22.  master 被快进到  hotfix

关于这个紧急问题的解决方案发布之后,你准备回到被打断之前时的工作中。 然而,你应该先删除 hotfix分支,因为你已经不再需要它了 —— master 分支已经指向了同一个位置。 你可以使用带 -d 选项的 git branch 命令来删除分支:

$ git branch -d hotfix
Deleted branch hotfix (3a0874c).

现在你可以切换回你正在工作的分支继续你的工作,也就是针对 #53 问题的那个分支(iss53 分支)。

$ git checkout iss53
Switched to branch "iss53"
$ vim index.html
$ git commit -a -m 'finished the new footer [issue 53]'
[iss53 ad82d7a] finished the new footer [issue 53]
1 file changed, 1 insertion(+)
继续在 `iss53` 分支上的工作。
Figure 23. 继续在  iss53 分支上的工作

你在 hotfix 分支上所做的工作并没有包含到 iss53 分支中。 如果你需要拉取 hotfix 所做的修改,你可以使用 git merge master 命令将 master 分支合并入 iss53 分支,或者你也可以等到 iss53 分支完成其使命,再将其合并回 master 分支。

分支的合并

假设你已经修正了 #53 问题,并且打算将你的工作合并入 master 分支。 为此,你需要合并 iss53 分支到 master 分支,这和之前你合并 hotfix 分支所做的工作差不多。 你只需要检出到你想合并入的分支,然后运行 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 分支的时候看起来有一点不一样。 在这种情况下,你的开发历史从一个更早的地方开始分叉开来(diverged)。 因为,master 分支所在提交并不是 iss53 分支所在提交的直接祖先,Git 不得不做一些额外的工作。 出现这种情况的时候,Git 会使用两个分支的末端所指的快照(C4 和 C5)以及这两个分支的工作祖先(C2),做一个简单的三方合并。

一次典型合并中所用到的三个快照。
Figure 24. 一次典型合并中所用到的三个快照

和之前将分支指针向前推进所不同的是,Git 将此次三方合并的结果做了一个新的快照并且自动创建一个新的提交指向它。 这个被称作一次合并提交,它的特别之处在于他有不止一个父提交。

一个合并提交。
Figure 25. 一个合并提交

需要指出的是,Git 会自行决定选取哪一个提交作为最优的共同祖先,并以此作为合并的基础;这和更加古老的 CVS 系统或者 Subversion (1.5 版本之前)不同,在这些古老的版本管理系统中,用户需要自己选择最佳的合并基础。 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 会暂停下来,等待你去解决合并产生的冲突。 你可以在合并冲突后的任意时刻使用 git status 命令来查看那些因包含合并冲突而处于未合并(unmerged)状态的文件:

$ 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.htmlno 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 分支所在的位置,因为你在运行 merge 命令的时候已经检出到了这个分支)在这个区段的上半部分(======= 的上半部分),而 iss53 分支所指示的版本在 ======= 的下半部分。 为了解决冲突,你必须选择使用由 ======= 分割的两部分中的一个,或者你也可以自行合并这些内容。 例如,你可以通过把这段内容换成下面的样子来解决冲突:

<div id="footer">
please contact us at email.support@github.com
</div>

上述的冲突解决方案仅保留了其中一个分支的修改,并且 <<<<<<< , ======= , 和 >>>>>>> 这些行被完全删除了。 在你解决了所有文件里的冲突之后,对每个文件使用 git add 命令来将其标记为冲突已解决。 一旦暂存这些原本有冲突的文件,Git 就会将它们标记为冲突已解决。

如果你想使用图形化工具来解决冲突,你可以运行 git mergetool,该命令会为你启动一个合适的可视化合并工具,并带领你一步一步解决这些冲突:

$ git mergetoolThis 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.htmlNormal merge conflict for 'index.html':{local}: modified file{remote}: modified file
Hit return to start merge resolution tool (opendiff):

如果你想使用除默认工具(在这里 Git 使用 opendiff 做为默认的合并工具,因为作者在 Mac 上运行该程序)外的其他合并工具,你可以在 “下列工具中(one of the following tools)” 这句后面看到所有支持的合并工具。 然后输入你喜欢的工具名字就可以了。

Note

如果你需要更加高级的工具来解决复杂的合并冲突,我们会在 高级合并 介绍更多关于分支合并的内容。

等你退出合并工具之后,Git 会询问刚才的合并是否成功。 如果你回答是,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.luyixian.cn/news_show_877732.aspx

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

相关文章

怎样得到一个清爽干净简洁的CSDN文章页面?开源一个小插件,可自由定制用于其他网站。【含视频教程】

&#xff01;&#xff01;&#xff01;想直接看视频教程的请点这里&#xff01;&#xff01;&#xff01; 一、原版CSDN文章页面与清爽版对比 1.1 原版CSDN文章页面 原版页面分了三次截图还没截全&#xff1a; 1.2 清爽版CSDN文章页面 二、忍不住吐槽一下CSDN&#xff08;…

360浏览器访问https网站直接跳转 se://error/ 或者se://errorpage/问题(无法打开网站,网页走丢了)解决方法

最近发现360浏览器访问某个https://网站直接跳转 se://error/ 或者se://errorpage/具体如下 用其他浏览器&#xff0c;例如chrome就可以正常访问那个https网站。所以问题出在浏览器这块了。经过查询资料和测试发现&#xff0c;这个问题的正确解决办法有两个 1、如果安装了IE8等…

iptables+shell防御网站

1.简易搭建一个web服务器 2.分析访问HTTP的日志&#xff0c;目录在 /var/log/httpd/access_log 3.根据网站一分钟之内的访问量来判断&#xff0c;限制IP过多访问&#xff0c;所以要设置时间变量来控制时间。先通过awk进行日志筛选出符合条件的ip&#xff0c;然后通过iptabl…

使用tomcat和mybatis模拟在线人数统计和网站的访问量

思路 使用一个文件来存储网站的总访问量&#xff08;在这里时以键值对的形式来存储 比如count0 然后通过一个properties通过count去获取值也就是访问量&#xff09;&#xff0c;每登陆网站一次就让文件存储的时加一 用setArrtibute 方法给我们需要展示在页面的总访问量赋值 每…

如何利用客户端缓存对网站进行优化?

介绍 你的网站在并发访问很大并且无法承受压力的情况下,你会选择如何优化? 很多人首先会想从服务器缓存方面着手对程序进行优化,许多不同的服务器缓存方式都有他们自己的特点,像我曾经参与的一些项目中,根据缓存的命中率不同使用过 Com/Enterprise Libiary Caching/W…

资源全部到位但是网站渲染不了的原因

1、用nodejs写的网站所有资源都到位&#xff0c;但是页面不被渲染 2、在网上找了很久都没找到原因&#xff0c;最后发现是页面请求js、css等的type为html&#xff08;即&#xff1a;Content-Type&#xff1a;text/html&#xff09;&#xff0c;导致js、css被当做html来解析&am…

nodejs网站开发随记-20140924

记录用nodejs开发的这个流程 1、项目目录 2、目录解析 public:放置js、css、图片等页面渲染的文件&#xff1b; routes&#xff1a;负责页面的调整&#xff1b; server&#xff1a;服务端流程处理及提供数据 view&#xff1a;放置html app.js:启动服务器

使用nat123部署内网网站允许公网访问

1.注册一个nat123账号 注册地址:http://www.nat123.com/UsersReg.jsp 2.注册之后下载客户端以及登录 客户端下载地址:http://www.nat123.com/Pages_2_32.jsp 3.客户端添加映射 4.上面完成之后发现映射提示端口不通(防火墙已放开这个端口),这是因为没有应用监听这个端口 4.…

几分钟上线一个网站,这些神器我爱了

点击“”,关注,置顶公众号 每日技术干货,第一时间送达! 1、ToolJet 简介 ToolJet 是一个开源的低代码框架,可以快速构建和部署内部工具,而无需工程团队付出太多努力。您可以连接到您的数据源,例如数据库(如 PostgreSQL、MongoDB、Elasticsearch 等)、API 端点(To…

新浪网站首页同款选项卡

新浪网站首页同款选项卡 选项卡效果选项卡的布局和 javascript 控制选项卡的html,css,javascript源码 选项卡效果 这是我自己模仿新浪网站首页中部的选项卡做的&#xff0c;大致的效果就是这样的 选项卡的布局和 javascript 控制 下面具体说明一下完成的过程&#xff0c;主…

新浪网站首页同款轮播图

新浪网站首页同款轮播图 1.轮播图的最终效果2. 分析一下它的布局3.设置它的样式4.最核心的jquery控制 1.轮播图的最终效果 成功后的效果图如下; 2. 分析一下它的布局 首先是头部的布局&#xff1a; 轮播的内容&#xff1a; 展现的效果&#xff1a; 3.设置它的样式 样式说明…

仿海康网页版做一个在线的实时监控网站(1)-- 侧边栏站点选择

目前的渔政网页版的开发已经接近尾声&#xff0c;目前要做的是一个网页版的在线视频实时监控的功能&#xff0c;仿照海康的网页版示例&#xff0c;整个页面做下来有点心得体会&#xff0c;所以写一篇博文记录下&#xff0c;方便自己以后翻阅&#xff0c;也希望可以给别人提供帮…

仿海康网页版做一个在线的实时监控网站(2)-- 视屏显示和云台控制

在上一篇博客仿海康网页版做一个在线的实时监控网站&#xff08;1&#xff09;中讲了侧边站点选择栏的生成&#xff0c;这篇博客主要说一下视屏插件的摆放和一些云台控制的操作函数 首先海康的摄像头可以找他们要一个网页版的开发Demo&#xff0c;如果没有我提供一个&#xff1…

网站架构演变

网站架构演变 大型网站介绍 与传统企业应用系统相比&#xff0c;大型互联网网站系统具有以下特点1、大流量、高并发 这一点往往是传统企业应用系统根本就不会遇到的问题&#xff0c;比如Goole每日访问量都是几十亿&#xff0c;如果服务器端处理不好早就被压的宕机了。2、高可用…

实用的网站、工具(科研学术、wps、作图、教程和文档、在线开发工具、在线编程学习、文档笔记工具、办公工具、写作、设计制作类、素材库)

文章目录 科研学术Sci-Hub:SciHub科研学术网址导航 wps相关pdf 转换工具PDF派CleverPDF迅捷PDF转换器 免费模板优品PPTOfficePlus第一PPT 作图在线画图工具ProcessOn在线画图工具draw.io在线思维导图工具PlantUML在线编辑器免费在线图片编辑器 - 在线抠图、改图、修图、美图 - …

【129.1】大型网站技术架构 并发相关知识

一&#xff1a;什么是高并发&#xff1f; 高并发指的是并发数量&#xff0c;是指同一时间有多少个访问同时来访问同一api接口或者url地址。 二&#xff1a;高并发相关概念 1&#xff09;&#xff08;每秒查询率&#xff09;&#xff1a;每秒请求或者查询的数量&#xff0c;在…

jQuery Mobile在微信建站方面的应用

jQuery Mobile在微信建站方面的应用 2014年10月28日 电子商务、网站建设 jQuery Mobile、微信建站 感谢这个不断变革的时代&#xff0c;让我这个三十六岁的IT老兵重新拾起武器开始微信建站&#xff0c;拥抱移动互联网。大概有两年多的时间已经没有正式参与建站工作了&#xff0…

NMPA可以解析了 国家药品监督管理局网站

国家药品监督管理局网站有很多药品、保健品数据&#xff0c;很多人需要相关数据所以才去采集。但是&#xff0c;NMPA网站的反爬一直走在最前线&#xff0c;爬虫的程序一直无法很好工作。 现在&#xff0c;搞定了。 目前可以使用程序打开药监局网站&#xff0c;然后到药品页面…

scrapy爬取某视频网站的部分视频信息

此次爬取的信息有&#xff1a; 1、视频名称 2、在线观看人数 3、弹幕内容 4、弹幕发送时间 5、弹幕在视频中的位置 6、点赞 7、收藏 8、投币数 由于b站的很多信息是动态加载的。所以部分信息&#xff0c;需要自己抓包&#xff0c;进入对应的网址抽取信息。例如在线观看视频人…

一个将多线程多进程结合爬取图片网站的示例

在图片网站爬取图片时候&#xff0c;我们需要取得具体每张图片的url地址&#xff0c;然后下载到电脑保存下来。这其中&#xff0c;对时间消耗最多的步骤是保存图片到本地硬盘&#xff0c;机械硬盘的读写性能速度较慢。如果采取单线程单进程的话&#xff0c;在读写的同时没法进行…