大家好,欢迎来到停止重构的频道。
本期我们讨论Git。
Git是开源的版本控制系统,常用于代码管理、文件管理等场景。
需要提前说明的是,本期只讨论Git本身,至于实际项目中多人合作、多版本管理等问题。
实际上是团队工作流的问题,我们将在下一期展开。
提纲我们按以下顺序展开讨论
1、Git介绍
2、Git工作原理
、Git服务端、客户端安装
4、Git常用操作
Git介绍首先介绍Git,Git是一个开源的版本控制系统,常用于代码管理等场景。
简单地说,可以将Git理解为存储文件的仓库,方便多个用户将文件集中存储到服务器中,或从服务器下载文件副本到本地磁盘。
文件的类型不受限制,可以是代码等文本文件,也可以是图片、视频等媒体文件。
当然,Git服务并不是简单地存储文件,它会记录每一次文件修改。用户可翻看历史版本的文件,或者删除某些历史修改以还原文件。
这也称为版本管理。
虽然听上去版本管理没有太大的作用,但是在多人参与或长时间开发的软件项目下,版本管理是必要的。
例如,在实际开发过程中,会经常出现一些功能回退。就是以前好用的,现在却出现BUG的情况。
通过翻看代码文件的历史版本,可较快速地定位哪次修改影响了这个功能,也能知道团队中哪个人做了这次修改。
当然,能做文件版本管理的当然不只有Git。
SVN也可以,不过,一般都认为Git是优于SVN的。毕竟Git的作者是因为受不了SVN才编写了Git。
相对于SVN,Git允许分布式部署。另外,Git需要的存储空间也会相对少一些,Git是按元数据存储的,而SVN则是按文件存储。
最重要的,Git服务是一个系统核心,用户可选择功能更加丰富的平台服务,如GitHub、Gitlab。
那么,Git、Gitlab、GitHub是什么关系呢。
Git可以理解为系统核心,是没有界面的。
Gitlab、GitHub是在Git基础上建设的平台,里面包含Git服务,这些平台拥有更加完善的后台管理网站。也拥有更加丰富的功能,如项目管理、版本视图、权限管理等。
所以我们一般不直接使用或部署Git服务,而是使用功能更加完善的Gitlab、GitHub平台服务,其中Gitlab支持私有化部署。
Git工作原理接下来是Git的工作原理。
Git是c/s(客户端-服务端)架构的服务,整体结构分4个部分:远程服务、远程仓库、本地Git客户端软件、本地仓库副本。
远程服务是Git的服务端,更具体的说,就是Gitlab、GitHub等平台,或者是自己在服务器安装的Gitlab。
远程服务接受文件获取、上传等请求,并记录每个文件的修改。用户可通过远程服务提供的管理网站管理仓库、历史修改等。
远程服务端的文件是按仓库为单位存储的,用户可创建多个仓库,一个仓库可以简单地理解为一个文件夹,一个仓库下允许存储多个文件、创建多级文件夹目录。
且文件的类型不受限制,可以是代码等文本文件,也可以是图片、视频等媒体文件。
本地Git客户端是安装在本地的软件,Git客户端是同步远程仓库与本地仓库副本的关键。
用户需要通过Git客户端,从远程服务端克隆、更新本地仓库副本。也需要通过Git客户端,才能将本地仓库副本的修改同步到远程仓库。
本地仓库副本对应远程服务端中的一个仓库,实质上是根据远程仓库克隆到本地磁盘的一个文件夹。
文件夹内的文件对应远程仓库的文件,文件夹内的文件是可以自由操作的,跟普通的文件操作没有区别。
本地仓库副本对比普通的文件夹,只是多了一个.git的隐藏文件夹。里面会记录远程仓库信息、日志、未提交远程仓库的记录等。
Git客户端、服务端安装接下来是Git服务端、客户端安装。
Git服务端的话,可以是GitHub、Gitlab等平台,如果希望私有化部署Git服务的话,推荐以docker的形式安装Gitlab。
安装命令如图所示,如果对docker不太熟悉,可以翻看往期内容。
另外,如果担心私有化部署有磁盘损坏风险的话,Gitlab也支持集群化部署、第三方平台仓库备份等,这里不作展开。
而Git客户端是每个用户都需要安装的,Git客户端通常是命令行工具。
当然,也可以选择有图形界面的Git客户端软件,如GitHubdesktop、Fork等。
另外,一些代码编辑软件是集成Git客户端的,如Vscode。使用这些代码编辑软件的话,可以不安装额外的Git客户端。
Git常用操作接下来是Git的常用操作,我们将Git常用操作根据操作顺序分为:
1、新建项目、项目管理
2、克隆、更新项目
、上传本地修改
操作:新建、管理远程仓库首先是新建、管理远程仓库。
虽然Git客户端也可以完成这一操作,但是操作起来比较麻烦,所以一般新建、管理仓库都在服务端提供的管理网站完成。
以Gitlab为例,在后台管理页面即可新建远程仓库。
关于远程仓库管理,有几个点需要特别说明,分别是修改记录、分支、tag、权限。
修改记录是每次上传更新的记录,每个修改记录都有唯一的修改记录id,一个修改记录可能包含多个文件的修改。
用户可以查看单次修改的具体内容,也可以对此次修改进行回滚操作。
回滚操作实际上是新提交一次更新以复原修改,但是回滚的修改记录不是最新修改记录的话,则会可能由于修改冲突而失败。这时候则需要人工修改再提交远程仓库。
分支是一个远程仓库内的多个独立副本,每个分支都是完全独立互不影响的,包括文件、修改记录等都是完全独立的。
一个远程仓库默认有一个主分支,默认情况下,文件会存储到主分支。
用户创建新分支时,需要基于某个修改记录、某个分支、或者某个tag才能创建。
一个分支的多次修改可一次全部更新到别的分支,称为合并。
合并操作实际上是对目标分支提交一次新修改,但是如果目标分支也修改过某个文件,则可能由于修改冲突而失败,这时候也需要通过人工修改文件更新到目标分支。
tag是一个标识,用于标记某个修改记录。
便于归档对应分支下截止到此次修改的文件,防止因为修改记录太多而造成混乱,方便版本迭代管理。
tag与分支是不同的,tag只是标记修改记录方便查看,是不允许更新操作的,而分支是一个独立的副本,允许更新文件。
最后,管理员可对仓库进行用户权限管理,包括查看、文件修改、仓库管理等权限。
操作:克隆、更新本地副本接下来是关于本地仓库副本的克隆、更新操作。
当需要拉取某个远程仓库的文件到本地时,需要先在管理页面获取远程仓库的克隆地址,然后使用git客户端将远程仓库克隆到本地。克隆命令如图所示。
当然也可以使用Githubdesktop等软件进行操作,操作原理是一样的。
顺便一提,如果仅仅是为了方便查看远程仓库的文件,可以直接从管理页面下载文件压缩包。
但是直接下载文件压缩包的话,是不支持后续更新、上传操作的。
默认情况下,克隆的是远程仓库的主分支,如果希望切换别的分支,可以通过git客户端切换分支。
切换分支后,本地仓库副本中的文件将会改变。
值得注意的是,如果当前仓库副本中的文件被修改了且未提交,则不能切换分支。如果需要使用一个远程仓库的多个分支的代码,建议克隆多个本地仓库副本。
如果远程仓库的文件被别的用户更新了,可通过更新操作更新本地仓库副本的文件。
但是如果恰巧需要更新的文件本地也修改了,则会发生更新冲突而更新失败。
发生更新冲突时,可以通过gitstash命令暂存本地修改,更新完毕后再恢复本地修改,git将会把更新冲突的内容标记出来。后续需要人工处理这些更新冲突的内容。
当然,发生更新冲突时,也可以克隆一份新的本地仓库副本,再通过beyond
转载请注明:http://www.0431gb208.com/sjszlff/9144.html