# GitLab 是什么：如何配合 Git 使用，clone、push、merge request、CI/CD

URL: https://skillaria.top/zh/guides/git/what-is-gitlab

GitLab 是一个存放 Git 仓库并支持团队协作的网页平台，在一处提供代码浏览、merge request、任务和内置的 CI/CD。可以使用云端的 gitlab.com，也可以部署在公司自己的服务器上；代码仍然通过 git clone、git push 和 git pull 等普通 Git 命令收发。

## GitLab 是什么

GitLab 是一个平台，用来存放 Git 仓库，并围绕它组织团队协作：代码浏览、merge request（合并请求）、任务、wiki、容器镜像仓库以及内置的 CI/CD。简单地说，GitLab 就是「带有自己构建流水线、并且可以部署到自己服务器上的 GitHub」。许多公司，尤其是在中国，把代码保存在部署于内网的 GitLab 中。

该项目于 2011 年作为开源代码托管应用启动，之后围绕它发展出了 GitLab 公司。这个平台有两个版本：Community Edition 是开源版，可以免费安装在自己的服务器上；Enterprise Edition 则包含付费功能。在 gitlab.com 云端，套餐分为 Free、Premium 和 Ultimate。

要注意区分这些概念。Git 是版本控制系统，是运行在你电脑上的程序。GitLab 是一项服务，负责保存远程仓库的副本，并为团队提供界面和工具。没有 Git 就无法使用 GitLab，而 Git 完全可以脱离 GitLab 独立工作。

## Git 与 GitLab 有什么区别

人们搜索「git 和 gitlab 是什么」，通常是因为在招聘信息或第一天上班时，同时遇到了这两个词。两者的区别就像文档与云盘：Git 跟踪文件的修改，在本地保存提交历史和分支；GitLab 则通过网络接收这份历史，并在浏览器中展示出来。

|  | Git | GitLab |
| --- | --- | --- |

| 它是什么 | 版本控制程序 | 面向仓库和团队协作的网页平台 |

| 运行在哪里 | 开发者的电脑上 | gitlab.com 或公司的服务器上 |

| 是否需要网络 | 不需要，除了 push、pull、fetch、clone | 需要，它是一项网络服务 |

| 主要功能 | 提交、分支、合并、历史 | merge request、评审、任务、CI/CD、访问权限 |

| 如何使用 | 命令行、IDE、图形化客户端 | 浏览器加上普通的 Git 命令 |

所有与代码相关的操作，例如 commit、branch、merge，你仍然在 Git 中完成。GitLab 只是通过 `git push` 接收结果，并让你与同事讨论它。

## GitLab 与 GitHub 有什么不同

两个服务都存放 Git 仓库，并支持代码评审，因此基本技能可以直接迁移。区别主要在侧重点和部署方式上。

| 对比项 | GitLab | GitHub |
| --- | --- | --- |

| 合并请求 | Merge request（MR） | Pull request（PR） |

| CI/CD | 内置 GitLab CI/CD，文件为 `.gitlab-ci.yml` | GitHub Actions，文件位于 `.github/workflows/` |

| 自行安装 | 免费的 Community Edition，部署到自己的服务器 | GitHub Enterprise Server，需付费 |

| 平台源代码 | 开源（Community Edition） | 闭源 |

| 项目分组 | 群组和嵌套子群组 | 组织（Organizations） |

| 流行场景 | 企业开发、内部服务器 | 开源、公开项目、作品集 |

在实际工作中，开发者经常两者都用：个人项目和作品集放在 GitHub，工作代码放在企业的 GitLab 中。Git 命令完全相同，只是远程仓库的地址不同。

## gitlab.com 还是自建服务器（self-hosted）

云端的 gitlab.com 适合个人项目和小团队：注册后立即就能创建仓库。更新、备份和可用性都由 GitLab 负责。免费套餐的限制（成员数量、CI 分钟数、存储空间）会不时调整，请以套餐页面的最新信息为准。

自建 GitLab 由公司部署在自己的服务器上，可以使用 Linux 安装包、Docker 或 Kubernetes。代码不会离开内网，可以接入企业的 LDAP 登录，也可以配置自己的 runner 来执行构建。代价是管理员需要自己负责更新和备份。对于开发者来说，两者的差别几乎感觉不到：地址不再是 `gitlab.com`，而是比如 `gitlab.company.ru` 之类。

## 配置 Git 以使用 GitLab

在第一次提交之前，先设置用户名和邮箱。它们会写入历史记录，GitLab 会根据邮箱把提交关联到你的个人资料：

```
git config --global user.name "张伟"
git config --global user.email "zhang@example.com"
```

在 Windows 上，建议使用 Git Bash：它随 Git for Windows 一起安装，并包含 `ssh-keygen`，因此本文中的所有命令都可以直接在其中运行。接下来需要选择登录方式：使用令牌的 HTTPS，还是 SSH 密钥。

### 通过 HTTPS 登录：personal access token

通过 HTTPS 进行 Git 操作时不应使用账号密码，而且开启双因素认证后密码也无法通过。请在 GitLab 个人设置中的 Access tokens 部分创建 personal access token。处理代码只需要 `read_repository` 和 `write_repository` 权限；设置有效期，并立即保存令牌，因为它不会再次显示。

第一次 push 或 clone 时，Git 会要求输入用户名和密码：用户名填 GitLab 用户名，密码处填令牌。凭据管理器（Git for Windows 中已内置）会记住它，之后就不必再次输入。

### 通过 SSH 密钥登录

SSH 更适合日常使用：添加一次密钥，之后就不再需要输入任何内容。

```
ssh-keygen -t ed25519 -C "zhang@example.com"
cat ~/.ssh/id_ed25519.pub
```

将 `.pub` 公钥文件的内容粘贴到 GitLab 个人设置的 SSH Keys 部分。连接测试：

```
ssh -T git@gitlab.com
Welcome to GitLab, @zhang.wei!
```

## 使用 git clone 克隆 GitLab 仓库

项目页面上有一个 Code 按钮，其中包含两个地址：SSH 和 HTTPS。复制需要的那个，然后执行 `git clone`：

```
# 通过 HTTPS
git clone https://gitlab.com/my-group/my-project.git

# 通过 SSH
git clone git@gitlab.com:my-group/my-project.git
```

在 GitLab 中，项目路径可以包含子群组，例如 `gitlab.com/company/backend/api.git`，这是正常的，请完整复制地址。

### 使用令牌执行 GitLab 的 git clone

在脚本中或服务器上，没有人可以输入密码，这时可以把令牌直接写进地址。用户名可以是你的用户名，也可以是通用的 `oauth2`：

```
git clone https://oauth2:你的令牌@gitlab.com/my-group/my-project.git
```

注意：这样的地址会保存在 `.git/config` 中，还可能进入 shell 的命令历史。自动化场景中，最好使用部署令牌（deploy token）或项目访问令牌，并赋予最少的权限和有限的有效期；在 CI 中则使用内置变量 `CI_JOB_TOKEN`。

## Git push 到 GitLab：发送代码

如果项目已经在本地，先在 GitLab 中创建一个空项目（不要勾选 README，以免产生多余的提交），然后添加远程仓库：

```
git remote add origin git@gitlab.com:my-group/my-project.git
git branch -M main
git push -u origin main
```

`-u` 参数把本地分支与远程分支关联起来，之后只需使用 `git push` 和 `git pull`。日常的工作流程与其他任何服务都相同：

```
git switch -c feature/login
git add .
git commit -m "添加登录表单"
git push -u origin feature/login
git pull
```

标签需要单独推送：`git push origin v1.2.0`，或者用 `git push --tags` 一次推送全部标签。在 GitLab 中，标签显示在 Tags 部分，常常会触发发布流水线。

### git push 到 GitLab 的常见错误

- **HTTP Basic: Access denied**：用户名错误，或者输入的是密码而不是令牌。请创建带有 `write_repository` 权限的令牌，并从凭据管理器中删除旧记录。
- **Permission denied (publickey)**：GitLab 无法识别你的 SSH 密钥。检查公钥是否已添加到个人资料中，并执行 `ssh -T git@gitlab.com`。
- **You are not allowed to push code to protected branches**：分支（通常是 `main`）受到保护。请把修改推送到你自己的分支，然后创建 merge request。
- **rejected ... (fetch first)**：服务器上有你本地没有的提交。执行 `git pull --rebase` 后再推送。
- **remote: Project not found**：地址拼写错误，或者你没有该项目的访问权限；请向项目所有者确认你的角色。

## GitLab 中的 merge request

Merge request 相当于 GitHub 上的 pull request：请求把你的分支合并到主分支。协作者正是在 MR 中对代码行留下评论，运行 CI 检查，并做出是否合并的决定。推送新分支后，GitLab 会在终端中输出创建 MR 的链接，而网页界面中也会出现创建 MR 的提示。

也可以直接用命令行通过 push options 创建 MR：

```
git push -o merge_request.create -o merge_request.target=main origin feature/login
```

典型流程是：为任务创建分支 → 提交 → push → 创建 MR → 评审并让流水线变绿 → merge。合并时，GitLab 可以把提交压缩为一个（squash），并删除源分支。如果 MR 出现冲突，最简单的做法是在本地更新分支：`git pull --rebase origin main` 或 `git merge main`，解决冲突，然后再次推送。

尚未完成的工作请标记为 Draft：这样的 MR 不会被误合并，而同事仍然可以看到修改并参与讨论。

## GitLab 中的 CI/CD：.gitlab-ci.yml

GitLab 最显著的特点是内置 CI/CD。只要在仓库根目录放置 `.gitlab-ci.yml` 文件，每次 push 时 GitLab 都会运行一条由阶段（stages）和任务（jobs）组成的流水线（pipeline）。任务由 runner 执行：gitlab.com 提供公共 runner，自建服务器则需要单独安装。

```
stages:
  - test
  - deploy

test:
  stage: test
  image: python:3.12
  script:
    - pip install -r requirements.txt
    - pytest

deploy:
  stage: deploy
  script:
    - ./deploy.sh
  rules:
    - if: $CI_COMMIT_TAG
```

这里的测试在每次 push 时运行，而 `deploy` 任务只在推送标签时运行：先执行 `git tag v1.0.0`，再执行 `git push origin v1.0.0`。流水线结果直接显示在 merge request 中，并且可以设置为在检查未通过时禁止合并。

## 如何删除 GitLab 中的仓库

Git 命令无法删除服务器上的项目：`git push` 只会修改分支和标签。项目需要在网页界面中删除：进入项目设置，打开 General 部分的 Advanced 区块，点击删除按钮并输入项目名称确认。需要 Owner 角色。本地副本不会受到影响，它只是一个包含 `.git` 的文件夹。

如果只想把本地仓库与 GitLab 断开，而不删除服务器上的任何内容，执行 `git remote remove origin` 即可。

## 什么时候选择 GitLab

- 代码不能放到外部云端，必须使用自己的服务器。
- 需要开箱即用的 CI/CD，而不依赖第三方服务。
- 大型组织，团队层级复杂，需要嵌套群组和灵活的角色。
- 你加入的公司已经在使用 GitLab：这种情况下没有选择余地，但 Git 技能可以完全迁移。

对于作品集和开源项目，人们通常选择 GitHub：那里的社区更大，项目的可见度更高。也完全可以把同一个项目同时保存在两个服务上，因为一个仓库可以有多个 remote。

## 总结

GitLab 是为 Git 仓库提供服务的平台，通过 merge request 进行评审，并内置任务和 CI/CD，既可以使用云端服务，也可以部署在自己的服务器上。使用它的关键是：配置好令牌或 SSH 密钥登录，然后使用熟悉的 clone、commit、push 和 merge request 即可。远程仓库和团队工作流程在本课程的 Git 实践中都有详细讲解。

## FAQ

**GitLab 免费吗？**

用于自建的 Community Edition 免费。gitlab.com 提供有限制的免费套餐 Free；更多功能需要付费套餐 Premium 或 Ultimate。

**能把项目从 GitHub 迁移到 GitLab 吗？**

可以。GitLab 支持从 GitHub 导入项目，也可以手动迁移历史：先用 git clone --mirror 克隆旧地址，再用 git push --mirror 推送到新地址。

**需要单独学习 GitLab 的命令吗？**

不需要，代码操作使用普通的 Git 命令即可。GitLab 只是增加了网页界面，自动化方面则有命令行工具 glab 和 API。

**GitLab Flow 与 Git Flow 有什么区别？**

GitLab Flow 更简单：工作在功能分支中进行，并通过 merge request 合并到 main；需要区分环境或发布时，再增加单独的分支，不需要 Git Flow 中的 develop 和 hotfix 分支。


---
Source: Skillaria.Top (https://skillaria.top)
