# GitLab là gì và cách làm việc với GitLab qua Git (clone, push, merge request, CI/CD)

URL: https://skillaria.top/vi/guides/git/gitlab-la-gi

GitLab là nền tảng web để lưu trữ repository Git và làm việc nhóm: mã nguồn, merge request, công việc và CI/CD tích hợp nằm chung một chỗ. Bạn có thể dùng GitLab trên dịch vụ đám mây gitlab.com hoặc trên máy chủ riêng của công ty, còn mã được đẩy và lấy về bằng các lệnh Git quen thuộc như clone, push và pull.

## GitLab là gì

GitLab là nền tảng nơi lưu trữ các repository Git và diễn ra công việc nhóm: xem và review mã nguồn, merge request (yêu cầu gộp), quản lý công việc, wiki, registry chứa container, và CI/CD tích hợp sẵn. Nói ngắn gọn, GitLab là "GitHub có pipeline build riêng và có thể cài đặt trên máy chủ của bạn". Nhiều công ty, kể cả ở Việt Nam, giữ mã nguồn trên GitLab đặt trong mạng nội bộ của họ.

Dự án bắt đầu năm 2011 như một ứng dụng mã nguồn mở để lưu trữ code, sau đó công ty GitLab Inc. phát triển xung quanh nó. Nền tảng có hai phiên bản: Community Edition, bản mở có thể cài miễn phí trên máy chủ riêng, và Enterprise Edition với các tính năng trả phí. Trên gitlab.com, các gói có tên Free, Premium và Ultimate.

Đừng nhầm lẫn hai khái niệm. Git là hệ thống kiểm soát phiên bản, một chương trình trên máy tính của bạn. GitLab là dịch vụ giữ một bản sao repository ở xa và thêm giao diện cùng công cụ cho nhóm. Không có Git thì không làm việc được với GitLab, nhưng Git vẫn chạy tốt mà không cần GitLab.

## Git và GitLab khác nhau thế nào

Người ta thường hỏi "git và gitlab là gì" khi cả hai từ cùng xuất hiện trong tin tuyển dụng hoặc ngày đầu đi làm. Sự khác nhau giống như giữa một tài liệu và dịch vụ lưu trữ đám mây: Git theo dõi thay đổi file, lịch sử commit và nhánh ngay trên máy. GitLab nhận lịch sử đó qua mạng và hiển thị trên trình duyệt.

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

| Đây là gì | Chương trình kiểm soát phiên bản | Nền tảng web cho repository và làm việc nhóm |

| Chạy ở đâu | Trên máy của lập trình viên | Trên gitlab.com hoặc máy chủ của công ty |

| Cần internet không? | Không, trừ push, pull, fetch, clone | Có, đây là dịch vụ mạng |

| Chức năng chính | Commit, nhánh, merge, lịch sử | Merge request, review, công việc, CI/CD, phân quyền |

| Cách làm việc | Dòng lệnh, IDE, ứng dụng GUI | Trình duyệt cùng các lệnh Git thông thường |

Mọi thao tác với mã, như commit, branch, merge, bạn vẫn làm trong Git. GitLab chỉ nhận kết quả qua `git push` và cho phép bạn thảo luận với đồng nghiệp.

## GitLab và GitHub khác nhau thế nào

Cả hai đều lưu repository Git và hỗ trợ review mã, nên kỹ năng cơ bản dùng được ở cả hai mà không cần đổi. Khác biệt nằm ở trọng tâm và cách triển khai.

| Tiêu chí | GitLab | GitHub |
| --- | --- | --- |

| Yêu cầu gộp | Merge request (MR) | Pull request (PR) |

| CI/CD | GitLab CI/CD tích hợp, file `.gitlab-ci.yml` | GitHub Actions, file trong `.github/workflows/` |

| Tự cài đặt | Community Edition miễn phí trên máy chủ riêng | GitHub Enterprise Server, trả phí |

| Mã nguồn nền tảng | Mở (Community Edition) | Đóng |

| Cách nhóm dự án | Group và subgroup lồng nhau | Organization |

| Phổ biến hơn ở | Phát triển trong doanh nghiệp, máy chủ nội bộ | Mã nguồn mở, dự án công khai, portfolio |

Trong thực tế, nhiều lập trình viên dùng cả hai: dự án cá nhân và portfolio trên GitHub, còn mã làm việc tại công ty trên GitLab. Các lệnh Git vẫn như nhau, chỉ thay đổi địa chỉ của remote.

## gitlab.com hay máy chủ riêng (self-hosted)

gitlab.com phù hợp với dự án cá nhân và nhóm nhỏ: bạn đăng ký và tạo repository ngay. Việc cập nhật, sao lưu và tính sẵn sàng do GitLab đảm nhiệm. Các giới hạn của gói miễn phí (số thành viên, số phút CI, dung lượng lưu trữ) đôi khi thay đổi, nên hãy xem trang giá để có điều kiện mới nhất.

GitLab tự cài đặt được công ty triển khai trên máy chủ của họ, từ gói cho Linux, Docker hoặc Kubernetes. Mã không rời khỏi mạng nội bộ, có thể kết nối đăng nhập doanh nghiệp qua LDAP, và có thể thiết lập runner riêng để build. Đổi lại, quản trị viên chịu trách nhiệm cập nhật và sao lưu. Với lập trình viên, sự khác biệt gần như không đáng kể: địa chỉ sẽ không phải `gitlab.com` mà là ví dụ `gitlab.congty.com.vn`.

## Thiết lập Git để làm việc với GitLab

Trước commit đầu tiên, hãy đặt tên và e-mail. Hai thông tin này sẽ được ghi vào lịch sử, và GitLab dùng e-mail để gắn commit với hồ sơ của bạn:

```
git config --global user.name "Nguyễn Văn An"
git config --global user.email "an@example.com"
```

Trên Windows, hãy dùng Git Bash, được cài kèm khi cài Git cho Windows. Nó có sẵn `ssh-keygen`, nên mọi lệnh trong bài này chạy trong đó không cần đổi gì. Tiếp theo, chọn cách đăng nhập: HTTPS với token hoặc khóa SSH.

### Đăng nhập qua HTTPS: personal access token

Không nên dùng mật khẩu tài khoản cho thao tác Git qua HTTPS, và nếu đã bật xác thực hai yếu tố thì mật khẩu cũng không hoạt động. Thay vào đó, hãy tạo personal access token trong cài đặt hồ sơ GitLab (mục Access tokens). Với công việc code, đủ các quyền `read_repository` và `write_repository`. Đặt thời hạn và lưu token ngay, vì nó sẽ không được hiển thị lại.

Khi push hoặc clone lần đầu, Git sẽ hỏi tên đăng nhập và mật khẩu: nhập tên người dùng GitLab, còn mật khẩu thì nhập token. Bộ quản lý thông tin đăng nhập (đã có sẵn trong Git cho Windows) sẽ ghi nhớ, nên bạn không phải nhập lại.

### Đăng nhập bằng khóa SSH

SSH tiện hơn cho công việc hằng ngày: thêm khóa một lần là đủ, không cần gõ gì thêm.

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

Sao chép nội dung file `.pub` (khóa công khai) vào mục SSH Keys trong cài đặt hồ sơ GitLab. Để kiểm tra kết nối:

```
ssh -T git@gitlab.com
Welcome to GitLab, @an.nguyen!
```

## Git clone GitLab: cách sao chép repository

Trên trang dự án có nút Code với hai địa chỉ, cho SSH và HTTPS. Sao chép địa chỉ bạn cần, rồi chạy `git clone`:

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

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

Trên GitLab, đường dẫn dự án có thể gồm subgroup, ví dụ `gitlab.com/congty/backend/api.git`. Điều đó hoàn toàn bình thường; hãy sao chép toàn bộ địa chỉ.

### Git clone GitLab bằng token

Trong script và trên máy chủ không có người gõ mật khẩu, token được đặt thẳng vào địa chỉ. Tên đăng nhập có thể là username của bạn hoặc `oauth2`:

```
git clone https://oauth2:TOKEN_CUA_BAN@gitlab.com/my-group/my-project.git
```

Lưu ý: địa chỉ như vậy sẽ được lưu trong `.git/config` và có thể đi vào lịch sử lệnh của shell. Với tự động hóa, hãy dùng deploy token hoặc project access token với quyền tối thiểu và thời hạn giới hạn. Trong CI, dùng biến có sẵn `CI_JOB_TOKEN`.

## Git push lên GitLab: gửi mã đi

Nếu dự án đã có trên máy, hãy tạo một dự án trống trên GitLab (không có README, để không phát sinh commit thừa), rồi liên kết remote:

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

Cờ `-u` liên kết nhánh cục bộ với nhánh remote, từ đó chỉ cần gõ `git push` và `git pull`. Quy trình làm việc hằng ngày giống hệt các dịch vụ khác:

```
git switch -c feature/login
git add .
git commit -m "Thêm form đăng nhập"
git push -u origin feature/login
git pull
```

Tag được gửi riêng: `git push origin v1.2.0`, hoặc tất cả cùng lúc bằng `git push --tags`. Trên GitLab, tag hiển thị trong mục Tags và thường kích hoạt pipeline phát hành.

### Lỗi thường gặp khi git push lên GitLab

- **HTTP Basic: Access denied** — sai tên đăng nhập, hoặc đã nhập mật khẩu thay vì token. Hãy tạo token có quyền `write_repository` và xóa mục cũ trong bộ quản lý thông tin đăng nhập.
- **Permission denied (publickey)** — GitLab không nhận ra khóa SSH của bạn. Kiểm tra khóa công khai đã được thêm vào hồ sơ chưa, rồi chạy `ssh -T git@gitlab.com`.
- **You are not allowed to push code to protected branches** — nhánh (thường là `main`) đang được bảo vệ. Hãy gửi thay đổi lên nhánh của bạn và mở merge request.
- **rejected ... (fetch first)** — trên server có commit mà máy bạn chưa có. Chạy `git pull --rebase` rồi push lại.
- **remote: Project not found** — địa chỉ gõ sai, hoặc bạn không có quyền truy cập dự án. Hãy hỏi chủ dự án về vai trò của bạn.

## Merge request trên GitLab

Merge request là bản tương đương của pull request trên GitHub: đề nghị gộp nhánh của bạn vào nhánh chính. Trong MR, đồng nghiệp để lại bình luận trên từng dòng code, pipeline CI chạy kiểm tra, và quyết định gộp được đưa ra. Sau khi push một nhánh mới, GitLab in liên kết để tạo MR ra terminal, còn trên giao diện web sẽ có gợi ý tạo MR.

Cũng có thể tạo MR ngay trên dòng lệnh bằng push options:

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

Quy trình điển hình: nhánh cho công việc, commit, push, MR, review và pipeline xanh, rồi merge. Khi gộp, GitLab có thể nén các commit thành một (squash) và xóa nhánh nguồn. Nếu MR có xung đột, cách dễ nhất là cập nhật nhánh cục bộ bằng `git pull --rebase origin main` hoặc `git merge main`, giải quyết xung đột, rồi push lại.

Hãy đánh dấu công việc chưa xong là Draft: MR như vậy không thể bị gộp nhầm, nhưng đồng nghiệp vẫn xem và thảo luận được.

## CI/CD trên GitLab: .gitlab-ci.yml

Điểm nổi bật của GitLab là CI/CD tích hợp sẵn. Chỉ cần đặt file `.gitlab-ci.yml` ở gốc repository, mỗi lần push GitLab sẽ chạy một pipeline gồm các giai đoạn (stages) và tác vụ (jobs). Tác vụ được thực thi bởi runner: gitlab.com có sẵn runner dùng chung, còn trên máy chủ riêng thì runner được cài riêng.

```
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
```

Trong ví dụ này, test chạy mỗi lần push, còn tác vụ `deploy` chỉ chạy khi có tag được gửi: `git tag v1.0.0` rồi `git push origin v1.0.0`. Kết quả pipeline hiển thị ngay trong merge request, và bạn có thể cấm gộp khi các kiểm tra chưa đạt.

## Cách xóa repository trên GitLab

Các lệnh Git không thể xóa dự án trên server. `git push` chỉ thay đổi nhánh và tag. Dự án được xóa trên giao diện web: vào cài đặt dự án, mục General, khối Advanced, rồi nút xóa với xác nhận bằng tên dự án. Cần vai trò Owner. Bản sao cục bộ vẫn còn, vì nó chỉ là một thư mục có `.git`.

Nếu muốn ngắt liên kết repository cục bộ với GitLab mà không xóa gì trên server, chỉ cần chạy `git remote remove origin`.

## Khi nào nên chọn GitLab

- Mã nguồn không được đưa lên đám mây bên ngoài, nên cần máy chủ riêng.
- Cần CI/CD có sẵn mà không phụ thuộc dịch vụ bên thứ ba.
- Tổ chức lớn có cấu trúc nhóm nhiều tầng: group lồng nhau và vai trò linh hoạt rất hữu ích.
- Bạn vào làm ở công ty đang dùng GitLab: lựa chọn đã có sẵn, nhưng kỹ năng Git của bạn được áp dụng trọn vẹn.

Với portfolio và mã nguồn mở, GitHub thường được chọn hơn vì cộng đồng lớn hơn và dự án dễ được nhìn thấy hơn. Không có gì cản trở việc giữ dự án trên cả hai dịch vụ, vì một repository có thể có nhiều remote.

## Kết luận

GitLab là nền tảng cho repository Git với review qua merge request, công việc, và CI/CD tích hợp, có sẵn cả trên đám mây lẫn máy chủ riêng. Làm việc với GitLab nghĩa là dùng những lệnh quen thuộc: thiết lập đăng nhập bằng token hoặc khóa SSH, rồi clone, commit, push và merge request. Remote repository và quy trình làm việc nhóm được trình bày thực hành trong khóa học Git.

## FAQ

**GitLab có miễn phí không?**

Community Edition miễn phí khi cài trên máy chủ riêng, và gitlab.com có gói Free với một số giới hạn. Các tính năng nâng cao có trong gói trả phí Premium và Ultimate.

**Có thể chuyển dự án từ GitHub sang GitLab không?**

Có. GitLab hỗ trợ nhập dự án từ GitHub. Lịch sử cũng có thể chuyển thủ công bằng git clone --mirror từ địa chỉ cũ, rồi git push --mirror lên địa chỉ mới.

**Có cần học lệnh riêng cho GitLab không?**

Không. Mã được làm việc bằng lệnh Git thông thường, còn GitLab bổ sung giao diện web. Để tự động hóa, có công cụ dòng lệnh glab và API.

**GitLab Flow khác Git Flow ở điểm nào?**

GitLab Flow đơn giản hơn: công việc làm trên nhánh tính năng và merge request vào main, còn với môi trường hoặc phát hành thì thêm nhánh riêng khi cần, không có nhánh develop và hotfix như trong Git Flow.


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