g4e基础篇#5 创建分支和保存代码

使用版本控制系统最常见的工作流程就是修改代码,保存代码,共享代码。Git提供了一个简单的3步工作流,让你方便的完成这些操作。

1. 新建工作分支
2. 提交更改
3. 推送分支到中心存储库与团队成员共享

Git 工作流

按照以上3步操作,我们就可以开始日常的编码工作流了。下图中展示了这个工作流的示意:

下面,我们按照这3个步骤来完成一个典型的Git提交的创建过程:

1. 创建分支

创建分支之前你需要获取Git存储库,这部分请参考之前的内容。将命令行切换到存储库中的任意目录,然后执行以下命令:

>>> git branch

不带分支名称命令可以查看本地已经存在的分支

>>> git branch <分支名称>
>>> git checkout <分支名称>

带有分支名称的branch和checkout命令用于创建和切换分支,你也可以通过一个命令完成以上操作

>>> git checkout -b <分支名称>

执行完成后你会看到命令行的提示符发生变化,表示你已经切换到一个分支上进行工作了。

2. 提交代码到分支

首先通过cmder中的命令提示行确认你所处的分支是正确的,注意下图中的 (my-new-branch-2 -> origin) 这表示我们当前处于my-new-branch-2这条分支上,后面的origin是git远程存储库的一个标识,表示当前我们跟踪的是origin这个别名的远程存储库。

注:关于远程存储库我们在后面进阶篇会专门进行介绍,这里你只要知道这就是你克隆代码的那个存储库就够了。

在以上命令行状态下键入以下命令打开 Visual Studio Code,编辑文件并保存退出。

>>> code .

以上我们对2个文件进行了变更,a.txt是一个已经存在的文件,b.txt是我们刚刚新建的文件。以上我们保存文件并关闭vscode以后,可以通过以下命令查看当前工作目录中的变更

>>> git status

以上输出的内容中有2部分内容需要理解清楚

○ Changes not staged for commit:这部分列出的文件表示已经属于存储库的一部分,但是当前的改动并没有被暂存。
○ Untracked files: 这部分列出的文件还不属于存储库的一部分。

你会注意到在a.txt前面显示了modified,因为a.txt已经是存储库的一部分所以git可以跟踪到你对它的修改,但是对与b.txt git根本不知道你做了什么,它只知道这里有个文件还没有被git跟踪。

现在,我们需要将这两个文件“暂存”,做好提交准备。然后执行以下命令完成暂存

>>> git add --all
>>> git status

你也可以使用文件名或者通配符替换–all参数,只添加那些自己认为需要暂存的文件。

如果暂存错误,使用以下命令取消暂存。

>>> git reset HEAD

这时git已经将2个文件全部放入了暂存区,准备进行提交。这时你可以执行以下命令完成提交,git会对当前文件创建快照,形成版本记录。请执行

>>> git commit -m "my first git commit"

git commit 命令用于提交代码变更到git存储库,后面的-m参数由于给出你的提交注释,在git中提交注释是必选项,不能掠过。这其实是一个非常好的设计,我想你一定为了在svn代码库中看到一堆没有注释的变更骂过街。

完成 git commit 命令后,你的git中就已经保存了刚才所做的代码改动了。现在你可以继续编码,并在感觉必要的时候随时重复以上的过程保存自己的改动,就不用再担心会丢失代码了。

你还可以随时切换回到master分支,这个操作不会要求你更改目录,而在编辑器里面的代码会直接切换到master分支的代码状态。只要执行

>>> git checkout master

注意:当我完成切换的是时候,我们之前创建的b.txt从vscode中消失了,同时a.txt里面之前修改的内容也不见了。如果要找回改动,只要再切换回到刚才的分支即可。

3. 推送分支到中心存储库与团队成员共享

企业开发中推常见的场景就是团队协同,开发人员本地完成修改后需要共享给其他开发人员一起使用,这时我们可以利用中心存储库来完成这个操作。首先确保你处于自己希望共享的分支中,然后运行:

>>> git push origin my-new-branch-2

完成操作后,你的本地分支就被推送到中心存储库上了,这时其他开发人员就可以通过以下命令获取你的分支代码。

>>> git fetch
>>> git checkout my-new-branch-2

注意:git允许你在本地和远程使用不同的分支名称,这给予开发人员更多的自由度,但是有时候也会造成麻烦,比如可能你忘记了你本地分支已经在跟踪一条远程分支,不小心改错了代码。

为了能够更加清晰的标识分支的所有人,一般我们在建立分支的时候会通过前缀的方式来标识,使用特定格式的前缀可以让VSTS/TFS将你的前缀变成分支文件夹形式显示,便于管理。如下图,在创建分支的时候使用了 leixu/ 作为前缀,推送到服务器上以后就变成文件夹显示

你甚至可以设置多级文件夹,这样在团队比较大的时候管理起来就容易多了。

为何一定要使用分支?

为什么改动一定要放在分支中实现。这个与软件开发本身的特性有关系,软件开发过程本身是一个不确定的过程,没有人可以在代码写完之前预测出到底应该怎样写。这个与产品生产制造不同,产品生产制造之前,所有的工序,操作和零件都是确定的,因此我们可以清晰的规划如何完成制造过程,也可以将这个过程组织成流水线顺序执行(注意:这里的流水线特指制造业工厂中的生产流水线,与我们后面说的软件交付流水线不同)。软件的开发过程则完全是一个探索过程,开发人员需要经过多次失败的尝试才能最终找到正确的实现方式,这个过程需要多次修改代码,有时还可能会推翻从来。这种循环往复的过程越接近开发人员的日常编码,越接近最小的功能实现就越发频繁。因此,开发人员必须能够在不影响主干代码的情况下,自助的创建代码副本,在这个副本上完成以上尝试;同时,也需要兼顾代码主干上的变更,确保自己的改动的基准永远与整个团队对齐,否则就算写好了也无法与整个团队的工作集成。这个矛盾是所有配置管理策略要处理的核心矛盾,所有我们所遇到问题,各种复杂的分支策略以及后续的持续交付流水线的设计都是基于这个问题延展出来的,只不过在更加复杂的团队/产品/项目中,这个矛盾被乘各种复杂度被放大,因而需要我们提供更为复杂的配置管理流程来进行适应。

从这一点上稍微扩展一下,你就可以理解其实所有的配置管理流程的设计原则应该是“适应”而不是“控制”,找出最适合团队的流程,让流程为人服务是所有配置管理流程目标。也因为此,我们需要将配置管理流程视为一个变化的规则,它必须根据团队的情况适时改变,才能确保可用。

理解了以上2点内容,我们就知道为什么Git的工作一定要放入分支,而不是在主干上直接操作。如果代码变更直接进入master或者团队成员共享的分支,则会直接对生产环境或者团队成员共享的环境造成影响,在变更还未成熟稳定之前,最保险的做法就是尽量隔离的进行修改直到代码可以被其他成员或者某一环境接受的时候再合并进去。

虽然任何的配置管理工具都允许你创建分支,但是Git的以下2个特性决定了它超越其他任何配置管理工具成为团队的首选:

1. 轻量级分支:Git的分支非常轻,可以在瞬间完成创建,也可以随时被销毁;拉分支不会增加Git存储库的存储开销,只有当你提交修改的时候才会增量的增加相应的存储内容。
2. 同文件夹内切换分支:Git分支切换不需要切换文件夹,这样可以和开发工具更好的集成,开发人员可以快速的在不同分支间进行切换,甚至都不需要停止IDE里面的Debug进程。这让开发人员更加敏捷的进行尝试,更加快速的解决问题。
3. 本地分支:因为分布式的特点,Git分支不需要依赖服务器就可以完成。给予开发人员独立的,不依赖其他人就可以进行尝试的可能性。而在集中式配置管理工具中,任何分支的创建都必须是由配置管理员才能完成的工作,这大大降低了单个开发人员的效率。

采用集中式版本控制(CVCS)的系统并不是不能创建分支,但是由于分支过于沉重,开销太大,团队往往会选择只允许配置管理员才能执行这个操作,这就让开发人很受束缚。

注:当然,也正是因为以上这些优势,才让很多企业的大规模团队管理者对Git敬而远之,觉得它太过灵活。其实Git完全兼顾了大规模团队的管控要求,只是实现的方式与传统的配置管理工具不同而已,这一点我们会在第3部分中专门讨论。

小结

在这一篇中我们介绍了基本的Git编码工作流程,了解了这些你就可以开始使用Git进行日常的编码工作了。当然,既然Git推荐我们尽量使用分支来维护变更,那么就必须允许我们进行合并,这样才能最终完成团队开发的协作。这部分会在下一篇中进行介绍。

相关文章:

原文地址:http://devopshub.cn/2018/01/13/g4e-basic-04-git-repo/ 


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

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

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

相关文章

P3952-时间复杂度【模拟】

正题 题目链接:https://www.luogu.org/problemnew/show/P3952 题目大意 比较复杂就直接给截图了 解题思路 开一个栈来维护序列&#xff0c;因为它保证合法的程序中一个变量不会相互嵌套所以就拿变量的字母当做每个循环的下标即可。然后对于输入的x,yx,yx,y有五种情况 xN,yN…

一步步部署基于Windows系统的Jenkins持续集成环境

如题&#xff1a;本文将介绍如何在Windows环境下运用Jenkins部署持续集成环境。之所以写本文&#xff0c;是因为在最近工作当中&#xff0c;学习使用Jenkins时&#xff0c;确实遇到了一些问题&#xff0c;而大多数教程文档都是基于Mac或是Linux平台。为此很是头疼&#xff0c;经…

Sentinel(二十二)之使用Nacos存储规则

转载自 Spring Cloud Alibaba基础教程&#xff1a;Sentinel使用Nacos存储规则 通过上一篇《使用Sentinel实现接口限流》的介绍&#xff0c;相信大家对Sentinel已经有了初步的认识。在Spring Cloud Alibaba的整合封装之下&#xff0c;接口限流这件事情可以非常轻易的整合到我们…

vue 开发2017年变化回顾及2018年展望

vue.js 变化从 github 的发布记录我们可以看到2017年 vue.js 的第一个发布为 v2.1.9&#xff0c;最后一个为 v2.5.13&#xff0c;主要发布小版本 2.2~2.5。这些发布提升了vue 与 TypeScript 的结合、改进了对服务端渲染&#xff08;SSR&#xff09;和 native 渲染的支持、提供了…

Sentinel(二十三)之使用Apollo存储规则

转载自 Spring Cloud Alibaba基础教程&#xff1a;Sentinel使用Apollo存储规则 上一篇我们介绍了如何通过Nacos的配置功能来存储限流规则。Apollo是国内用户非常多的配置中心&#xff0c;所以&#xff0c;今天我们继续说说Spring Cloud Alibaba Sentinel中如何将流控规则存储…

Quartz.Net分布式任务管理平台

前言&#xff1a;我相信大多数人公司的业务上都有定时任务这么个功能&#xff0c;我们公司也不例外&#xff0c;刚来公司的时候使用Quartz.Net为我们组做了第一个任务&#xff0c;大致流程是&#xff1a;新建一个控制台程序&#xff0c;引用需要的程序集&#xff0c;Execute方法…

Sentinel(二十四)之Sentinel Dashboard中修改规则同步到ZooKeeper

转载自 Springboot使用Sentinel限流&#xff0c;集成zookeeper完成规则的持久化 上一篇简单介绍了sentinel限流的基本配置和使用&#xff0c;这一篇我们来稍微深入一点&#xff0c;看看如何将zookeeper继承进来&#xff0c;用以保存添加的流控规则。 上一篇中我们启动了dash…

微软Azure AspNetCore微服务实战第2期(内附PPT下载)

2018年1月28日&#xff0c;虽然上海的大雪在城区已经见不到踪影&#xff0c;但还是很冷。不过天气再冷&#xff0c;也阻止不了小伙伴参加活动的热情。感谢王振&#xff0c;苏老师以及微软Azure API Management的产品经理Alvin&#xff0c;给大家带来微服务实战&#xff0c;企业…

Sentinel(二十五)之Sentinel Dashboard同步Apollo存储规则

转载自 Spring Cloud Alibaba基础教程&#xff1a;Sentinel Dashboard同步Apollo存储规则 在之前的两篇教程中我们分别介绍了如何将Sentinel的限流规则存储到Nacos和Apollo中。同时&#xff0c;在文末的思考中&#xff0c;我都指出了这两套整合方案都存在一个不足之处&#…

为什么选择.NETCore?

为什么选择.NETCore&#xff1f;在开展话题之前先出一张ASP.NETCore VS Node.js的性能对比图 ASP.NET Core VS node.js&#xff1a;继续正文&#xff1a;学习新的开发框架是一项巨大的投资。您需要学习如何在新框架中编写&#xff0c;构建&#xff0c;测试&#xff0c;部署…

欢乐纪中某A组赛【2019.7.10】

前言 好烦我最后写对了T1T1T1的808080分结果交错题导致T2T2T2的404040分没了T1T1T1也没拿多那些分。 话说好像ZDYZDYZDY比我还惨 成绩 这里还是按OJOJOJ上的分数排名 JJJ表示初中&#xff0c;HHH表示高中后面加的是几年级 RankRankRankPersonPersonPersonScoreScoreScoreAAA…

用C#编写Linux守护进程

如果要在Red Hat Enterprise Linux上将.NET Core进程作为后台进程运行&#xff0c;则可以创建自定义systemd单元。今天我将为.NET Core编写两个自定义系统单元的例子。一个是运行.NET Core控制台应用程序的一种类型&#xff0c;另一个是运行ASP.NET Core Web应用程序的简单类型…

AWS Lambda现已支持.NET Core 2.0

Amazon宣称.NET Core 2.0现在已经支持AWS Lambda以及无服务器应用程序了。开发者们现在可以使用C#和.NET Core 2.0来为AWS Lambda编写代码和编写运行于AWS的无服务器应用程序了。自2017年2月Amazon开始了对C#编程语言的支持&#xff0c;这使得.NET开发者能够使用.NET Core 1.0运…

Nacos(一)之简介

转载自 什么是 Nacos Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#xff0c;帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现…

开源纯C#工控网关+组态软件(八)表达式编译器

一、 引子监控画面的主要功能之一就是跟踪下位机变量变化&#xff0c;并将这些变化展现为动画。大部分时候&#xff0c;界面上一个图元组件的某个状态&#xff0c;与单一变量Tag绑定&#xff0c;比如电机的运行态&#xff0c;绑定一个MotorRunning信号&#xff1b;但有些时候…

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

Git的版本历史记录采用了与传统集中式版本管理系统完全不同的方式进行组织&#xff0c;在刚开始使用Git的时候我们往往会不知所措&#xff0c;比如看到这样的历史记录。看到这个七拐八拐的图形&#xff0c;你可能完全不知道它代表了什么。其实这正是Git的特别之处&#xff0c;G…

Ray框架QA

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

Nacos(三)之架构

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

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

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

ASP.NETCore的Kestrel服务器

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