Git là gì?

Git là một hệ thống quản lý phiên bản phân tán (Distributed Version Control System – DVCS), nó là một trong những hệ thống quản lý phiên bản phân tán phổ biến nhất hiện nay. Git cung cấp cho mỗi lập trình viên kho lưu trữ (repository) riêng chứa toàn bộ lịch sử thay đổi.

Version Control System là gì?

Version Control System (VCS) là hệ thống kiểm soát các phiên bản phân tán mã nguồn mở. Các VCS sẽ lưu trữ tất cả các file trong toàn bộ dự án và ghi lại toàn bộ lịch sử thay đổi của file. Mỗi sự thay đổi được lưu lại sẽ được và thành một version (phiên bản).

VCS nghĩa là hệ thống giúp lập trình viên có thể lưu trữ nhiều phiên bản khác nhau của một mã nguồn được nhân bản (clone) từ một kho chứa mã nguồn (repository), mỗi thay đổi vào mã nguồn trên local sẽ có thể ủy thác (commit) rồi đưa lên server nơi đặt kho chứa chính.

Và một máy tính khác nếu họ có quyền truy cập cũng có thể clone lại mã nguồn từ kho chứa hoặc clone lại một tập hợp các thay đổi mới nhất trên máy tính kia.

Lập trình viên có thể xem lại danh sách các sự thay đổi của file như xem một dòng thời gian của các phiên bản. Mỗi phiên bản bao gồm: nội dung file bị thay đổi, ngày giờ sửa đổi, người thay đổi là ai, lý do thay đổi hay tên phiên bản…

Cách hoạt động của Git

Sự khác biệt chính giữa Git và bất kỳ VCS nào khác (bao gồm Subversion…) là cách Git nghĩ về dữ liệu của nó.

Về mặt khái niệm, hầu hết các hệ thống khác đều lưu trữ thông tin dưới dạng danh sách các thay đổi dựa trên file. Các hệ thống này (CVS, Subversion, Perforce, Bazaar, v.v.) coi thông tin chúng lưu giữ dưới dạng một tập hợp các file và những thay đổi được thực hiện đối với mỗi file theo thời gian.

Git không nghĩ đến hoặc lưu trữ dữ liệu của mình theo cách này. Thay vào đó, Git coi thông tin được lưu trữ là một tập hợp các snapshot – ảnh chụp toàn bộ nội dung tất cả các file tại thời điểm.

Mỗi khi bạn “commit”, Git sẽ “chụp” và tạo ra một snapshot cùng một tham chiếu tới snapshot đó. Để hiệu quả, nếu các tệp không thay đổi, Git sẽ không lưu trữ lại file — chỉ là một liên kết đến tệp giống file trước đó mà nó đã lưu trữ. Git nghĩ về dữ liệu của nó giống như dưới đây:

Đây là điểm khác biệt quan trọng giữa Git và gần như tất cả các VCS khác. Nó khiến Git phải xem xét lại hầu hết mọi khía cạnh của kiểm soát phiên bản mà hầu hết các hệ thống khác đã sao chép từ thế hệ trước. Điều này làm cho Git giống như một hệ thống tệp nhỏ với một số công cụ cực kỳ mạnh mẽ được xây dựng trên nó, thay vì chỉ đơn giản là một VCS.

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

  • Working Directory (thư mục làm việc): Là nơi bạn thao tác trên file (tạo, sửa, xóa).
  • Staging Area (index): Khi bạn đã sửa file xong và muốn đưa các thay đổi đó vào commit, bạn “thêm” (stage) vào staging area.
  • Repository (local): Khi commit, Git lưu lại snapshot của staging area vào repository.
  • Remote Repository: Là repository nằm trên máy chủ (như GitHub, GitLab). Bạn có thể push/pull giữa local và remote.
  • Commit: Là một điểm chụp (snapshot) của thay đổi, gồm metadata (tác giả, thời gian, message, v.v.) và con trỏ đến các blob (nội dung file). Mỗi commit có một mã hash (SHA-1) duy nhất, ví dụ a1b2c3d4....
  • Branch (nhánh): Là con trỏ tham chiếu đến một commit cụ thể. Mặc định khi khởi tạo, Git sẽ tạo nhánh master hoặc main. Bạn có thể tạo thêm các nhánh để phát triển tính năng, sửa lỗi, rồi gộp (merge) lại vào nhánh chính.
  • Merge: Khi bạn hoàn thành công việc trên một nhánh phụ, có thể gộp (merge) vào nhánh chính. Git sẽ cố gắng hợp nhất tự động, nếu có xung đột (conflict), bạn phải sửa tay.
  • Rebase (tái cơ sở): Một cách khác để “di chuyển” commit từ một nhánh này lên nhánh khác. Rebase giúp lịch sử gọn gàng, nhưng cần cẩn trọng khi rebase nhánh đã được chia sẻ.

Các lệnh Git cơ bản

  • git init: khởi tạo 1 git repository 1 project mới hoặc đã có. Cách dùng: git init trong thư mục gốc của dự án.
  • git clone: Copy 1 git repository từ remote source. Cách dùng: git clone <:clone git url:>
  • git status: Để check trạng thái của những file bạn đã thay đổi trong thư mục làm việc. Cách dùng: git status trong thư mục làm việc.
  • git add: Thêm thay đổi đến stage/index trong thư mục làm việc. Cách dùng: git add
  • git commit: commit nghĩa là một action để Git lưu lại một snapshot của các sự thay đổi trong thư mục làm việc. Và các tập tin, thư mục được thay đổi đã phải nằm trong Staging Area. Mỗi lần commit nó sẽ được lưu lại lịch sử chỉnh sửa của code kèm theo tên và địa chỉ email của người commit. Ngoài ra trong Git bạn cũng có thể khôi phục lại tập tin trong lịch sử commit của nó để chia cho một branch khác, vì vậy bạn sẽ dễ dàng khôi phục lại các thay đổi trước đó. Cách dùng: git commit -m "message"
  • git push/pull: Push hoặc Pull các thay đổi đến remote. Nếu bạn đã added và committed các thay đổi và bạn muốn đẩy nó lên hoặc remote của bạn đã update và bạn apply tất cả thay đổi đó trên code của mình. Cách dùng: git pull <:remote:> <:branch:> and git push <:remote:> <:branch:>
  • git branch: iệt kê tất cả các branch (nhánh).Cách dùng: git branch hoặc git branch -a
  • git checkout: chuyển sang branch khác. Cách dùng: git checkout <: branch:> hoặc git checkout -<: branch:> nếu bạn muốn tạo và chuyển sang một chi nhánh mới.
  • git merge: merge 2 branch lại với nhau. Cách dùng: Chuyển tới branch bạn muốn merge rồi  dùng git merge <:branch_merge:>

Giới thiệu về GitHub

GitHub là một dịch vụ lưu trữ (hosting) mã nguồn trên nền tảng đám mây, xây dựng xung quanh hệ thống quản lý phiên bản Git. Ra mắt từ năm 2008, GitHub nhanh chóng trở thành nơi cộng đồng lập trình viên, các công ty, và dự án mã nguồn mở (open-source) lưu trữ, chia sẻ và phối hợp phát triển phần mềm. Về cơ bản, GitHub cung cấp một “remote repository” (kho chứa từ xa) cho các dự án Git, đồng thời bổ sung rất nhiều tính năng quản lý, cộng tác, và CI/CD để tối ưu quy trình phát triển.

Tiện ích trên GitHub

Lưu trữ và chia sẻ repository

  • Mỗi repository (repo) trên GitHub là một bản sao của kho mã nguồn Git, chứa toàn bộ lịch sử commit, nhánh (branch), tag, v.v.
  • Bạn có thể tạo repo public (miễn phí, cho tất cả mọi người xem) hoặc private (chỉ người được mời mới xem/đóng góp).

Quản lý Issue và Project

  • Issue (vấn đề): Mỗi bug, tính năng mới, hoặc công việc cần làm có thể khởi tạo một Issue. Các thành viên thảo luận trực tiếp ngay trong Issue, gắn nhãn (label), gán cho người thực hiện (assignee) và đánh dấu trạng thái (milestone).
  • Project (Dự án/Kanban): GitHub cho phép tạo bảng Project (theo phong cách Kanban) để kéo-thả Issue/Task giữa các cột như To Do, In Progress, Done, giúp quản lý tiến độ trực quan.

Pull Request (PR) – Yêu cầu hợp nhất (merge)

  • Khi bạn muốn đóng góp code vào một nhánh (thường là main hoặc develop), thay vì push trực tiếp, bạn tạo một Pull Request.
  • PR là nơi để reviewer (người xem xét) bình luận, chấm điểm, CI tự động chạy unit test, build, rồi mới quyết định merge code.
  • Pull Request giúp kiểm soát chất lượng, tránh merge code lỗi, và cho phép thảo luận chi tiết về thay đổi trước khi chấp nhận.

GitHub Actions – CI/CD tích hợp

  • GitHub Actions là hệ thống tự động hóa workflow, chạy các job (kiểm thử, build, deploy) mỗi khi có sự kiện trên repository (push, PR, release).
  • Bạn có thể cấu hình file yaml trong thư mục .github/workflows/ để định nghĩa pipeline: chạy unit test, code lint, build đóng gói, hoặc deploy lên server/Cloud khi merge vào nhánh main.

Pages – Triển khai website tĩnh

  • GitHub Pages cho phép bạn host trang web tĩnh (blog, portfolio) miễn phí trên domain <username>.github.io hoặc custom domain. Chỉ cần đẩy (push) HTML/CSS/JS lên nhánh gh-pages hoặc thư mục docs/, GitHub sẽ tự build và xuất bản.

Social Coding – Cộng đồng và đóng góp mã nguồn mở

  • Trên GitHub, các dự án mã nguồn mở có thể “fork” về repo riêng, sửa code, rồi tạo Pull Request để gửi lại.
  • Bạn có thể “star” (yêu thích) repo, theo dõi (watch) những dự án quan tâm, hoặc theo dõi hoạt động của người dùng/lập trình viên khác.
  • Kết hợp tính năng “Sponsorship”, bạn có thể tài trợ cho các maintainer (người duy trì) dự án mã nguồn mở.

Quản lý Release và Package Registry

  • Mỗi lần phát hành (release), bạn có thể đánh tag (v1.0.0, v2.1.3, …), đính kèm tệp binary (ZIP, tar.gz) hoặc gói cài đặt, giúp người dùng dễ download phiên bản ổn định.
  • GitHub Packages cho phép lưu trữ Docker images, npm packages, Maven artifacts, NuGet packages, v.v. ngay trên GitHub Registry, dễ dàng sử dụng trong workflow CI/CD.

 

About the Author

Đức Phát

View all author's posts

Leave a Comment

Your email address will not be published. Required fields are marked *

Bài viết khác

Ngôn ngữ lập trình Golang

Golang là gì? Go (hay còn gọi là Golang) là một ngôn ngữ lập trình được thiết kế dựa trên tư duy lập trình hệ thống. Go được phát triển bởi Robert Griesemer, Rob Pike và Ken Thompson tại Google vào năm 2007. Điểm mạnh của Go là bộ thu gom rác và hỗ trợ […]

Browser

Browser (Web Browser, Trình duyệt web) là phần mềm trên máy tính, điện thoại hoặc thiết bị thông minh, cho phép người dùng truy cập, hiển thị và tương tác với các trang web, tài nguyên Internet. Về bản chất, trình duyệt gửi các yêu cầu (HTTP/HTTPS request) đến máy chủ web, nhận về mã […]

Tìm hiểu DNS

DNS là gì? DNS (Domain Name System) là một dịch vụ phân giải tên miền, giúp chuyển đổi các tên miền (ví dụ: www.ducphat.com) thành địa chỉ IP (ví dụ: 93.184.216.34) và ngược lại. Thay vì phải nhớ dãy số IP, chúng ta chỉ cần nhập tên miền, DNS sẽ tìm kiếm địa chỉ IP […]

Tìm hiểu giao thức HTTP

HTTP là gì? HTTP (HyperText Transfer Protocol) là giao thức truyền tải siêu văn bản, dùng để trao đổi dữ liệu giữa client (thường là trình duyệt web) và server (máy chủ web) qua mô hình request–response. HTTP hoạt động ở tầng ứng dụng (Application Layer) trong mô hình OSI/TCP-IP, dựa trên kết nối TCP […]

Internet là gì?

Internet, hay còn gọi là mạng toàn cầu, là một hệ thống mạng máy tính kết nối với nhau trên toàn thế giới, cho phép trao đổi dữ liệu và thông tin một cách nhanh chóng và liên tục. Internet kết nối các thiết bị thông qua các giao thức và phương thức truyền tải […]

Agile là gì?

Tổng quan về Agile? Agile (quy trình phát triển phần mềm linh hoạt) là một phương pháp phát triển phần mềm dựa trên sự hợp tác, linh hoạt, phản hồi nhanh với thay đổi và phát triển theo từng giai đoạn nhỏ (iteration). Thay vì xây dựng toàn bộ sản phẩm rồi mới kiểm thử […]