本节课介绍了Git中最常见的概念,包括仓库、远程、暂存区、主干、分支、提交、标签等。
使用Git的过程中,我们经常会听到很多名词,比如远程、本地、暂存区、主干、分支、标签。那么这些都表示什么含义呢?今天我们就把这些名词讲清楚。了解这些概念,对于我们后面的学习,以及以后的协作沟通都很重要。
仓库(repository)
前面我们讲过Git是分布式版本管理系统。分布式的重点,就是说每一位程序员的本地机器上都有一套完整的代码仓库。Git的代码提交操作都是先提交到本地的仓库。所以这里就会有两个概念,一个是远程仓库,一个是本地仓库。
因为有了本地、远程的区别,所以本地仓库和远程仓库之间要做代码同步。把远程仓库同步代码到本地仓库就是拉取,把本地代码仓库同步到远程仓库那就是推送。
- 仓库:或者叫代码仓库,就是指管理你当前项目的代码的仓库。里面包含了所有的代码改动历史,发布历史等信息。
- 远程:或者叫远程仓库(
remote
,默认名叫origin
),就是位于服务器上代码仓库。可以通过git clone
,git fetch
,git pull
等命令来拉取或者同步远程仓库的代码到本地仓库。 - 本地:或叫本地仓库(
local
),就是位于你本地开发机器上的代码仓库。可以通过git push
来推送代码都远程仓库。 - 拉取:同步远程仓库代码到本地仓库。使用
git clone
,git fetch
,git pull
来完成操作。 - 推送:同步本地仓库到远程仓库。使用
git push
来完成操作。
提交(commit)
第一节课中,我们讲过,版本管理系统需要主动提交。Git中,每一次主动提交都是一个commit
。Git是通过提交(commit
)来管理代码改动。本地修改完成代码后,需要主动提交代码。这里提交代码,是先把代码放到暂存区,然后才能创建新的commit
提交到分组。过程如下图:
如图所示,当你checkout
一个分支的时候,它会把当前分支的最新commit
,放在你的本地文件。修改完代码之后,如果要创建新的commit
,那么你需要先通过git add
将你的本地修改提交到暂存区,然后通过git commit
把暂存区的文件创建为新的commit
。当然也可以通过git commit -a
来一步到位,直接完成两个命令的动作。新创建的commit
,就会成为当前分支的最新提交。
分支(branch)
我们在开发某一个功能的时候,会从主干拉一个开发分支出来。这个功能的代码改动都会提交到这个开发分支上。
这里的主干是指当你创建一个仓库的时候,仓库会创建一个默认的分支,这个默认分支就是主干分支,一般叫做master
。(主干分支后期是可以修改的,不过一般不会修改。除非当前的项目出现了两个不兼容的版本,比如叫v1.0版本,v2.0版本。那么仓库就需要同时维护这两个功能版本。我们就会创建两个主干分支,比如叫 master1、master2,分别维护两个版本的代码。所以在大部分情况下,master就是主干分支。)
- 主干: 主干分支(一般是
master
分支)所有其他分支最后要合并到的分支,是项目功能已经发布了的分支。新功能开发,需要单独拉一个开发分组出来,不能直接在主干上面修改。主干不允许直接提交代码。 - 开发分支。就是进行具体某个项目迭代的分支。新功能的提交一般会先提交到某一个开发分支上,而不是直接提交到主干上,这样操作是为了避免主干分支的代码混乱。不同公司对开发分支的名字是有不同的约定的。比如叫
feature/xxxx
,或者叫dev/xxxx
。如果是修复某个bug
,比如叫fixbug/xxx
等。
本地通过git clone
拿到仓库代码后。可以通过git checkout
切换到已经创建好的开发分支。这里会有一个HEAD
的概念。
- HEAD。
HEAD
是当前分支引用的指针,它总是指向某次commit
,默认是上一次的commit
。 这表示HEAD
将是下一次提交的父结点。
上图中,每一个圈都代表一个提交。dev
分支从主干分支拉出来后,又有了两个提交。当前本地分支是dev
分支(HEAD
指向dev
分支的最新commit
)。
合并(merge)
完成开发后我们需要把dev
分支合并(merge
)回主干分支(master
)。
如果我们可以在master
分支上,合并dev
分支。如果发生了代码冲突,就需要在master
上解决后再次commit
。 前面我们说过不允许在master
上直接修改代码。所以不能直接在master
分支合并dev
分支。
那怎么办呢,我们需要先把master
合并到dev
分支。在解决冲突之后,再把dev
合并到master
。
标签(tag)
如果我们已经完成了功能的开发,并且测试通过,没有bug
。现在需要做软件新版本的发布,我们会对最后一个commit
上打一个标签(tag
),表示重要,一般会用于标记发布结点。
拿上面的流程举例。我们完成合并后,可以对5
这个commit
打一个tag
v1.1.0
。后续会根据这个tag
来做正式包的打包发布,正式包的版本就是1.1.0
(tag
名字看公司约定,这里的v1.1.0
只是举例)。
总结
好了,基本概念讲完了,这里复习下,看看下面这几句话,能不能明白在说什么。
- 我把我最新的代码推送到远程仓库了,你拉取下最新代码。
- 这个功能比较独立,你这边从
dev/1.1.0
上单独拉一个分支来开发。 - 代码自测完成了,就合并到
dev/1.1.0上
,我们提测。 - 打
tag
,准备打包发布。
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 10 天,点击查看活动详情