【干货】一篇文章让你入门git

码农天地 -
【干货】一篇文章让你入门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工具的原理和操作流程,可以让我们更好地使用工具去协同开发,把精力主要放在项目本身,而不用浪费在工具的学习使用上。建立逻辑清晰的分支对应关系,可以更好管理整个项目的开发进度和任务分配,把协同开发的优势最大化。

希望同志们可以有所收获,一起交流学习。

特别申明:本文内容来源网络,版权归原作者所有,如有侵权请立即与我们联系(cy198701067573@163.com),我们将及时处理。

Tags 标签

加个好友,技术交流

1628738909466805.jpg