[.net 面向对象程序设计进阶] (26) 团队开发利器(五)分布式版本控制系统Git——图形化Git客户端工具TortoiseGit

[.net 面向对象程序设计进阶] (26) 团队开发利器(五)分布式版本控制系统Git——图形化Git客户端工具TortoiseGit

读前必备:

接上篇:

分布式版本控制系统Git——使用GitStack+TortoiseGit 图形界面搭建Git环境

http://www.cnblogs.com/yubinfeng/p/5182271.html

本篇导读:

上篇介绍了一款Windows环境下的Git服务器工具GitStack ,搭建了最简单的Windows下的Git服务器,需要再次提醒的是GitStack是打包了相对较稳定的Git原生版本的,喜欢使用命令行的同学,并不影响你。GitStack仅仅是提供了一套界面化操作和一个Http服务。本篇将深入介绍如何使用强大客户端Git工具TortoiseGit进行分支切换、合并等操作。

1. 创建分支

分支在Git中可以说非常的方便实用,首先我们在什么情况下需要创建分支呢?

在这点上Git和SVN理念上就有差异。SVN的分支一般作为管理员事先分配好分支的用途,开发人员不能随意创建。而Git你想建就建吧,你自己知道分支是什么就行。

Git中每个开发者最好都有一个自己的分支。然后可以再创建分支作为阶段备份,作为试验品,干什么都行。最后,你把你的试验成果合并到自己的分支上。再然后如果自己的分支相对稳定,再提交到主干上。

当然master是否采纳你的分支全部或部分,这是master的工作。这样的自由开发方式,是不是心动了呢,继续看下去吧!

话不多说,我们直入主题,下面看下如何创建一个分支。

在项目 主文件夹右击或打开主项目文件件,在空白处右击,选择TortoiseGit,选择创“创建分支”

输入一个分支名称,"Yu_V1"表示我个人的第一个版本,下面切换到新分支如果选中,创建完成后,工作环境将切换到新分支了,如果没选,也可以很方便的切换

完成分支创建以后,我们更新增一个文件“我的第四个文件.txt”

新建文件后,我们在空白区域右击,发现提交默认变成了 提交到 Yu_V1

进入提交,输入备注,选中新建的文件四,在这个窗口可以看到当前所要提交的分支名称

2. 切换分支

这时,如果我们要回到主干怎么办呢,Git的分支切换非常方便

项目目录空白处右击,TortoiseGit=> 切换/检出

在切换窗口,我们可以很方便的切换到任一分支,假如我们切换到master

我们会发现,分支Yu_V1中第四个文件没有了,右击空白,会发现切换到了master.

第四个文件并不会丢失,当我们再次切换回分支Yu_V1的时候,第四个文件又会回来了

这就是Git强大的地方,他在服务器上存储了一个文件库(以元数据方式存储),再存储了一个版本及分支更改等的变更信息库,每次我们切换的时候向服务端发送了一个请求,服务端则根据我们的请求变更我们的项目中的文件。

整个过程就是快速的传输,服务器上并不会一一存储各个分支的文件副本,这也是Git服务端版本库不会暴增的主要原因。

(我会在介绍过程中,慢慢把Git的工作原理切入进来)

3. 查看日志

项目目录空白处右击,TortoiseGit=> 显示日志

如上图,在打开的显示日志窗口中,我们可以看到如果创建了分支,日志信息中会在变更信息前显示一个分支名称,以方便我们了解是哪一个分支的变更

我们再次建一个文件,创建一个新分支Yu_V2,将新建的文件提交到该分支,再次查看日志

可以看到红色表示当前所在分支,绿色表示其他分支变更信息

4. 查看版本分支图

项目目录空白处右击,TortoiseGit=> 查看版本分支图

在打开的分支图窗口中,可以看到版本分支的创建历史流程

5. 合并分支

项目目录空白处右击,TortoiseGit=> 合并

在弹出的合并窗口中,我们先选择一个分支,合并至当前分支(这里一定要注意,合并关系,如果要最终合并到那个分支,先切换到该分支,再选一个合并目标)

提示合并完成,是不是非常简单。

6. 删除分支和分支更名

项目目录空白处右击,TortoiseGit=> 切换/检出

在切换界面中,分支选择后面的选择按钮打开,如上图右侧窗口,可以更新和删除某个分支,注意,不能删除当前分支,如果要删除当前分支,请换到到其他分支进行操作

7. 推送

项目目录空白处右击,TortoiseGit=> 推送

在推送窗口中,如果选择 推送所有分支,则本地库中所有分支都被推送到服务器,默认为推送当前分支。我们可以选择推送到其他分支,而提交只能提交到远程的对应分支或新建分支。

我们可以随时在服务器端GitStack中查看我们的项目提交情况

打开GitStack,找到我们创建的版本库"MyGitObject",点击右边的“浏览”按钮,如下图

在服务端,我们可以很方便的查看推送到服务器的文件及分支信息。

8. 更新版本库

前面我们已经熟悉了从远程服务器克隆一个版本库到本地及从本地推送给Git,在项目推进过程中,我们如何及时获取其它分支的更新内容呢,接下来将介绍这点。

关于更新本地库,这里有两个操作,如果你是中文版本的TortoiseGit很容易搞错,这就是语言差异。

中文版本 分别为 拉取和获取 对应英文版为 Pull(拉取)和Fetch(获取)

在这里一起介绍这两个指令,他们有什么区别呢?

拉取(Pull)会从远程取得最新版本然后合并(Merge)到本地库

获取(Fetch)则会从远程取得最新版本,并不会合并(Merge)到本地库

可以说 拉取(Pull)=获取(Fetch)+合并(Merge)

从安全角度来说,Fetch更安全,因为我们可以先Fetch新版本,然后进行差异比较后,再选择性的 Merge。这也是推荐做法,即先Fetch到一个本地副本分支,然后将该副本分支和本地版本比较,合并后,再提交到远程主机。

获取和拉取的操作很简单

项目目录空白处右击,TortoiseGit=> 拉取(Pull)

项目目录空白处右击,TortoiseGit=> 获取(Fetch)

9. 差异比较

9.1 比较分支版本差异

我们该如何查看分支1和分支2的差异呢?TortoiseGit为我们提供了很方便的功能

项目目录空白处右击,TortoiseGit=> 查看日志

9.2 比较同一分支当前版本和上一版本差异

项目目录空白处右击,TortoiseGit=> 比较与上一版本差异

9.3 比较两个文件差异

选中项目中两个文件 右击,TortoiseGit=> 比较差异

打开文件差异比较窗口,如下

也可以在某个文件上右击,选择”与上一版本差异“来查看某个文件的更改内容

10. 还原

如果某次操作我们后悔了,可以使用还原,将还原到上次提交前的状态。

项目目录空白处右击,TortoiseGit=> 还原

注意:还原只能还原到最近一次提交时的状态, 之前提交的的版本怎么还原呢,也是有办法的,如下:

项目目录空白处右击,TortoiseGit=> 查看日志

选中一个历史版本,右击,点”重置到这个版本“将把版本回退到之前的版本。

11. Git中解决冲突

使用Git这种非锁定式的版本控制系统以后,很多初学者都有解决冲突恐惧症,分布式的开发给我们带来便利的同时,产生冲突也是正常的。所谓防范胜于救灾,我们可以避免,如何避免呢?

(1)首先团队在开发过程中需要有明确规范;

(2)开发人员需要及时获取新版本;

(3)修改后,一定要及时递交;

即使做到以上三点,仍然会有冲突的存在,解决冲突并不可怕,通过上面的介绍,我们可以看到GIT给我们提供了许多辅助功能,比如文件差异比较,版本差异比较等。我们要充分利用这些便利解决问题。

一般冲突主要有三种:逻辑冲突、树冲突、内容冲突

这三种冲突如何应对呢?

(1)逻辑冲突

产生原因:比如A方法作用是返回从0-5的随机数1个,但是同事在没有更改方法名的情况下,改成了方法返回6-9的随机数1个。如果拉回同事提交的版本库,应用该方法后,就会出现程序逻辑错误。

解决办法:首先我们在使用获取一个副本支的方式更好,避免了这一问题,如果冲突,我们可以获取版本后,使用恢复功能,或修改冲突再提交。沟通很重要,一般这种BUG都是事先没有沟通好。

(2)树冲突

产生原因:两个人同时修改一个文件名

解决办法:其中一个人获取新版本,然后删除自己改过名的文件,双方协商好用什么名字,再由其中一人更改,另一人获取新版本即可。

(3)内容冲突

产生原因:两个人同时改了同一文件的同一位置内容

解决办法:提交文件产生这种冲突时,我们利用文件差异比较,查看两个文件内容冲突的位置手动更改,然后推送到服务器。

12. 分支管理策略

Git在分支创建和合并上为我们带来前所未有的便利,同时版本四处开花,分支遍地,很容易让初次使用者找不到主干发展方向。这就需要我们学习一下工作流,Git的工作流网上有很多大神介绍,本篇文章不能一一列举了。但是Vincent Driessen的分支管理策略得到了众多支持者。我们分享一下他的成果。

他的策略可以使版本库演进保持简洁、主干清晰、分支各司其职。

(1) Master分支(主分支)

首先,代码库应该有一个、且仅有一个主分支。所有提供给用户使用的正式版本,都在这个主分支上发布。Git主分支的名字,默认叫做Master。它是自动建立的,版本库初始化以后,默认就是在主分支在进行开发。我们可以给主分支上的每个版本库打上tag,为了更好的管理。

(2)开发分支Develop

主分支只用来分布重大版本,日常开发应该在另一条分支上完成。我们把开发用的分支,叫做Develop。

如果想正式对外发布,就在Master分支上,对Develop分支进行”合并”(merge)。

(3)临时性分支

前面讲到版本库的两条主要分支:Master和Develop。前者用于正式发布,

后者用于日常开

发。其实,常设分支只需要这两条就够了,不需要其他了。但是,除了常设分支以外,还有一些临时性分支,用于应对一些特定目的的版本开发。临时性分支主要有三种: * 功能(feature)分支

* 预发布(release)分支

* 修补bug(fixbug)分支

这三种分支都属于临时性需要,使用完以后,应该删除,使得代码库的常设分支始终只有Master和Develop。

功能分支

第一种是功能分支,它是为了开发某种特定功能,从Develop分支上面分出来的。开发完成后,要再并入Develop。

预发布分支

第二种是预发布分支,它是指发布正式版本之前(即合并到Master分支之前),我们可能需要有一个预发布的版本进行测试。

预发布分支是从Develop分支上面分出来的,预发布结束以后,必须合并进Develop和Master分支。它的命名,可以采用release-*的形式。

修补Bug分支

最后一种是修补bug分支。软件正式发布以后,难免会出现bug。这时就需要创建一个分支,进行bug修补。修补bug分支是从Master分支上面分出来的。修补结束以后,再合并进Master和Develop分支。它的命名,可以采用fixbug-*的形式。

合并完成以后的修补Bug分支要删除的。

对于分支管理策略,我推荐一篇文章,可以参考一下:http://www.cnblogs.com/cnblogsfans/p/5075073.html

13. 本篇要点

本篇主要介绍了Git的分支、合并、分支切换、差异比较、冲突解决等,使用TortoiseGit界面化的客户端工具,让我们在使用过程中更加简单了,先理解了Git的工作流程和使用方法,再慢慢了解一下命令行,也是不错的。其实界面化的工具每一步指令的本质还是命令行。在写这篇文章的同时,我也参考了很多博客,在此表示感谢。TortoiseGit还有很多功能没有一一介绍,相信有了本篇的基础,上手不是难事了。下一篇我会继续介绍如何在Visual Studio 2015/2013中使用Git进行版本控制,敬请关注。

==============================================================================================

返回目录

<如果对你有帮助,记得点一下推荐哦,如有有不明白或错误之处,请多交流>

<对本系列文章阅读有困难的朋友,请先看《.net 面向对象编程基础》>

<转载声明:技术需要共享精神,欢迎转载本博客中的文章,但请注明版权及URL>

.NET 技术交流群:467189533

==============================================================================================

时间: 2024-09-29 18:15:53

[.net 面向对象程序设计进阶] (26) 团队开发利器(五)分布式版本控制系统Git——图形化Git客户端工具TortoiseGit的相关文章

[.net 面向对象程序设计进阶] (23) 团队开发利器(二)优秀的版本控制工具SVN(上)

[.net 面向对象程序设计进阶] (23) 团队开发利器(二)优秀的版本控制工具SVN(上) 本篇导读: 上篇介绍了常用的代码管理工具VSS,看了一下评论,很多同学深恶痛绝,有的甚至因为公司使用VSS离职的.其实使用什么代码管理工具要看项目而定.毕竟使用何用代码管理工具,是项目管理者根据需要来决定的,如果你是一个开发人员,首先要让自己的技术精进一点.下面根据我个人理解,把这几种常见的代码管理工具使用场景简单介绍一下. 1.几种代理管理工具的适用场景 A.如果你的项目是5-6人的小团队,那么使用

[.net 面向对象程序设计进阶] (25) 团队开发利器(四)分布式版本控制系统Git——使用GitStack+TortoiseGit 图形界面搭建Git环境【转】

转自:http://www.cnblogs.com/yubinfeng/p/5182271.html 前面介绍了两款代码管理工具VSS和SVN,这两种管理工具在很长一段时间曾为我们的代码管理提供了便利,本篇介绍一款思维方式完全不同(也可以说不合常理)的版本控制系统——Git.可以说Git目前非常火,这与设计者剑指偏锋的设计思想有很大关系.Git采用发散的思维管理代码,最大的特点就是分布式,他可以让来自不同地区的开发者共同完成一个作品,让每个开发者都可以发挥个性,同时又可以由发起者(即项目管理者)

[.net 面向对象程序设计进阶] (1) 开篇

[.net 面向对象程序设计进阶] (1) 开篇 上一系列文章<.net 面向对象编程基础>写完后,很多小伙伴们希望我有时间再写一点进阶的文章,于是有了这个系列文章.这一系列的文章中, 对于.net 基础的一些知识,推荐小伙伴们阅读一下我上一系列文章<.net 面向对象编程基础> ,也就是说本篇文章在阅读前,最好是掌握了.net 的基础知识. 首先,“.net 面向对象程序设计进阶”这一系列的文章涉及的范围比较广,每一节相当于.net的一个分支,基本可以作为一个独立的课题了.只所以

[.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) JSON序列化利器 Newtonsoft.Json 及 通用Json类

[.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) JSON序列化利器 Newtonsoft.Json 及 通用Json类 本节导读: 关于JSON序列化,不能不了解Json.net(Newtonsoft.Json)这款世界级的开源类库,除了拥有良好的性能之外,功能也是非常强大的. 本节会详细说明这个类库.此外,对于不喜欢使用第三方类库的同学,会整理一个基于微软类库的通用Json类. 读前必备: 本节主要介绍一款第三方类库和一个自己整理封装的类库,说起到封装

[.net&#160;面向对象程序设计进阶] (9) 序列化(Serialization) (一) 二进制流序列化

[.net 面向对象程序设计进阶]  (9)  序列化(Serialization) (一) 二进制流序列化 本节导读: 在.NET编程中,经常面向对象处理完以后要转换成另一种格式传输或存储,这种将对象转向其他数据格式的过程,即序列化(Serialization). 与之相反的过程就是反序列化(Deserialization).掌握和利用好序列化和反序列化的方法,对提高面向编程技术很有益处. 读前必备: A.类和类的实例  [.net 面向对象编程基础]  (9) 类和类的实例  B.类的成员

[.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口IXmlSerializable实现XML序列化及XML通用类

[.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口IXmlSerializable实现XML序列化及XML通用类 本节导读:本节主要介绍通过序列化接口IXmlSerializable实现XML序列化和反序列化,整理了XML基础操作及序列化的通用类(包括XML及节点的基础读写操作,XML到DataSet\DataTable互转换操作,XML序列化及反序列化通用方法等). 读前必备: A.类和类的实例 [.net 面向对象编程基础]  (9) 类和类的

[.net 面向对象程序设计进阶] (2) 正则表达式(一)

[.net 面向对象程序设计进阶] (2) 正则表达式(一) 1.什么是正则表达式? 1.1正则表达式概念 正则表达式,又称正则表示法,英文名:Regular Expression(简写为regex.regexp或RE),是计算机科学的一个重要概念.他是用一种数学算法来解决计算机程序中的文本检索.区配等问题. 1.2正则表达式语言支持  正则表达式其实与语言无关,在很多语言中都提供了支持 ,包括最常用的脚本语言Javascript.当然C#语言也毫不例外的提供了很好的支持.     正则表达式语

[.net 面向对象程序设计进阶] (19) 异步(Asynchronous ) 使用异步创建快速响应和可伸缩性的应用程序

[.net 面向对象程序设计进阶] (19) 异步(Asynchronous) 使用异步创建快速响应和可伸缩性的应用程序 本节导读: 本节主要说明使用异步进行程序设计的优缺点及如何通过异步编程. 使用传统方法BeginInvoke / EndInvoke来实现异步. 使用async/await 创建异步方法和事件. 通过异步编程创建具有快速响应和可伸缩性的应用程序. 读前必备: A.委托 [.net 面向对象编程基础]  (21) 委托 B.事件 [.net 面向对象编程基础] (22)事件 1

[.net 面向对象程序设计进阶] (5) Lamda表达式(二) 表达式树快速入门

[.net 面向对象程序设计进阶] (6) Lamda表达式(二) 表达式树快速入门 本节导读: 认识表达式树(Expression Tree),学习使用Lambda创建表达式树,解析表达式树. 学习表达式在程序设计中的优点:比如构造动态查询.动态构造表达式树完成未知对象属性访问,比反射的性能高出很多.我们可以说表达式树才是Lambda的精髓,是我们必须要熟练掌握并灵活运用的. 1.关于表达式树(Expression Tree) 表达式树以树形数据结构表示代码,其中每一个节点都是一种表达式,比如