git快速入门教程

    前阵子花了一点时间学习git,完成了从小白到菜鸟的阶段。下面,通过这篇文章分享一下我的一些学习心得。

一 推荐资料

1 pro git https://gitee.com/progit/

2 廖雪峰的教程 https://www.liaoxuefeng.com/wiki/896043488029600

    这两个资料要配合着看,git的基本原理和概念建议看pro git,里面的语言表述严禁且清晰,而且会配以准确的图片进行说明。然后可以快速过一遍廖雪峰的教程,作为补充。这些资料里面对于reset和rebase的用法介绍的不够详细,这两个命令建议单独谷歌搜索资料进行学习。

二 快速入门

     以下内容在上文所推荐的资料里面都能找到,本文重点讲解一些git的基本原理,基于上述资料加上自己的一点理解。

1 git的作用

(1)版本控制

    软件项目开发的过程中会有很多个版本,各种不同功能的版本及其各个历史版本,因此需要管理项目的各种版本。

    git基于文件快照技术(snapshot),可以以很小的文件体积保存各个版本的项目文件(比起把每一个版本的全量项目文件全都保存下来,要小得多),每一个版本对应一个文件快照。

(2)开发管理

    git基于分支的概念,可以便于项目的管理。

    git是分布式的版本管理系统,每个开发者将可以将整个工程克隆到本地进行开发,开发完成之后再提交到远程服务器上。

2 git基本运行逻辑

    将一个项目交托给git管理后,git会跟踪项目文件的变化。可以随时把这些变化进行提交,提交完成后会git会记录下这次提交完成后的项目状态(也就是一个版本),会有一个对应的id值,可以很容易地把项目切换到任何一个版本状态上。


git版本管理原理

3 指针的概念

    git通过一种类似链表的形式管理版本,每一次提交(可以理解为一个版本)对应一个节点。当前的开发环境有一个指针(HEAD),可以通过改变这个指针到指向的节点,就可以切回到该版本。一般HEAD指针与当前指向当前所在分支的最新节点,不过也可以强行将HEAD与分支最新节点分离。


指针

4 分支的概念

    假设没有任何分支,则只有一个主干分支(一般称为master),每次提交之后都会把新的提交节点加入到链表,并且把master指针指向最新的节点。


主分支

    分支就是,新建一个指针指向当前的节点(如图中的testing)。当你在该分支开发并进行提交的时候,会生成一个提交节点,并会把该提交节点接上去,最后把分支指针指向新的节点。


子分支


子分支提交

5 分支合并

    首先,这里强调,合并是有主动被动之分的,把“A合并到B”与把“B合并到A”是不一样的。假设目前工作在A分支上,然后就能把其它分支合并到A上。

    假设当前的分支结构如示意图1所示,要把hotfix合并到master,则把master指针指向hotfix指向的节点即可,如合并分支示意图2所示。由于hotfix就是master的前驱位置,则这种模式“Fast forward”。

         

合并分支示意图1

    

合并分支示意图2

    假设当前的分支结构如合并分支示意图3所示,则要把iss53合并到master则要复杂一些。首先,git会找到两个分支的共同祖先节点,如图中C2。然后把master与iss53所指向的节点(C4与C5)分别与C2做一个比较(diff),从而得出C4与C5对C2的“修改”(diff)。假设这两个修改没有冲突,则把这两个修改合并在一起,生成一个提交节点,然后再把master的指针指向新的节点,如合并分支示意图4所示。

合并分支示意图3


合并分支示意图4

6 冲突的定义

    个人感觉,这是上面推荐的资料里面最缺漏的地方,没有对“冲突”做一个定义,很容易让初学者困惑。

    冲突是基于diff的,合并的冲突实则上是diff的冲突。每一个diff会记录你的改动内容,假如两个diff之间的改动内容冲突了,则合并出现冲突。而这些冲突一般而言是改动的重叠,比如说A对一个文件修改了第五行,B对A文件同样修改了第五行,则出现冲突。

     前面讲合并的时候,已经有提到过。合并的时候,假设不能走“Fast forward”,则会把两个分支与其共同祖先分别做diff。然后假设两个diff之间与冲突,则出现合并冲突。

7 远程分支与本地分支的关系

    初始的时候,拉取一个远程分支到本地,会自动建立一个指向最新节点的远程分支指针和一个本地分支指针,如图所示。

远程分支与本地分支的关系

    当在本地开发并不断提交,本地指针则会不断向前走,与远程指针分离,如图的下半部分所示。与此同时,远程分支(服务器上的)可能已经有人进行了提交,这个时候的远程指针指向节点与远程分支的最新节点已经不是同一个了。

远程分支与本地分支的关系

    这个时候fetch远程分支到本地,则会把远程分支新的提交节点加载到本地,并把远程指针指向最新的节点,如图所示。如果用的是pull,则会多出的操作是,把本地的分支与新的远程分支进行合并。    

远程分支与本地分支的关系

你可能感兴趣的:(git快速入门教程)