Git là gì? Git hoạt động như thế nào?
- Home
- Git là gì? Git hoạt động như thế nào?
Nếu bạn từng làm việc với code, chắc hẳn đã nghe đến Git và GitHub. Git xuất hiện trong hầu hết các dự án phần mềm hiện nay, từ những project cá nhân nhỏ đến các hệ thống lớn có hàng trăm Developer cùng làm việc.
Nhưng Git thực sự là gì? Tại sao Developer cần Git? Và phía sau những lệnh quen thuộc như git commit, git push hay git pull đang diễn ra điều gì?
Hãy cùng tìm hiểu từ những khái niệm cơ bản nhất.
Git là một hệ thống quản lý phiên bản phân tán (Distributed Version Control System – DVCS), được sử dụng để theo dõi những thay đổi trong mã nguồn trong quá trình phát triển phần mềm.
Nói đơn giản:
Git giúp bạn lưu lại lịch sử thay đổi của code và dễ dàng quay lại một phiên bản trước đó khi cần.
Ví dụ, hôm nay bạn có một file:
index.php
Ban đầu:
echo "Hello";
Sau đó bạn sửa thành:
echo "Hello World";
Rồi tiếp tục sửa:
echo "Hello DCSoftTech";
Nếu không sử dụng Git, bạn có thể phải tự tạo các file như:
index_v1.php
index_v2.php
index_final.php
index_final_new.php
index_final_new_2.php
Đây rõ ràng không phải cách quản lý code tốt.
Với Git, bạn chỉ cần lưu các phiên bản thay đổi bằng Commit:
Commit 1
Hello
Commit 2
Hello World
Commit 3
Hello DCSoftTech
Khi cần, bạn có thể xem lại lịch sử hoặc khôi phục về một phiên bản trước đó.
Git giải quyết một số vấn đề rất quan trọng trong quá trình phát triển phần mềm.
Git ghi nhận mỗi lần bạn tạo Commit.
Bạn có thể biết:
Ví dụ:
a81f23c Fix login validation
b72e91a Add user authentication
c51d20f Create login page
Nếu một thay đổi mới làm chương trình bị lỗi, Git cho phép bạn kiểm tra và khôi phục code về trạng thái trước đó.
Ví dụ:
Version 1 → chạy tốt
Version 2 → chạy tốt
Version 3 → xuất hiện lỗi
Bạn có thể tìm lại Version 2 để xác định vấn đề hoặc khôi phục trạng thái cần thiết.
Đây là một trong những lý do Git trở nên cực kỳ quan trọng.
Ví dụ một team có:
Developer A
Developer B
Developer C
Cả ba người có thể cùng làm việc trên một dự án.
Mỗi người có thể tạo một nhánh riêng:
main
├── feature/login
├── feature/payment
└── feature/profile
Sau khi hoàn thành, các thay đổi có thể được đưa trở lại nhánh chính.
Git là hệ thống phân tán.
Khi clone một Repository, máy tính của bạn không chỉ nhận các file code hiện tại mà còn nhận cả lịch sử Git của Repository.
Do đó, rất nhiều thao tác Git có thể thực hiện ngay cả khi không có Internet:
git log
git diff
git commit
git branch
git checkout
Internet chủ yếu cần thiết khi bạn muốn đồng bộ với Repository từ xa:
git push
git pull
git fetch
Để hiểu Git, trước tiên cần hiểu 4 thành phần quan trọng:
Working Directory
↓
Staging Area
↓
Local Repository
↓
Remote Repository
Có thể hình dung đơn giản như sau:
Code bạn đang sửa
↓
git add
↓
Staging Area
↓
git commit
↓
Local Repository
↓
git push
↓
Remote Repository
Bây giờ hãy xem từng thành phần.
Working Directory là thư mục dự án mà bạn đang làm việc.
Ví dụ:
my-project/
├── index.php
├── login.php
├── style.css
└── app.js
Khi bạn sửa:
login.php
Git sẽ phát hiện file này đã thay đổi.
Bạn có thể kiểm tra bằng:
git status
Ví dụ Git có thể hiển thị:
modified: login.php
Điều đó có nghĩa là file đã thay đổi nhưng chưa được đưa vào Commit.
Sau khi sửa code, bạn chưa Commit ngay mà thường đưa những thay đổi muốn lưu vào Staging Area.
Ví dụ:
git add login.php
Lúc này:
login.php
↓
Staging Area
Bạn có thể hiểu Staging Area như một khu vực chuẩn bị Commit.
Điều này đặc biệt hữu ích khi bạn sửa nhiều file nhưng chỉ muốn Commit một số thay đổi.
Ví dụ:
index.php modified
login.php modified
style.css modified
Bạn chỉ muốn Commit login.php:
git add login.php
git commit -m "Fix login validation"
Hai file còn lại vẫn chưa được Commit.
Sau khi chạy:
git commit -m "Fix login validation"
Git sẽ lưu thay đổi vào Local Repository trên máy tính của bạn.
Có thể hình dung:
Working Directory
↓
git add
↓
Staging Area
↓
git commit
↓
Local Repository
Mỗi Commit sẽ trở thành một điểm trong lịch sử của dự án.
Ví dụ:
Commit A
↓
Commit B
↓
Commit C
↓
Commit D
Mỗi Commit có một mã định danh riêng, thường được gọi là Commit Hash.
Ví dụ:
a81f23c9...
Nhờ đó Git có thể xác định chính xác từng phiên bản thay đổi.
Remote Repository là Repository được lưu trên một máy chủ hoặc dịch vụ bên ngoài.
Một số nền tảng phổ biến:
Ví dụ:
Local Repository
↓
git push
↓
Remote Repository
Sau khi Commit code trên máy tính:
git commit -m "Add login feature"
Bạn có thể đẩy Commit lên Remote:
git push
Lúc này các Commit trên máy tính được đồng bộ lên Repository từ xa.
Một lỗi hiểu khá phổ biến của người mới là nghĩ:
Commit là việc lưu file.
Thực tế, Commit giống như một mốc ghi nhận trạng thái của dự án.
Ví dụ:
Commit 1
Add login page
Commit 2
Add password validation
Commit 3
Fix login error
Commit 4
Add remember me
Git sử dụng những Commit này để xây dựng lịch sử của Repository.
Bạn có thể xem lịch sử bằng:
git log
Ví dụ:
commit a81f23c
Author: Developer
Message: Add remember me
commit b72e91a
Author: Developer
Message: Fix login error
commit c51d20f
Author: Developer
Message: Add password validation
Một tính năng rất mạnh của Git là Branch.
Branch cho phép bạn phát triển một tính năng mà không ảnh hưởng trực tiếp đến code chính.
Ví dụ:
main
│
├── feature/login
│
└── feature/payment
Bạn có thể tạo Branch:
git switch -c feature/login
Sau đó phát triển chức năng Login.
Các Commit của bạn sẽ nằm trên Branch đó:
main
│
A
│
B
│
└── C ── D ── E
feature/login
Khi hoàn thành, Branch có thể được Merge vào main.
Giả sử:
main
│
A
│
B
│
└── C ── D
feature/login
Sau khi hoàn thành Login, bạn có thể Merge:
git switch main
git merge feature/login
Git sẽ kết hợp những thay đổi từ feature/login vào main.
Kết quả có thể hình dung:
C ── D
/ \
A ── B ─────── M
Trong đó M là Merge Commit.
Không.
Đây là điểm rất nhiều người mới nhầm lẫn.
Là công cụ quản lý phiên bản chạy trên máy tính.
Ví dụ:
git commit
git branch
git merge
Là một nền tảng cung cấp dịch vụ lưu trữ Git Repository và nhiều tính năng hỗ trợ phát triển phần mềm.
Ví dụ:
Git
↓
Local Repository
↓
GitHub
↓
Remote Repository
Bạn hoàn toàn có thể sử dụng Git mà không cần GitHub.
Ngược lại, GitHub sử dụng Git làm nền tảng quản lý mã nguồn.
Đây là hai lệnh người mới sử dụng rất thường xuyên.
git pushĐẩy Commit từ máy tính lên Remote Repository:
Local
↓
git push
↓
Remote
Ví dụ:
git push origin main
git pullLấy những thay đổi mới từ Remote về máy tính:
Remote
↓
git pull
↓
Local
Ví dụ:
git pull origin main
Có thể hiểu đơn giản:
push = đẩy code lên
pull = lấy code về
Một quy trình làm việc hàng ngày có thể như sau:
git pull
Ví dụ:
login.php
git status
git add login.php
git commit -m "Fix login validation"
git push
Toàn bộ quy trình:
Sửa code
↓
git status
↓
git add
↓
git commit
↓
git push
↓
GitHub/GitLab
Git mang lại một số lợi ích rất lớn:
Quản lý lịch sử
Bạn luôn biết code đã thay đổi như thế nào.
An toàn hơn
Có thể kiểm tra và khôi phục những thay đổi trước đó.
Làm việc nhóm
Nhiều Developer có thể cùng phát triển một dự án.
Phát triển tính năng độc lập
Branch giúp tách các tính năng và thay đổi khỏi code chính.
Hỗ trợ Code Review
Git kết hợp với GitHub/GitLab giúp Team kiểm tra code trước khi đưa vào nhánh chính.
Làm việc linh hoạt
Bạn có thể Commit và quản lý lịch sử ngay trên máy tính mà không cần Internet.
Có thể nhớ Git bằng sơ đồ đơn giản:
┌──────────────────┐
│ Working Directory│
│ Code đang sửa │
└────────┬─────────┘
│ git add
↓
┌──────────────────┐
│ Staging Area │
│ Code chuẩn bị │
│ Commit │
└────────┬─────────┘
│ git commit
↓
┌──────────────────┐
│ Local Repository │
│ Lịch sử Commit │
└────────┬─────────┘
│ git push
↓
┌──────────────────┐
│ Remote Repository│
│ GitHub / GitLab │
└──────────────────┘
Chỉ cần nắm được luồng này, bạn đã hiểu được nền tảng quan trọng nhất của Git:
Sửa code
↓
git add
↓
git commit
↓
git push
Sau khi hiểu Git hoạt động như thế nào, các lệnh như git branch, git merge, git rebase, git stash, git reset hay git revert sẽ trở nên dễ hiểu hơn rất nhiều.
Git không đơn thuần là một công cụ để “lưu code”. Nó là hệ thống giúp Developer quản lý lịch sử thay đổi, thử nghiệm tính năng, làm việc nhóm và kiểm soát quá trình phát triển phần mềm.
Nếu mới học Git, bạn không cần ghi nhớ hàng chục lệnh ngay từ đầu. Hãy bắt đầu với những lệnh cốt lõi:
git init
git clone
git status
git add
git commit
git pull
git push
git branch
git merge
Nắm chắc những lệnh này trước, sau đó học tiếp các tính năng nâng cao của Git sẽ dễ dàng hơn rất nhiều.