g4e基础篇#6 了解Git历史记录

Git的版本历史记录采用了与传统集中式版本管理系统完全不同的方式进行组织,在刚开始使用Git的时候我们往往会不知所措,比如看到这样的历史记录。

看到这个七拐八拐的图形,你可能完全不知道它代表了什么。其实这正是Git的特别之处,Git之所以能够实现之前我们所说那些灵活快速的操作,都是因为它采用这种类似链路的版本记录方式。在这一篇中,我们就一起了解一下这个图形是如何生成的。

这里,我们要模拟一个常见的开发场景:

  • 你正在开发一个网站的某个新功能,按照Git的推荐方式,你创建了feature1分支来承载这个新功能的代码变更。

  • 当你已经在这个功能上完成几次代码提交的时候,你的项目经理告诉你这个网站现在出现了一个严重的线上问题,需要紧急修复。

  • 为了能够快速修复这个线上问题,你不能等待下一个版本发布,必须在现有线上版本上进行修复。这时你暂停了feature1分支的开发工作,切换回到master分支,从新拉取一个名为hotfix的分支并在这个分支上开始了线上问题的修复。

  • 当你完成了修复并测试通过后,你将hotfix分支合并到master以便立即从新发布线上版本。

  • 完成以上工作后,你切换回到feature1分支继续进行新功能的开发直到新的功能也经过测试可以发布。

  • 最后你将feature1分支也合并回到master分支,发布到线上环境。

为了演示这个过程,首先我使用 Visual Studio 创建了一个新的Web网站项目,完成了4次提交并推送到了TFS的Git仓库。

初始状态

初始的历史记录显示如下:

用简单的示意图表示,是这样的:

如果使用命令行查看历史记录可以键入如下命令

>>> git log --oneline --graph

以上的–oneline参数让git只输出第一行的注释信息,简化历史记录更加可读;–graph参数用来在命令行中输出图形链路,现在我们还看不到效果,后面就会有变化。

输出的结果如下

注:如果你在使用以上命令的过程中遇到乱码,请参考:常见问题#4

这表示当前的master分支指向版本库最新的一次提交(C4),同时之前的所有提交都是顺序完成的,形成了一个单一主线的链路。在TFS的版本记录视图上你所看到的图形一列表示的是同一个意思。

创建feature1分支并提交2次变更

现在,按照我们在上一篇中介绍的方法,创建feature1分支,并在这上面完成2次新的提交。

此时再次使用上面的命令列出历史记录,你会看到如下结果:

这个时候你就会有点纳闷了,为什么明明做了分支,历史记录仍然是单一的直线呢?不是应该分叉了吗?看一下示意图你就明白了。

Git确实记录了你的分支信息,只不过它非常聪明的只是修改了feature1所指向的提交而已;这时你的master分支仍然指向C4提交,而feature1分支则指向C6提交了。

以上git log所输出的信息中也非常明确的标明了这一点,看一下历史记录的第1行和第3行括号里面内容就明白了。

创建hotfix分支并提交另外2次变更

现在那个讨厌的项目经理给你下达了新的任务,要修复线上问题。因为线上所部署的正是master分支上的最新版本,所以你需要切换到master分支(也就是C4提交所代表的版本)进行修改。

这时你可以使用以下命令完成hotfix分支的创建

>>> git checkout master
>>> git checkout -b hotfix

完成这个操作后,我们在hotfix分支上输出历史记录。

你会看到现在hotfix和master分支同时指向了一个提交记录(C4),示意图如下:

现在我们在hotfix分支上添加2个新的变更,并输出历史记录

现在hotfix所指向的提交变成了 C8,如果再看我们的示意图就可以看到分叉的效果了

但是为什么git 输出的历史记录中仍然是一条直线呢?这是因为对于master, hotfix和feature1任何一个分支而言,他们的改动对于自己都是单向的唯一链路。

合并hotfix分支到master

现在你已经完成了问题修复,可以将代码合并到master并发布到线上环境了,让我们将hotfix分支的代码合并到master主干上。你需要执行下面命令

>>> git checkout master
>>> git merge hotfix

这2条命令的意思是回到master分支并将hotfix分支的改动合并进来,因为hotfix就是基于master分支进行的,所以合并会直接完成不会有任何的冲突出现。

这里出现了一个词Fast-forward,因为hotfix分支是直接在master分支上完成的,所以git其实仅仅修改了master分支的指向到hotfix的当前指向(也就是C8),输出一下log你就看得很清楚了。

对比刚才在hotfix上的log输出,你会看到这里唯一的变化就是本地master分支的指向移动到了最后一条提交上。你也许会注意到这里还有一个origin/master的指向仍然在之前的提交之上,这时因为我们的Git库已经提交到了TFS的中心存储库,而这个origin/master所代表的是这个中心存储库上的master分支所处的位置,因为我们在以上过程中没有给中心存储库推送过代码,所以这个中心存储库的master分支仍然指向的是最初的位置。

到这里你会明白,Git的分支其实就是一个指针而已,通过这个指针对提交的指向,Git可以非常灵活的切换版本。

到了这里,我们的示意图就变成了这个样子了

合并feature1分支到master分支

现在你已经修复了线上问题,可以回到feature1上继续工作了。假设我们提交C9以后feature1的开发工作也已经完成可以合并了。与刚才合并hotfix的方法一样,我们只需要返回master分支并执行合并命令

>>> git checkout master
>>> git merge feature1

执行的效果如下:

现在如果我们再次在master上输出历史记录,你将看到如下效果

你会注意到git创建了一个新的提交 b5bcb0b 并将这个提交的注释设置为 Merge branch ‘feature1’,它的意思是我为你创建了一个新的提交,在这个提交里面保存了feature1合并进来的代码变更。

注意:在执行merge动作的时候出现了3个Auto-merging的信息,这表明Git自动为你完成了3个文件的合并,在实际使用中这样做可能是会出现问题的,因为Git实际上只是根据文件代码行的信息判断是否可以完成自动合并,这种合并并不是永远安全可靠的。这一点我们在进阶篇中会特别介绍。

现在,我们的示意图就变成了这个样子

最后,我们可以同步代码到TFS中心存储库,并查看服务器上的历史记录。你会看到与我们的示意图非常类似的图形显示。

小结

了解Git处理历史记录的方式对于我们用好Git非常重要,特别是在企业级开发中处理复杂的多版本并行开发的过程中。以上我们提到的几个可能令你困惑的地方,比如hotfix分支合并的时候Git仅仅移动指针的行为,以及最后合并feature1分支时Git创建用于合并的提交的方式都是我们在日常开发中常见的情况。理解了Git的特殊处理方式有助于你在遇到类似情况的时候作出正确的判断,并对后面介绍的很多复杂场景更容易理解。

示例代码:

以上示例代码已经推送到 https://github.com/lean-soft/git-history-demo

相关文章:

原文地址:http://devopshub.cn/2018/01/30/g4e-basic-06-understand-git-history/


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com


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

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

相关文章

Nacos(二)之概念

转载自 Nacos 概念 NOTE: Nacos 引入了一些基本的概念,系统性的了解一下这些概念可以帮助您更好的理解和正确的使用 Nacos 产品。 地域 物理的数据中心,资源创建成功后不能更换。 可用区 同一地域内,电力和网络互相独立的物理区域。同一可…

bzoj3482,jzoj3238-超时空旅行hiperprostor【最短路,凸包,斜率优化】

正题 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id3482 题目大意 一张有向图有正整数边权也有xxx边权。其中xxx可以取任何值(但是要注意所有的xxx边必须长度相等),每次询问求SSS到TTT的可能最短路长度个数和它们的和。 解题思路 分层图&#xff…

Ray框架QA

Orleans与Akka对比,为什么选用Orleans?答: Akka对参与开发的人员要求更高一些,普遍是专家级别,Orleans框架进一步抽象了一层,结合C#语言特性,能普遍降低开发难度。下面是知乎网友的答案,可以参考…

Nacos(三)之架构

转载自 Nacos 架构 基本架构及概念 服务 (Service) 服务是指一个或一组软件功能(例如特定信息的检索或一组操作的执行),其目的是不同的客户端可以为不同的目的重用(例如通过跨进程的网络调用)。Nacos 支持主流的服务…

欢乐纪中某A组赛【2019.7.11】

前言 话说今天好像放做题导致BBB组贼难AAA组还好。 成绩 JJJ表示初中,HHH表示高中后面加的是几年级 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC101010(J−2)WYC(J-2)WYC(J−2)WYC250250250100100100100100100505050282828(J−2)ZYC(J-2)ZYC(J−2)ZYC…

ASP.NET Core Razor页面禁用防伪令牌验证

这篇短文中,我将向您介绍如何ASP.NET Core Razor页面中禁用防伪令牌验证。Razor页面是ASP.NET Core 2.0中增加的一个页面控制器框架,用于构建动态的、数据驱动的网站;支持跨平台开发,可以部署到Windows,Unix和Mac操作系…

Nacos(四)之安装

转载自 Nacos 快速开始 这个快速开始手册是帮忙您快速在您的电脑上,下载、安装并使用 Nacos。 0.版本选择 您可以在Nacos的release notes及博客中找到每个版本支持的功能的介绍,当前推荐的稳定版本为1.4.1。 1.预备环境准备 Nacos 依赖 Java 环境来…

jzoj1166-树中点对距离【点分治】

正题 题目大意 求一棵树上有多少条路径长度≤len\leq len≤len 解题思路 首先普通点分治。扫描的时候将每个点保存为一个二元组(dis,gra)(dis,gra)(dis,gra)分别表示离(分治到的)根的距离,属于根的那颗子树。 然后按照disdisdis排序,两个指针L,RL,RL,…

ASP.NETCore的Kestrel服务器

什么是Kestrel服务器Kestrel是开源的(GitHub提供的源代码),事件驱动的异步I / O服务器,用于在任何平台上托管ASP.NET应用程序。这是一个监听服务器和一个命令行界面。您将侦听服务器安装在Windows或Linux服务器上,并在…

Nacos(五)之Spring集成

转载自 Nacos Spring 快速开始 本文主要面向 Spring 的使用者,通过两个示例来介绍如何使用 Nacos 来实现分布式环境下的配置管理和服务发现。 关于 Nacos Spring 的详细文档请参看:nacos-spring-project。 通过 Nacos server 和 Nacos Spring 配置管…

jzoj3360-[NOI2013模拟]苹果树【树上莫队,LCA】

正题 题目大意 一棵树上每个节点有不同的颜色,然后每次询问(x,y,a,b)(x,y,a,b)(x,y,a,b)表示将颜色aaa看为颜色bbb的情况下询问xxx到yyy有多少不种的颜色。 解题思路 数颜色,显然树上莫队。我们维护一个欧拉序dfndfndfn(进去时记录一次出来时记录一次)…

Polly组件对微服务场景的价值

Polly是一个开源框架,在github上可以找到,被善友大哥收录,也是.App vNext的一员!App vNext:https://github.com/App-vNextGitHub:https://github.com/App-vNext/PollyNanoFabric是一个开源的微服务架构,也是善友大哥推荐的:https://github.com/geffzhang/NanoFabric对于NanoFab…

Nacos(六)之Spring Boot集成

转载自 Nacos Spring Boot 快速开始 本文主要面向 Spring Boot 的使用者,通过两个示例来介绍如何使用 Nacos 来实现分布式环境下的配置管理和服务发现。 关于 Nacos Spring Boot 的详细文档请参看:nacos-spring-boot-project。 通过 Nacos Server 和…

P4556,jzoj3397-[GDOI2014模拟]雨天的尾巴【树链剖分,线段树】

正题 题目链接:https://www.luogu.org/problemnew/show/P4556 题目大意 nnn个点的一棵树,给出mmm个操作(x,y,z)(x,y,z)(x,y,z)表示将xxx到yyy的路径上的所有点给与一个zzz类型的食量。 最后对于每个点输出最多的粮食类型。 解题思路 先对这棵树进行树剖&#xff…

Nacos(七)之Spring Cloud集成

转载自 Nacos Spring Cloud 快速开始 本文主要面向 Spring Cloud 的使用者,通过两个示例来介绍如何使用 Nacos 来实现分布式环境下的配置管理和服务注册发现。 关于 Nacos Spring Cloud 的详细文档请参看:Nacos Config 和 Nacos Discovery。 通过 Nac…

.NET Core 2.1中改进的堆栈信息

. NET Core 2.1 现在具有可读的异步堆栈信息!使得异步、迭代器和字典 ( key not found ) 中的堆栈更容易追踪!这个大胆的主张意味着什么?要知道,为了确定调用 异步 和 迭代器方法的实际重载,(这在以前&…

jzoj3362,bzoj3758-[NOI2013模拟]数数【分段打表,背包,状压】

正题 bzojbzojbzoj题面链接:https://www.lydsy.com/JudgeOnline/problem.php?id3758 题目大意 求A∼BA\sim BA∼B中有多少个数满足数字上的位数可以分成两个和相等的集合。 解题思路 首先我们考虑如何快速判断一个数是否是满足要求的数,我们可以用背包&#xff0…

Nacos(八)之Docker

转载自 Nacos Docker 快速开始 操作步骤 Clone 项目 git clone https://github.com/nacos-group/nacos-docker.git cd nacos-docker单机模式 Derby docker-compose -f example/standalone-derby.yaml up单机模式 MySQL 如果希望使用MySQL5.7 docker-compose -f example/sta…

微软高管解读财报:努力创新云基础架构

2月1日,微软发布了该公司截至2017年12月31日的2018年第二财季财报(即2017年第四季度)。财报显示,微软第二财季营收为289.18亿美元,比上年同期的258.26亿美元增长了12%。受税改与就业法案相关的一次性费用138亿美元的影…

欢乐纪中某A组赛【2019.7.12】

前言 暴力写挂垫底了呀\huge \color{red}\texttt{暴力写挂}\small\color{white}\\\texttt{垫底了呀}暴力写挂垫底了呀 %%%ZZYrank1\texttt{\%\%\% ZZY rank1}%%% ZZY rank1 成绩 JJJ表示初中,HHH表示高中后面加的是几年级 RankRankRankPersonPersonPersonScoreScore…