Skip to content

Git repo

Khi nhiều lập trình viên cùng làm việc trên một kho lưu trữ mã nguồn chung, việc thiếu quy định đồng nhất sẽ biến lịch sử commit thành một mớ hỗn độn và dễ xảy ra xung đột ghi đè mã nguồn của nhau. Làm sao để duy trì lịch sử phiên bản mã nguồn sạch sẽ, minh bạch và đảm bảo mọi thay đổi đều có thể truy vết nguồn gốc dễ dàng?

Bài viết này chuẩn hóa quy trình vận hành kho lưu trữ: từ khâu khởi tạo, viết thông điệp commit theo cú pháp chuẩn, đến phân loại các loại đẩy mã nguồn lên máy chủ và quy trình duyệt nhánh.

1. Bảng thuật ngữ cục bộ

Thuật ngữTên tiếng AnhDịch nghĩa & Giải thích
GitGit Version ControlHệ thống quản lý phiên bản mã nguồn.
CommitGit CommitMột điểm ghi nhận thay đổi mã nguồn.
BranchGit BranchNhánh làm việc độc lập trên Git.
PRPull RequestYêu cầu xem xét gộp mã nguồn trên GitHub.
PushGit PushĐẩy mã nguồn từ máy cục bộ lên máy chủ.

2. Sơ đồ luồng quản lý nhánh và duyệt mã nguồn

Khung đọc sơ đồ:

  • Đề bài cần giải: Làm sao gộp các thay đổi mã nguồn vào nhánh chính một cách an toàn mà không phá vỡ tính ổn định của hệ thống.
  • Giả định nền: Nhánh chính main luôn là nguồn sự thật ổn định và chạy được; mọi thay đổi lớn phải được thực hiện trên nhánh độc lập.
  • Ý nghĩa các thành phần: Quy trình đi qua 5 trạng thái từ tách nhánh, cam kết cục bộ, mở PR kiểm tra chéo, và gộp code sau khi được thông qua.
  • Cách đọc rút giá trị: Đọc theo chiều kim đồng hồ từ nhánh chính. PR là chốt kiểm soát quan trọng nhất trước khi mã nguồn mới được tích hợp vào main.

3. Các khái niệm cốt lõi

3.1 Khởi tạo và Cấu hình Kho lưu trữ

  • ⚙️ Cơ chế: Tạo mới kho lưu trữ cục bộ, thiết lập tệp loại trừ .gitignore để loại bỏ các tệp tin rác hoặc dữ liệu lớn, thực hiện cam kết đầu tiên và liên kết với máy chủ từ xa.
  • 🔍 Cách nhận diện: Khởi chạy lệnh git init, cấu hình tệp .gitignore chứa các thư mục như .venv/, node_modules/, và thực hiện lệnh git push -u origin main.
  • 💡 Ý nghĩa: Đảm bảo môi trường làm việc sạch sẽ ngay từ đầu, tránh việc vô tình commit các tệp tin cấu hình cá nhân hoặc dữ liệu bảo mật lên GitHub.
  • ⚠️ Bẫy: Khởi tạo kho lưu trữ mà quên thiết lập .gitignore, làm rò rỉ dữ liệu lớn hoặc thông tin nhạy cảm lên máy chủ chung.

3.2 Quy ước viết thông điệp Cam kết

  • ⚙️ Cơ chế: Mỗi cam kết phải chứa định danh tác nhân ở đầu, đi kèm tiền tố phân loại (feat, fix, docs, chore) và câu mô tả ngắn gọn hành động bằng tiếng Anh.
  • 🔍 Cách nhận diện: Thông điệp cam kết có dạng: [tên-tác-nhân] tiền-tố: câu mô tả, ví dụ: [claude] feat: add era-aware data loader.
  • 💡 Ý nghĩa: Giúp toàn đội ngũ dễ dàng truy vết lập trình viên đã sửa đổi mã nguồn và mục đích của mỗi thay đổi là gì khi đọc lịch sử Git.
  • ⚠️ Bẫy: Gom nhiều thay đổi không liên quan vào một cam kết khổng lồ với thông điệp chung chung như update code hoặc fix bugs.

3.3 Phân loại Đẩy mã nguồn và Quản lý Nhánh

  • ⚙️ Cơ chế:
    • Đẩy đóng gói: Chỉ đẩy lên máy chủ từ xa khi hoàn thành một mảng việc lớn đã qua kiểm thử, làm mốc cho người khác kế thừa.
    • Đẩy thông luồng: Đẩy phục vụ hạ tầng tự động, ví dụ để Kaggle kéo code về chạy hoặc để Cloudflare build lại web.
    • Nhánh tính năng: Mỗi nhiệm vụ lớn thực hiện trên nhánh feat/tên-việc riêng biệt, gộp vào nhánh chính thông qua yêu cầu gộp (PR) sau khi được phê duyệt.
  • 🔍 Cách nhận diện: Các nhánh được đặt tên theo quy ước, lệnh git push được thực hiện có chủ đích, tuyệt đối không được tự ý đẩy đè (force push) lên nhánh main chung.
  • 💡 Ý nghĩa: Bảo vệ tính ổn định của nhánh chính, đảm bảo nhánh chính luôn ở trạng thái chạy được.
  • ⚠️ Bẫy: Tự ý gộp code trực tiếp vào nhánh chính chung mà không thông qua quá trình đánh giá PR và kiểm thử tự động.

✅ Tự kiểm nhanh

  1. Tại sao phải thiết lập tệp .gitignore ngay khi khởi tạo kho lưu trữ?
Đáp án

Để chặn các tệp tin không mong muốn như thư mục ảo .venv/, thư viện node_modules/, các file dữ liệu khổng lồ hoặc các file chứa thông tin bảo mật cá nhân bị đẩy lên máy chủ GitHub chung, gây lãng phí bộ nhớ và rò rỉ thông tin.

  1. Lợi ích của việc gắn định danh tác nhân ở đầu thông điệp cam kết là gì?
Đáp án

Giúp đội ngũ dễ dàng nhận biết ai (hoặc tác nhân AI nào) đã thực hiện thay đổi đó mà không cần phải truy vấn sâu vào thông tin metadata của commit, tối ưu hóa tốc độ trao đổi và rà soát lỗi trong team.