# GIT

Để sử dụng **Git** một cách chuẩn trong một dự án thực tế tại công ty, bạn cần tuân thủ quy trình làm việc (workflow) rõ ràng, đảm bảo tính nhất quán, dễ quản lý và tránh xung đột. Dưới đây là hướng dẫn chi tiết:

***

#### 1. **Cấu hình Git ban đầu**

* **Khởi tạo Git**: Nếu dự án chưa có repository, tạo mới với lệnh:

  ```bash
  git init
  ```

  Hoặc clone từ remote repository:

  ```bash
  git clone <repository-url>
  ```
* **Cấu hình thông tin cá nhân**:

  ```bash
  git config --global user.name "Tên của bạn"
  git config --global user.email "email@congty.com"
  ```
* **Kiểm tra cấu hình**:

  ```bash
  git config --list
  ```

***

#### 2. **Quy trình làm việc với Git (Git Workflow)**

Trong công ty, thường sử dụng mô hình **Gitflow** hoặc **Trunk-based development**. Dưới đây là cách áp dụng Gitflow (phổ biến nhất):

**a. Cấu trúc branch**

* **main**: Branch chính, chứa mã ổn định đã được kiểm tra và sẵn sàng deploy.
* **develop**: Branch tích hợp các tính năng mới, dùng để kiểm tra trước khi merge vào `main`.
* **feature/**: Branch cho từng tính năng cụ thể, ví dụ: `feature/login-system`.
* **bugfix/**: Branch sửa lỗi, ví dụ: `bugfix/fix-login-error`.
* **hotfix/**: Branch sửa lỗi khẩn cấp trên `main`, ví dụ: `hotfix/critical-bug`.
* **release/**: Branch chuẩn bị phát hành, ví dụ: `release/v1.0.0`.

**b. Quy trình làm việc**

1. **Tạo branch mới** cho tính năng hoặc lỗi:

   ```bash
   git checkout develop
   git checkout -b feature/<ten-tinh-nang>
   ```
2. **Làm việc trên branch**:
   * Thực hiện các thay đổi mã nguồn.
   * Commit thường xuyên với thông điệp rõ ràng:

     ```bash
     git add .
     git commit -m "Mô tả ngắn gọn và rõ ràng về thay đổi"
     ```

     **Ví dụ**: `git commit -m "Add user authentication for login page"`
3. **Cập nhật branch từ `develop`** (để tránh xung đột):

   ```bash
   git checkout develop
   git pull origin develop
   git checkout feature/<ten-tinh-nang>
   git merge develop
   ```

   Giải quyết xung đột nếu có.
4. **Push branch lên remote**:

   ```bash
   git push origin feature/<ten-tinh-nang>
   ```
5. **Tạo Pull Request (PR)/Merge Request**:
   * Truy cập giao diện GitHub/GitLab/Bitbucket, tạo PR từ `feature/<ten-tinh-nang>` sang `develop`.
   * Điền mô tả chi tiết về thay đổi, mục đích, và các kiểm tra đã thực hiện.
   * Gán reviewer để kiểm tra mã.
6. **Review và Merge**:
   * Đồng nghiệp sẽ review PR, đưa ra phản hồi.
   * Nếu cần sửa đổi, commit thêm vào branch:

     ```bash
     git add .
     git commit -m "Fix review comments"
     git push origin feature/<ten-tinh-nang>
     ```
   * Sau khi được duyệt, merge PR vào `develop`.
7. **Xóa branch** (sau khi merge):

   ```bash
   git push origin --delete feature/<ten-tinh-nang>
   git branch -d feature/<ten-tinh-nang>
   ```

**c. Deploy và Release**

* Khi đủ tính năng trên `develop`, tạo branch `release`:

  ```bash
  git checkout develop
  git checkout -b release/v1.0.0
  ```
* Thực hiện kiểm tra cuối (unit test, integration test), sửa lỗi nhỏ nếu cần.
* Merge `release` vào `main` và `develop`:

  ```bash
  git checkout main
  git merge release/v1.0.0
  git checkout develop
  git merge release/v1.0.0
  ```
* Tag phiên bản:

  ```bash
  git tag v1.0.0
  git push origin v1.0.0
  ```
* Push lên remote:

  ```bash
  git push origin main
  git push origin develop
  ```

***

#### 3. **Nguyên tắc đặt tên và viết commit**

* **Tên branch**: Ngắn gọn, mô tả rõ ràng, theo định dạng `type/<mo-ta>`. Ví dụ:
  * `feature/add-payment-gateway`
  * `bugfix/fix-header-ui`
* **Thông điệp commit**:
  * Ngắn gọn, rõ ràng, sử dụng động từ ở thì hiện tại (add, fix, update, remove).
  * Ví dụ:
    * `Add user login validation`
    * `Fix broken API endpoint`
  * Nếu cần chi tiết, thêm mô tả sau dòng đầu:

    ```bash
    git commit -m "Add user login validation
    - Implement JWT token generation
    - Add input validation for email and password"
    ```
* **Ngôn ngữ**: Thống nhất sử dụng tiếng Anh hoặc tiếng Việt tùy quy định công ty.

***

#### 4. **Các công cụ hỗ trợ**

* **Nền tảng quản lý Git**: GitHub, GitLab, Bitbucket.
* **CI/CD**: Tích hợp pipeline để tự động test và deploy (GitHub Actions, GitLab CI, Jenkins).
* **Công cụ review code**: Sử dụng tính năng review của GitHub/GitLab, hoặc SonarQube để kiểm tra chất lượng mã.
* **Công cụ quản lý dự án**: Jira, Trello để gắn ticket với PR.

***

#### 5. **Những lưu ý quan trọng**

* **Pull thường xuyên**: Cập nhật branch `develop` hoặc `main` để tránh xung đột.
* **Không commit trực tiếp lên `main` hoặc `develop`**: Luôn làm việc trên branch riêng.
* **Kiểm tra trước khi push**:
  * Chạy test (`npm test`, `pytest`, v.v.).
  * Đảm bảo mã theo chuẩn code (ESLint, Prettier).
* **Backup trước khi rebase hoặc merge lớn**:

  ```bash
  git branch backup-<ten-branch>
  ```
* **Xử lý xung đột**: Khi merge/rebase, đọc kỹ thông báo và giải quyết xung đột thủ công.
* **Bảo mật**:
  * Không commit thông tin nhạy cảm (API key, mật khẩu).
  * Sử dụng `.gitignore` để bỏ qua các file không cần thiết (`.env`, `node_modules`, v.v.).

***

#### 6. **Ví dụ quy trình thực tế**

Giả sử bạn được giao task "Thêm chức năng đăng nhập":

1. Checkout branch `develop` và pull mã mới nhất:

   ```bash
   git checkout develop
   git pull origin develop
   ```
2. Tạo branch mới:

   ```bash
   git checkout -b feature/user-login
   ```
3. Code chức năng đăng nhập, commit thay đổi:

   ```bash
   git add .
   git commit -m "Add user login with JWT"
   ```
4. Push branch và tạo PR:

   ```bash
   git push origin feature/user-login
   ```

   * Truy cập GitHub/GitLab, tạo PR vào `develop`.
   * Gán reviewer, thêm mô tả: "Đã thêm đăng nhập với JWT, kiểm tra email/password, cần review API."
5. Sau khi được duyệt, merge PR và xóa branch:

   ```bash
   git push origin --delete feature/user-login
   ```

***

#### 7. **Mẹo nâng cao**

* **Sử dụng rebase** để giữ lịch sử commit sạch sẽ:

  ```bash
  git rebase develop
  ```

  <figure><img src="https://3927310056-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F6qswZ96eAEDCbZqLtvK4%2Fuploads%2FZULYf32igKUmvVzwyP1d%2Fimage.png?alt=media&#x26;token=71cd2d8d-5254-4517-b574-95f8cc2163e4" alt=""><figcaption></figcaption></figure>
* Tuy nhiên, cẩn thận khi rebase branch đã push.
* **Cherry-pick** để lấy commit cụ thể:

  ```bash
  git cherry-pick <commit-hash>
  ```
* **Squash commit** trước khi merge để gọn gàng:

  ```bash
  git rebase -i <commit-hash>
  ```
* **Tự động hóa**: Sử dụng pre-commit hook để kiểm tra mã trước khi commit.

***

#### 8. **Tài liệu tham khảo**

* [Gitflow Workflow](https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow)
* [Git Documentation](https://git-scm.com/doc)
* [Conventional Commits](https://www.conventionalcommits.org/)

***
