[Git 概念]分支? 提交?推送?标签? 一文说清Git中的那些概念

102 阅读6分钟

本节课介绍了Git中最常见的概念,包括仓库、远程、暂存区、主干、分支、提交、标签等。

使用Git的过程中,我们经常会听到很多名词,比如远程、本地、暂存区、主干、分支、标签。那么这些都表示什么含义呢?今天我们就把这些名词讲清楚。了解这些概念,对于我们后面的学习,以及以后的协作沟通都很重要。

仓库(repository)

前面我们讲过Git是分布式版本管理系统。分布式的重点,就是说每一位程序员的本地机器上都有一套完整的代码仓库。Git的代码提交操作都是先提交到本地的仓库。所以这里就会有两个概念,一个是远程仓库,一个是本地仓库

因为有了本地、远程的区别,所以本地仓库和远程仓库之间要做代码同步。把远程仓库同步代码到本地仓库就是拉取,把本地代码仓库同步到远程仓库那就是推送。

  • 仓库:或者叫代码仓库,就是指管理你当前项目的代码的仓库。里面包含了所有的代码改动历史,发布历史等信息。
  • 远程:或者叫远程仓库(remote,默认名叫origin),就是位于服务器上代码仓库。可以通过git clonegit fetchgit pull等命令来拉取或者同步远程仓库的代码到本地仓库。
  • 本地:或叫本地仓库(local),就是位于你本地开发机器上的代码仓库。可以通过git push来推送代码都远程仓库。
  • 拉取:同步远程仓库代码到本地仓库。使用git clonegit fetchgit pull来完成操作。
  • 推送:同步本地仓库到远程仓库。使用git push来完成操作。

3.1.png

提交(commit)

第一节课中,我们讲过,版本管理系统需要主动提交。Git中,每一次主动提交都是一个commit。Git是通过提交(commit)来管理代码改动。本地修改完成代码后,需要主动提交代码。这里提交代码,是先把代码放到暂存区,然后才能创建新的commit提交到分组。过程如下图:

3.2.png

如图所示,当你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的概念。

  • HEADHEAD是当前分支引用的指针,它总是指向某次commit,默认是上一次的commit。 这表示HEAD将是下一次提交的父结点。

3.3.png

上图中,每一个圈都代表一个提交。dev分支从主干分支拉出来后,又有了两个提交。当前本地分支是dev分支(HEAD指向dev分支的最新commit)。

合并(merge)

完成开发后我们需要把dev分支合并(merge)回主干分支(master)。

如果我们可以在master分支上,合并dev分支。如果发生了代码冲突,就需要在master上解决后再次commit。 前面我们说过不允许在master上直接修改代码。所以不能直接在master分支合并dev分支。

那怎么办呢,我们需要先把master合并到dev分支。在解决冲突之后,再把dev合并到master

3.4.png

标签(tag)

如果我们已经完成了功能的开发,并且测试通过,没有bug。现在需要做软件新版本的发布,我们会对最后一个commit上打一个标签(tag),表示重要,一般会用于标记发布结点。 拿上面的流程举例。我们完成合并后,可以对5这个commit打一个tag v1.1.0。后续会根据这个tag来做正式包的打包发布,正式包的版本就是1.1.0tag名字看公司约定,这里的v1.1.0只是举例)。

3.5.png

总结

好了,基本概念讲完了,这里复习下,看看下面这几句话,能不能明白在说什么。

  • 我把我最新的代码推送到远程仓库了,你拉取下最新代码。
  • 这个功能比较独立,你这边从dev/1.1.0上单独拉一个分支来开发。
  • 代码自测完成了,就合并dev/1.1.0上,我们提测。
  • tag,准备打包发布。

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 10 天,点击查看活动详情