【干货】一篇文章让你入门git
码农天地 -声明:虽略有标题党嫌疑,但我相信文章内容能对你有所帮助
一、背景Git是一个强大的分布式版本管理系统,它的好处这里不再赘述。但由于其基于命令行操作,且原理和流程又很不明晰,导致新手很难快速理解和上手使用。这次软工课程的实训,正好要求使用Git进行协同开发,这也是一个程序员必须要掌握的技能。但我发现包括我在内有许多人都不熟悉Git的操作,不明白其中的原理,没法享受到Git协同开发的便利高效。这既没有抓住主要矛盾,浪费时间在实践工具的学习使用;又会对之后的实践部分造成困扰,拖慢开发进度。
为了彻底搞明白Git的原理和操作流程,我查阅了大量技术博客,并多次实践弄清分支对应关系。现在我打算将Git的原理用通俗易懂的语言和简单明了的图片表达出来,既记录我个人的经验总结,也希望能帮到对Git懵懵懂懂的同志。
注意:本文旨在解释原理和操作流程,并不涉及具体命令和参数,请自行上网查阅!
二、原理解释(一)本地分支相信你已经知道本地版本库的结构了:_工作区_(当前工作的目录)、_暂存区_(从工作区add至此,暂存修改)、_版本库_(commit提交暂存区内容,即保存修改)。直接说重点:
把整个分支看作单链表,每个节点是一次commit该链表有一个“队首指针”指向最新的commit,即“分支名”,用来标记该分支的开发进度【言外之意可以有多个“队首指针”指向不同的最新节点】还有一个“指针的指针”【HEAD】指向“队首指针”,表明当前处在哪一个分支上以上内容搭配下图食用风味更佳:
* _该本地版本库有3个分支,目前处在master分支上_*
相信你已经豁然开朗了~
这就是为什么Git可以”版本管理”:它相当于记录了每次切换分支的位置,可以让我们在不同分支上干活而不相互影响。所以使用Git既可以回退之前的开发进度,又可以新建分支而不影响现有进度。如果你还不明白,就想想_《复仇者联盟4》_的穿越理论吧:_回退过去并不意味着可以改变现在,而是开辟了新的时间分支!_
(二)远程和本地当你把远程仓库和本地仓库关联起来后,首先要明确几个概念:
跟踪分支:即本地分支,用户可写远程跟踪分支:即本地仓库对远程仓库中某个远程分支的状态的记录,以【(远程仓库名)/(分支名)】形式命名现在你可能不太明白,没关系,往下看——
1、git clone这里我们采用git clone的方式创建本地版本库。下面几张图请认真反复观看:
*clone前,远程仓库的状态*
* _clone后,本地仓库的状态_*
本地会有一个orgin/master的远程跟踪分支,即为关联时对远程分支的快照,记录了那个时刻远程分支的进度你可以在跟踪分支(本地分支)master上肆意修改提交,对远程分支和远程跟踪分支都没有影响,因为远程跟踪分支只与远程分支有关当你push后,Git先把远程分支变得和本地分支一样,再把远程跟踪分支变得和远程分支一样一句话总结:本地保存的远程跟踪分支做到了本地和远程的关联,让本地开发与远程暂时无关,也为仓库分支间的上传、拉取等操作做好准备。
2、git pull可能有人要问了:当你在本地开发时,远程分支被其他人修改了怎么办呢?【注:远程跟踪分支只记录你自己的修改】
问得好!所以我们在commit后、push前,应该先用pull把远程跟踪分支的状态刷新一下
但是pull = fetch + merge(强烈建议用后者而不用前者!!!),这之间又有什么区别呢?请看下图:
_图1 远程被别人修改了_*_图2 fetch一下,同步了远程与其跟踪分支的状态_*_图3 如果没有冲突,则merge,让本地和远程一样_*【注:Git很智能,如果合并时有冲突,则会让你手动解决。这里有介绍具体方法。】
而pull的操作相当于一步到位,直接把图1变成了图3。所以缺点也显而易见:如果有冲突会很麻烦。建议大家一步步来!
(三)个人感想相信大家看到这里,应该对Git的原理和操作流程有了很清晰的认识,明白了为什么用Git协同开发会很方便高效。虽然我的认识和总结还很浅显,但应对目前的任务应该没有太大问题了!
三、实践操作既然弄明白了原理,那就来上手实操一下吧!
目前实践一的要求,是组长组员两个人协同开发:组长负责维护开发分支dev,组员向dev上传提交;当dev测试合适后,组长有唯一权限向master上传作为最终结果。
所以我的规划是:
远程仓库有master和dev两个分支组长本地有master和dev分支,分别关联对应的远程分支组员本地只有一个分支,关联远程dev分支【可以选择clone某一个远程分支到本地】具体开发流程是:
组长和组员分别在各自的本地dev分支开发,有阶段性成果后push到远程dev【若有冲突,可采用前面所讲的方法解决冲突再合并】当开发完成、结果稳定后,组长将本地的master和dev分支merge,再把master分支push上去大家可以采用我这种开发流程,逻辑还是比较清晰的。当然如果你有更好的方法或者更简单的操作,也可以留言一起讨论。
不过我还是建议大家用git bash命令行完成这些操作,毕竟图形化界面不能选择参数,没法完全掌握git的用法。把命令行玩6了会非常帅气~
四、总结搞明白Git工具的原理和操作流程,可以让我们更好地使用工具去协同开发,把精力主要放在项目本身,而不用浪费在工具的学习使用上。建立逻辑清晰的分支对应关系,可以更好管理整个项目的开发进度和任务分配,把协同开发的优势最大化。希望同志们可以有所收获,一起交流学习。