一、Git基础
1、Git简介
定位:分布式版本控制系统(VCS)。
核心概念:数据仓库(Repository):记录文件或目录状态,存储内容修改历史;包括远程数据库(专用服务器,多人共享)和本地数据库(用户本地机器配置,个人使用)。
核心命令:基于本地和远程仓库的代码管理(pull、clone、fetch、push、add、commit等)。
架构图:
2、Git基础概念
三大空间
-
工作区(working directory):项目目录内部空间,项目目录下隐藏的.git子目录是暂存区和版本库的存放位置。
-
暂存区(staging area/index/cache):Git跟踪和保存文件更改的地方;用户在工作区更改后,通过
git add命令将更改复制到暂存区;仅记录执行暂存命令前的更改,后续更改需重新暂存。 -
版本库(repository):暂存区更改累积到一定程度后,通过
git commit命令提交至版本库持久保存;提交是检查点,记录暂存区与前一次提交的差异;提交后暂存区自动清空。 -
关系:working directory →(git add)→ staging area →(git commit)→ repository
本地版本控制基本工作流程
-
初始化:在项目目录运行
git init命令,生成.git目录结构,完成版本库初始化。 -
暂存:
git add命令将工作区更改暂存。 -
提交:
git commit命令将暂存区更改提交到版本库,生成包含状态快照的commit(有commit name和commit id)。 -
检出:
git checkout命令将版本库中指定commit的状态反映到工作区。
3、Git命令基础
-
命令格式 :
git <command> <arguments> -
常用子命令
-
启动版本库:init(初始化)、clone(克隆远程仓库)、config(配置)。
-
暂存文件变动:add(添加文件到暂存区)、mv(移动或重命名文件)、rm(删除文件)。
-
查看状态:status(查看文件状态)、log(查看提交日志)、diff(对比文件变动)、grep(搜索)、show(查看提交详情)。
-
分支与合并:checkout(切换分支或检出文件)、branch(管理分支)、merge(合并分支)。
-
远程操作:push(推送本地更改到远程仓库)、fetch(抓取远程更改到本地版本库)、pull(拉取并合并远程更改到本地工作区)。
-
-
帮助获取 :
git help <command>、git <command> --help、man git-<command>。
二、常用Git命令清单
1. 新建代码库
在当前目录新建一个Git代码库
$ git init
新建一个目录,将其初始化为Git代码库
$ git init project-name
下载一个项目和它的整个代码历史
$ git clone url
2. 配置
Git的设置文件为.gitconfig,它可以在用户主目录下(全局配置),也可以在项目目录下(项目配置)。
显示当前的Git配置
$ git config --list
编辑Git配置文件
$ git config -e --global
设置提交代码时的用户信息
$ git config --global user.name "name"
$ git config --global user.email "email address"
3. 增加/删除文件
添加指定文件到暂存区
$ git add file1 file2 ...
添加指定目录到暂存区,包括子目录
$ git add dir
添加当前目录的所有文件到暂存区
$ git add .
添加每个变化前,都会要求确认
对于同一个文件的多处变化,可以实现分次提交
$ git add -p
删除工作区文件,并且将这次删除放入暂存区
$ git rm file1 file2 ...
停止追踪指定文件,但该文件会保留在工作区
$ git rm --cached file
改名文件,并且将这个改名放入暂存区
$ git mv file-original file-renamed
4. 代码提交
提交暂存区到仓库区
$ git commit -m message
提交暂存区的指定文件到仓库区
$ git commit file1 file2 ... -m message
提交工作区自上次commit之后的变化,直接到仓库区
$ git commit -a
提交时显示所有diffrent信息
$ git commit -v
使用一次新的commit,替代上一次提交
如果代码没有任何新变化,则用来改写上一次commit的提交信息
$ git commit --amend -m message
重做上一次commit,并包括指定文件的新变化
$ git commit --amend file1 file2 ...
5. 分支
列出所有本地分支
$ git branch
列出所有远程分支
$ git branch -r
列出所有本地分支和远程分支
$ git branch -a
新建一个分支,但依然停留在当前分支
$ git branch branch-name
新建一个分支,并切换到该分支
$ git checkout -b branch
新建一个分支,指向指定commit
$ git branch branch commit
新建一个分支,与指定的远程分支建立追踪关系
$ git branch --track branch remote-branch
切换到指定分支,并更新工作区
$ git checkout branch-name
切换到上一个分支
$ git checkout -
建立追踪关系,在现有分支与指定的远程分支之间
$ git branch --set-upstream branch remote-branch
合并指定分支到当前分支
$ git merge branch
选择一个commit,合并进当前分支
$ git cherry-pick commit
删除分支
$ git branch -d branch-name
删除远程分支
$ git push origin --delete branch-name
$ git branch -dr remote/branch
6. 标签
列出所有tag
$ git tag
新建一个tag在当前commit
$ git tag tag
新建一个tag在指定commit
$ git tag tag commit
删除本地tag
$ git tag -d tag
删除远程tag
$ git push origin :refs/tags/tagName
查看tag信息
$ git show tag
提交指定tag
$ git push remote tag
提交所有tag
$ git push remote --tags
新建一个分支,指向某个tag
$ git checkout -b branch tag
7. 查看信息
显示有变更的文件
$ git status
显示当前分支的版本历史
$ git log
显示commit历史,以及每次commit发生变更的文件
$ git log --stat
搜索提交历史,根据关键词
$ git log -S keyword
显示某个commit之后的所有变动,每个commit占据一行
$ git log tag HEAD --pretty=format:%s
显示某个commit之后的所有变动,其"提交说明"必须符合搜索条件
$ git log tag HEAD --grep feature
显示某个文件的版本历史,包括文件改名
$ git log --follow file
$ git whatchanged file
显示指定文件相关的每一次diff
$ git log -p file
显示过去5次提交
$ git log -5 --pretty --oneline
显示所有提交过的用户,按提交次数排序
$ git shortlog -sn
显示指定文件是什么人在什么时间修改过
$ git blame file
显示暂存区和工作区的差异
$ git diff
显示暂存区和上一个commit的差异
$ git diff --cached file
显示工作区与当前分支最新commit之间的差异
$ git diff HEAD
显示两次提交之间的差异
$ git diff first-branch...second-branch
显示今天你写了多少行代码
$ git diff --shortstat "@{0 day ago}"
显示某次提交的元数据和内容变化
$ git show commit
显示某次提交发生变化的文件
$ git show --name-only commit
显示某次提交时,某个文件的内容
$ git show commit:filename
显示当前分支的最近几次提交
$ git reflog
8. 远程同步
下载远程仓库的所有变动
$ git fetch remote
显示所有远程仓库
$ git remote -v
显示某个远程仓库的信息
$ git remote show remote
增加一个新的远程仓库,并命名
$ git remote add shortname url
取回远程仓库的变化,并与本地分支合并
$ git pull remote branch
上传本地指定分支到远程仓库
$ git push remote branch
强行推送当前分支到远程仓库,即使有冲突
$ git push remote --force
推送所有分支到远程仓库
$ git push remote --all
9. 撤销
恢复暂存区的指定文件到工作区
$ git checkout file
恢复某个commit的指定文件到暂存区和工作区
$ git checkout brachename file
恢复暂存区的所有文件到工作区
$ git checkout .
重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
$ git reset file
重置暂存区与工作区,与上一次commit保持一致
$ git reset --hard
重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
$ git reset commit
重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
$ git reset --hard commit
重置当前HEAD为指定commit,但保持暂存区和工作区不变
$ git reset --keep commit
新建一个commit,用来撤销指定commit
后者的所有变化都将被前者抵消,并且应用到当前分支
$ git revert commit
暂时将未提交的变化移除,稍后再移入
$ git stash
$ git stash pop
10. 常用操作组合
修改本地分支名和远程分支名
git branch -m old_branch new_branch # 重命名本地分支
git push origin :old_branch # 删除远程旧分支(分支名前有冒号)
git push --set-upstream origin new_branch # 推送新的分支,并设置本地分支跟踪新的远程分支
三、GitLab相关
1、GitLab简介
定位:Git远程存储库实现,支持代码仓库存储和远程访问;基于Ruby on Rails开发。
附加功能:代码共享、分支合并请求、错误跟踪等。
高层架构:
HTTP/HTTPS (TCP 80,443) ↓↑
SSH (TCP 22) ↓↑
NGINX ←→ GitLab Workhorse ←→ Puma (GitLab Rails) ←→ PostgreSQL
↓↑
GitLab Shell ←→ Gitaly
↓↑
Sidekiq ←→ Redis
↓↑
GitLab Pages
2、GitLab组件介绍
| 组件 | 功用 |
|---|---|
| Gitaly | 处理GitLab的所有Git调用的Git RPC服务 |
| GitLab Exporter | GitLab指标暴露器 |
| GitLab Page | 静态Web站点 |
| GitLab self-monitoring组件 | Prometheus、Alertmanager、Grafana、Sentry、Jaeger |
| GitLab Shell | 处理基于ssh会话的git命令 |
| GitLab Workhorse | 智能反向代理,处理高并发HTTP请求 |
| Inbound emails(SMPT) | 接收用于更新issue的邮件 |
| Outbound email (SMTP) | 向用户发送邮件通知 |
| LDAP Authentication | LDAP认证集成 |
| Mattermost | 开源的Slack替代工具 |
| MinIO | 对象存储服务 |
| NGINX | 路由请求到正确组件,终止SSL会话 |
| Praefect | Git客户端和Gitaly存储节点之间的透明代理 |
| Node Exporter | 节点指标暴露器 |
| PostgreSQL | 数据库(含PostgreSQL Exporter) |
| Puma (GitLab Rails) | 处理Web接口和API请求 |
| Redis | 缓存服务(含Redis Exporter) |
| Registry | 容器注册表,支持Image的push和pull |
| Runner | 执行GitLab的CI/CD作业 |
| Sentry integration | 跟踪部署应用的错误信息 |
| Sidekiq | 后台作业处理器 |
3、GitLab部署
部署要求: 参考https://docs.gitlab.cn/jh/install/requirements.html。
安装方法:
-
Linux安装包(Omnibus GitLab):包含极狐GitLab和依赖组件(PostgreSQL、Redis、Sidekiq等)。
-
Helm Chart:在Kubernetes上安装。
-
Docker:容器化安装。
-
Source:源码安装(适用于无官方安装包的平台)。
-
GitLab Environment Toolkit(GET):自动化工具集,用于公有云(Azure、GCP、AWS)部署。
-
GitLab Operator:Kubernetes Operator风格部署。
前置配置(SMTP服务): 安装postfix服务,编辑/etc/postfix/<main.cf>:
mydestination = $myhostname, magedu.com
mynetworks = 127.0.0.0/8 172.29.0.0/16
inet_interfaces = all
inet_protocols = all
4、GitLab常用配置
外部URL及Nginx端口
external_url 'http://git.magedu.com:80' # 外部URL和监听端口,Nginx自动使用该端口
nginx'listen_port' = 8081 # 反向代理后独立指定Nginx监听端口
sshd配置
gitlab_sshd'enable' = true # 启用内置sshd服务
gitlab_sshd'listen_address' = '0.0.0.0:2222' # sshd监听地址和端口
禁用内置CICD功能
gitlab_rails'gitlab_default_projects_features_builds' = false
仓库存储路径
git_data_dirs({
"default" => {
"path" => "/data/gitlab-data"
}
})
备份配置
gitlab_rails'backup_path' = "/data/gitlab-backups" # 备份文件保存位置
gitlab_rails'backup_keep_time' = 604800 # 备份文件过期时间(秒)
gitlab_rails'backup_upload_connection' = {} # 备份上传至对象存储
-
备份命令:
gitlab-rake gitlab:backup:create或gitlab-backup create。 -
恢复命令:
gitlab-rake gitlab:backup:restore BACKUP=1685426003_2023_05_30_16.0.1。
5、GitLab常用命令
gitlab-ctl子命令
| 命令 | 功能 | 命令 | 功能 |
|---|---|---|---|
| check-config | 检查配置文件中过时的配置参数 | once | 启动停止的服务,再次停止不重启 |
| remove-accounts | 删除所有用户和组 | start | 启动停止的服务,再次停止会重启 |
| upgrade-check | 检查版本升级支持 | restart | 重启服务 |
| upgrade | 升级和迁移 | stop | 停止服务 |
| cleanse | 清空数据,重新配置 | status | 显示所有服务状态 |
| reconfigure | 重新配置gitlab | tail | 监视服务日志 |
| show-config | 显示reconfigure生成的配置 | service-list | 列出所有服务 |
| uninstall | 关闭进程并卸载supervisor(保留数据) | backup-etc | 备份gitlab配置 |
6、GitLab权限管理
-
Group用户权限
-
Guest:可创建issue、发表评论,不能读写版本库。
-
Reporter:可clone代码,不能commit,适用于QA、PM。
-
Developer:可clone、commit、push等,适用于RD。
-
Maintainer:可创建项目、添加tag、保护branch、添加成员、编辑项目,适用于核心RD负责人。
-
Owner:可设置访问权限、可见级别、迁移项目、管理组成员,适用于开发组leader。
-
-
组和项目的可见性
-
Private:仅成员可查看。
-
Internal:除外部用户外,所有登录用户可查看。
-
Public:无需身份验证即可查看。
-
7、GitLab仓库设置
-
访问权限设置:仓库 → 设置 → 通用 → 项目信息 → 可见性,设置项目可见级别(Private/Internal/Public)。
-
分支保护机制:仓库 → 设置 → 仓库 → 受保护的分支,选择分支或创建通配符,配置允许合并、允许推送和合并、允许强制推送的用户/角色。
-
合并请求机制:仓库 → 设置 → 合并请求,选择合并方法(合并提交/快进式合并)、合并选项(自动解决差异、显示PR链接、默认删除源分支、合并时压缩提交)。