大河向东流
1879字约6分钟
Git
2024-06-29
作者:大河向东流
签名:愿头发如星辰,永不凋零于这片数据之海。
🐾 友情链接 🌵 CC BY-NC-ND 协议
随着软件开发行业的快速发展,版本控制系统(Version Control System,VCS)在日常的开发中扮演着重要的角色。而在众多版本控制系统中,Git以其分布式、高效、灵活的特性,及其强大的分支管理能力,极其适合多人协作开发。从而逐渐受到了全球开发者的关注,并成为了开发者的首选工具。
本文将从空间、工作流模型、状态、基础命令分别来叙述Git的基本概念。
Git仓库的空间分为工作区、暂存区、版本库/本地仓库、版本库/远程仓库,如下图所示。
工作区(workespace)就是项目所在的文件夹,且已初始化(git init)仓库。初始化后,项目目录下会存在一个隐藏文件夹(.git),相关暂存文件、版本库信息都会存储在该文件夹下,具体存储的文件形式的不必深究,掌握其概念、基础命令和可视化操作即可。
暂存区(stage/index)是用于存放文件的变动,关于一些文件的增删改的文件列表。且暂存区可以设置多个集合,以便存储不同的功能改动,避免在开发时将文件错误提交到版本库中。也可以将改动的代码暂存在本地中,需要的时候释放出来,例如调试配置文件。
Git具备分布式的特点,每个被版本控制的项目,本地都存在独立的仓库。用户可灵活创建分支,可以通过分支实现多种实际开发场景的合并需求。
相对于本地仓库来说,其可以拥有多个远程仓库,但大多数实际软件开发中,远程仓库只会有一个。
由于不同业务场景的复杂度不同,实际工作中所使用到的工作流模型有很多种,根据不同的业务场景,采取便捷、合适、可控的工作流模型即可。
最常见的工作流模型:
注意:在需求研发时,会创建大量的临时分支(feature, hotfix),随着新版本的上线,临时分支的生命周期也就结束了,过时分支应及时删除。
创建分支的时候,命名规则使用/
进行分隔,例如SourceTree、IDEA可视化软件查看分支的时候,可按照文件夹形式进行显示。
例:用户jack和rose需要在v1.1版本号上开发查询和删除需求,开发软件使用IDEA。
创建如下v1.1的feature分支:
开启可视化的分组显示功能,即可自动按照/
进行分隔:
按版本需求分配到人的时候,利用“廉价”的临时分支,再搭配commit、stash、unstash,可以灵活的在各个需求中随时切换、调试、开发。
已修改(Modified)状态包含对文件的新增、删除、修改,未添加控制。例如在IDEA的文件树中,文件名对应会显示成为绿色、灰色、蓝色、红色。
已暂存(Stage)状态只是对文件的两种状态进行区分,一种是已经加控制(git add),另一种是新增的文件,未被添加版本控制。像IDEA的暂存区,可以显示多个集合,以便于区分不同功能下的改动。
已提交(Commit)是将已暂存的文件提交至版本库。提交时,会附带作者、邮箱、描述、时间信息。
添加,将文件进行版本控制。
提交,提交到本地仓库。
推送,推送至远程仓库。
检出,将分支检出到本地。
合并,合并文件内容,解决冲突。
变基,将某功能分支上的多条提交记录,合并到主分支时,将多条记录变更为一条记录。
重置,将当前本地分支代码,重置为某一条提交记录,若代码没有推送至远程仓库,代码将会丢失。
回滚,将提交的某一条记录回滚。
获取,刷新远程所有分支记录,不会更新本地分支代码。
拉取,指定拉取某分支代码,至当前本地工作分支。
标签,对某一条记录打标签,例如版本的发布,远程仓库可以设置对标签的保护,以便于版本代码的检出。
存储,将暂存区中更改的文件存储到本地,并重置当前分支代码为变更前的文件。
释放存储,将存储区中存储的记录,进行释放。本地差异代码将会提示合并,便于存储一些临时代码或配置文件。
挑选合并,可挑选其他分支上某一条记录,合并到当前分支。
历史记录,查看当前文件的本地变更历史,方便调试代码时,回溯编码过程中的变更。
比较,与远程分支比较,可以查询出当前文件或文件夹在远程的所有历史更改版本。
差异合并,比较当前分支和指定分支的差异代码,配合get from batch,指定分支的代码拉取到本地。适用于将其他分支的部分代码,合并到当前分支。
一般在创建项目的时候,会在工程最外层文件夹下配置[.gitignore]文件,大多数git可视化工具,暂存区中的显示会自动忽略所配置的文件。
#
用于注释,\表示转义(如需使用实体\,则要加引号"")。*
可以匹配任何字符(0或多个)。?
可以匹配单个字符。(不可以匹配/)/
用于分隔目录: /
在开头时,表示从.gitignore文件所在的根目录开始匹配。/
在末尾时,只匹配目录及该目录下面的全部内容,否则同名的目录和文件都将匹配。!
开头的模式标识否定,该文件将会再次被包含,如果排除了该文件的父级目录,则使用!也不会再次被包含。[]
通常用于匹配一个字符列表,如:a[mn]z可匹配amz和anz。**
用于匹配多级目录,如a/**/b可匹配a/b,a/x/b,a/x/y/b。