本人之前使用的版本控制工具是SVN,最近换成了Git,总结一下Git过程的使用经验,总结教训。
版本控制工具历史
- 版本控制工具起源:diff和patch
- 最早的本地版本控制工具:RCS(Revision Control System)
- 集中式版本控制工具:
- SVN(Subversion):用于取代CVS(Concurrent Versions System)的更好用的版本控制系统。不适合跨地域的协作式开发,不适合对代码高质量追求和代码门禁,其操作依赖服务器,可以用于word这类二进制文件的版本控制,适合人数不多的项目。
- 分布式版本控制工具:
- Git, 2005年诞生。Git不适合word这类二进制文件的版本控制,由于需要整体的读授权,其不能将读授权精细到目录级别。适合分布式开发和移动办公。Git和其他版本控制工具的主要差别在于Git对待数据的方式。其他版本控制工具记录的是差异,而Git记录的是快照,即把数据看做是对文件系统的一组快照。提交和保存项目,Git会对当时的全部文件制造快照并保存快照索引。Git在实际使用中,主要用于对代码仓代码进行管理。
- TortoiseGit:Windows系统下的开源Git图形化操作工具。TortoiseGit支持多种语言, TortoiseGit下载链接:https://tortoisegit.org/download/#Language_Packs
Git安装配置
- Linux安装:两种安装方式(包管理器安装和源代码安装)
- 包管理器安装命令如下(以Ubuntu为例):
sudo aptitude install git (必装软件包)
sudo aptitude install git-doc git-svn git-email gitk (依赖不同,需要单独安装) - Linux可以通过bash-completion软件包实现命令补齐功能,具体设置可以看Git安装及使用
- Windows安装:Git官方网站下载安装和安装GitHub Desktop(包含图形化和命令行版本的Git)
- macOS安装: macOS Git安装程序
Git安装后一般还需要配置,才能和代码仓配合,用于代码的版本管理,该配置比较繁琐,配置时建议和有经验的人一起弄,配置好后一般不需要再改动,为防止遗忘,建议配置过程整理文档保存。
配置设置
- 配置分类:系统配置(–system)、用户配置(–global)和仓库配置(–local),查看配置命令:git config
- 配置流程:配置个人身份(用户名和邮箱)->换行符文本配置(重点在于不同系统之间的差异)->文本编码配置(使用UTF-8编码)->服务器认证配置(一般是线上代码仓,协议认证方式和公钥),配置详情请看Git安装及使用
Git概念
| 区域和状态 | 中文名称 | 英文名称 | 用途 |
|---|---|---|---|
| 工程区域 | 工作区 | Working Directory | 日常使用文件所在文件夹 |
| 工程区域 | 暂存区 | stage | 索引,在工程根目录.git/index文件夹中 |
| 工程区域 | 版本库 | Repository | 本地仓库,工作区中隐藏的目录文件夹.git,用于存放工程所有版本数据 |
| 文件状态 | 已修改 | modified | 修改文件,文件未提交保存 |
| 文件状态 | 已暂存 | staged | 已修改文件已放在将要保存的清单中 |
| 文件状态 | 已提交 | committed | 文件已保存在本地数据库中 |
Git常用命令字典
| 用途 | 命令 | 解释 |
|---|---|---|
| 工程准备 | git init 项目名或工程名 | 在本地目录下自动生成名为.git的目录,做为项目仓库。当前项目所在目录纳入Git管理,.git目录默认不可见 |
| 工程准备 | git clone url链接 / git lfs clone url链接 | 将远端工程或项目克隆到本地磁盘,使用前提是要有该工程或项目的查看下载权限 |
| 工作区查看 | git diff 文件名 文件名 | 比较项目中任意两个节点/分支/索引的差异,在diff后添加–name-status参数,可以查看文件列表 |
| 工作区查看 | git status | 查看工作目录和暂存区状态,change to be committed(已暂存)、changes not staged for commit(未暂存)、untracked file(未被跟踪) |
| 新增文件到暂存区 | git add文件名 | 如果文件未被git跟踪,则需要先执行git add后,文件添加到暂存区后,再执行提交 |
| 删除在暂存区的文件 | git rm 文件名 | 将文件从当前分支的暂存区中删除,也可理解为从当前分支的下一步提交快照中删除,删除后文件将脱离git跟踪,不受git工程管理 |
| 文件移动和重命名 | git mv 文件名 新目录名/新文件名 | 将文件从当前目录移动到新目录,或者将当前文件重新命名为新文件名 |
| 提交修改文件 | git commit 文件名 -m “提交描述信息” | 暂存区文件改动提交到本地版本库中,提交的是本地动作,本地版本库记录改动,远端服务器不受影响 |
| 提交所有文件 | git commit -am “提交描述信息” | 一次提交所有暂存区改动文件到本地版本库中 |
| 查看日志 | git log | 查看提交历史,可配置不同参数,按提交时间由近及远列出提交历史日志,包括提交ID、作者、提交时间、提交描述等 |
| 推送到远端仓库分支 | git push origin 本地分支名:远端分支名 | 在git commit命令之后,将本地分支内容推送到远端分支上 |
| 撤销操作 | git reset commit_id | 撤销工作区中的git add/commit操作,将工作区内容回退到历史提交的commit_id节点,可配置参数 |
| 回退操作 | git checkout . / -文件名/ commit_id | 回退本地所有修改而未提交的文件内容,取消所有本地工作区修改,使用-文件名,可回退某个单一文件的未提交改动,使用commit_id回退某个提交版本 |
Git分支管理
- 分支类型:
分支类型 特征名称 功能 主分支 master/main 常用,存储生产代码 开发分支 develop 常用,存储即将发布的代码,常用于开发人员开发使用 发布分支 release 常用,上线分支,准备发布上线使用 功能分支 feature 用于开发新功能 热修复分支 hotfix 用于紧急修复生产问题 - 分支管理命令:
用途 命令 git branch /-r/-a 查看本地工程的所有Git分支,-r查看远端服务器上的所有分支,-a查看远端+本地工程所有分支,”*”表示当前工作区所在分支 git branch 新分支名 基于当前分支节点创建新分支,不会切换到新分支,而使用git checkout -b 新分支名则可以切换到新分支 git branch -d/-D 分支名 删除本地分支,-D表示强制删除情况,也可搭配参数删除远程分支 git checkout 分支名 切换检出分支,-f可以强制切换分支 git fetch origin 远端分支:本地分支 分支更新,从远端服务器获取远端分支后,对本地仓库里的本地分支进行更新 git merge/rebase 分支名 分支合并,从指定分支合并到当前分支 git pull origin 远端分支:本地分支 分支合并,从远端服务器获取远端分支后,和本地分支进行自动合并
参考文献
[1] Git中文网
[2] TortoiseGit官网
[3] Git安装及使用
[4] Git教程