Hiểu Kiến Trúc và Cơ Chế Hoạt Động Bên Trong Git Dành Cho DevOps, Automation Engineer và DevSecOps
Khi làm việc với Infrastructure as Code (Terraform, Ansible), CI/CD Pipeline hoặc phát triển phần mềm hiện đại, gần như mọi công cụ đều xoay quanh một thành phần trung tâm: Git.
Nhưng Git không chỉ đơn giản là một nơi để lưu source code. Bên trong Git là cả một cơ chế quản lý phiên bản cực kỳ thông minh dựa trên snapshot, object, hash và branch, giúp các nhóm phát triển có thể cộng tác hiệu quả mà vẫn giữ được tính độc lập và khả năng khôi phục gần như tuyệt đối.
Git là gì?
Git (Distributed Version Control System - DVCS) là một hệ thống quản lý phiên bản phân tán dùng để theo dõi và quản lý quá trình phát triển của dự án.
Khác với các hệ thống quản lý mã nguồn tập trung, mỗi thành viên trong nhóm đều sở hữu một bản sao hoàn chỉnh của repository trên máy cá nhân. Điều này cho phép:
Git đặc biệt phù hợp với các quy trình:
Kiến trúc Git
Git được xây dựng theo mô hình phân tán gồm:
Remote Repository
|
--------------------------------
| | |
Local Git 1 Local Git 2 Local Git 3
Mỗi Local Git Environment bao gồm:
Working Directory
↓
Staging Area
↓
Local Repository
1. Remote Repository
Remote Repository là nơi lưu trữ project dùng chung cho toàn bộ nhóm.
Ví dụ:
Chức năng:
Ví dụ:
git clone
git fetch
git pull
git push
2. Local Repository
Local Repository là bản sao của Remote Repository trên máy cá nhân.
Mỗi developer có thể:
Các commit cục bộ sẽ được đồng bộ bằng:
git fetch
git pull
git push
Điểm mạnh của Git nằm ở đây. Mỗi máy đều có:
Nói cách khác, mỗi developer đều sở hữu một Git Server thu nhỏ trên máy của mình.
3. Working Directory
Working Directory là thư mục làm việc thực tế trên hệ điều hành.
Đây là nơi:
Git liên tục so sánh trạng thái file trong Working Directory với snapshot gần nhất.
Các trạng thái phổ biến: Modified
File đã thay đổi:
config.yaml
main.py
terraform.tf Untracked
File mới chưa được Git quản lý:
secret.txt
test.sh
new.tf
Kiểm tra trạng thái:
git status
Ví dụ:
git status
Output:
modified: app.py
untracked: test.sh
4. Staging Area (Index)
Staging Area là vùng đệm chuẩn bị cho commit tiếp theo.
File được đưa vào Staging bằng:
git add
Ví dụ:
git add app.py
git add .
Khi file được đưa vào Staging:
Lưu ý:
Chỉ những file nằm trong Staging Area mới được commit.
Ví dụ:
git commit -m "Fix login bug"
Nếu file chưa được stage:
Working Directory
→ sẽ không xuất hiện trong commit.
Chu trình hoạt động của Git
Working Directory
|
git add
↓
Staging Area
|
git commit
↓
Local Repository
|
git push
↓
Remote Repository
Đây chính là workflow mà mọi CI/CD pipeline hiện đại đều đang sử dụng.
Git Objects – Trái Tim Của Git
Git không lưu file theo cách truyền thống.
Git lưu trữ dữ liệu dưới dạng các Object.
Có ba loại object cơ bản: Blob
Lưu nội dung thực tế của file.
Ví dụ:
main.py
docker-compose.yml
inventory.yml
Tree
Lưu cấu trúc thư mục.
Chứa:
Ví dụ:
project/
├── app.py
├── Dockerfile
└── ansible/
Commit
Commit object chứa:
Ví dụ:
Commit
└── Tree
├── Blob
├── Blob
└── Tree
SHA-1 Hash – Danh tính của mọi Object
Mỗi Git Object được định danh bằng:
40-character SHA-1 Hash
Ví dụ:
9fceb02c1d...
Hash được sử dụng để:
Thông thường Git chỉ hiển thị:
9fceb
hoặc
9fceb02
Miễn là phần hash này là duy nhất.
Snapshot – Bí mật khiến Git hoạt động cực nhanh
Nhiều người nghĩ Git lưu sự khác biệt (delta) giữa các phiên bản.
Thực tế, Git hoạt động dựa trên Snapshot.
Snapshot là một Tree Object chứa con trỏ đến toàn bộ file được Git theo dõi tại thời điểm commit.
Ví dụ:
Commit A
└── Snapshot A
Commit B
└── Snapshot B
Nếu chỉ sửa:
app.py
thì Git chỉ tạo thêm:
Các file còn lại vẫn sử dụng object cũ thông qua pointer.
Ví dụ:
config.yml
Dockerfile
README.md
vẫn giữ nguyên hash.
Đây chính là lý do:
Branch Thực Chất Là Gì?
Mỗi commit lưu:
Parent Commit Pointer
Kết quả:
A → B → C → D
hình thành một chuỗi commit gọi là:
Branch
Các loại commit: Initial Commit
Không có parent. Normal Commit
Có một parent. Merge Commit
Có nhiều parent.
Ví dụ:
main
A → B → C
feature
↘ D → E
Merge
A → B → C → M
↘ D → E ↗
Xem lịch sử commit
git log
Thông tin hiển thị:
Ví dụ:
git log --oneline
Output:
a1b2c Fix login bug
d3e4f Add Terraform module
e5f6a Update README
Kiểm tra nội dung object
Xem nội dung commit:
git cat-file
Kiểm tra trạng thái Working Directory:
git ls-files --modified
Kiểm tra Staging Area:
git ls-files --stage
Khi sửa và stage một file, bạn sẽ thấy:
Do đó mỗi commit chỉ tạo thêm một số object nhỏ:
Đây chính là bí quyết giúp Git có thể quản lý hàng triệu file và hàng trăm nghìn commit với hiệu năng cực cao.
Tóm tắt
Git không phải là công cụ lưu file đơn thuần mà là một content-addressable filesystem được xây dựng từ:
Blob
Tree
Commit
SHA-1 Hash
Snapshot
Branch
Kiến trúc:
Working Directory
↓
Staging Area
↓
Local Repository
↓
Remote Repository
Việc hiểu rõ cơ chế bên trong của Git sẽ giúp DevOps Engineer, Automation Engineer và DevSecOps Engineer:
Trong thế giới DevOps hiện đại, hiểu Git ở mức object và snapshot không còn là kiến thức "nice to have" mà đã trở thành một kỹ năng nền tảng bắt buộc đối với mọi kỹ sư hạ tầng và tự động hóa.
Khi làm việc với Infrastructure as Code (Terraform, Ansible), CI/CD Pipeline hoặc phát triển phần mềm hiện đại, gần như mọi công cụ đều xoay quanh một thành phần trung tâm: Git.
Nhưng Git không chỉ đơn giản là một nơi để lưu source code. Bên trong Git là cả một cơ chế quản lý phiên bản cực kỳ thông minh dựa trên snapshot, object, hash và branch, giúp các nhóm phát triển có thể cộng tác hiệu quả mà vẫn giữ được tính độc lập và khả năng khôi phục gần như tuyệt đối.
Git là gì?
Git (Distributed Version Control System - DVCS) là một hệ thống quản lý phiên bản phân tán dùng để theo dõi và quản lý quá trình phát triển của dự án.
Khác với các hệ thống quản lý mã nguồn tập trung, mỗi thành viên trong nhóm đều sở hữu một bản sao hoàn chỉnh của repository trên máy cá nhân. Điều này cho phép:
- Làm việc offline
- Phát triển độc lập
- Tạo branch riêng
- Theo dõi toàn bộ lịch sử thay đổi
- Đồng bộ với repository trung tâm khi cần
Git đặc biệt phù hợp với các quy trình:
- Continuous Integration (CI)
- Continuous Deployment (CD)
- DevOps
- DevSecOps
- Infrastructure as Code (IaC)
Kiến trúc Git
Git được xây dựng theo mô hình phân tán gồm:
Remote Repository
|
--------------------------------
| | |
Local Git 1 Local Git 2 Local Git 3
Mỗi Local Git Environment bao gồm:
Working Directory
↓
Staging Area
↓
Local Repository
1. Remote Repository
Remote Repository là nơi lưu trữ project dùng chung cho toàn bộ nhóm.
Ví dụ:
- GitHub
- GitLab
- BitBucket
- Internal Git Server
Chức năng:
- Lưu trữ source code tập trung
- Đồng bộ giữa các thành viên
- Là nơi thực hiện Pull Request/Merge Request
- Tích hợp CI/CD Pipeline
Ví dụ:
git clone
git fetch
git pull
git push
2. Local Repository
Local Repository là bản sao của Remote Repository trên máy cá nhân.
Mỗi developer có thể:
- Commit độc lập
- Tạo branch riêng
- Thử nghiệm tính năng mới
- Làm việc offline
Các commit cục bộ sẽ được đồng bộ bằng:
git fetch
git pull
git push
Điểm mạnh của Git nằm ở đây. Mỗi máy đều có:
- Source code
- Branch
- Commit history
- Metadata
Nói cách khác, mỗi developer đều sở hữu một Git Server thu nhỏ trên máy của mình.
3. Working Directory
Working Directory là thư mục làm việc thực tế trên hệ điều hành.
Đây là nơi:
- Viết code
- Chỉnh sửa file
- Tạo file mới
- Xóa file
Git liên tục so sánh trạng thái file trong Working Directory với snapshot gần nhất.
Các trạng thái phổ biến: Modified
File đã thay đổi:
config.yaml
main.py
terraform.tf Untracked
File mới chưa được Git quản lý:
secret.txt
test.sh
new.tf
Kiểm tra trạng thái:
git status
Ví dụ:
git status
Output:
modified: app.py
untracked: test.sh
4. Staging Area (Index)
Staging Area là vùng đệm chuẩn bị cho commit tiếp theo.
File được đưa vào Staging bằng:
git add
Ví dụ:
git add app.py
git add .
Khi file được đưa vào Staging:
- File trở thành tracked file
- Snapshot mới được tạo
- Chuẩn bị đưa vào commit
Lưu ý:
Chỉ những file nằm trong Staging Area mới được commit.
Ví dụ:
git commit -m "Fix login bug"
Nếu file chưa được stage:
Working Directory
→ sẽ không xuất hiện trong commit.
Chu trình hoạt động của Git
Working Directory
|
git add
↓
Staging Area
|
git commit
↓
Local Repository
|
git push
↓
Remote Repository
Đây chính là workflow mà mọi CI/CD pipeline hiện đại đều đang sử dụng.
Git Objects – Trái Tim Của Git
Git không lưu file theo cách truyền thống.
Git lưu trữ dữ liệu dưới dạng các Object.
Có ba loại object cơ bản: Blob
Lưu nội dung thực tế của file.
Ví dụ:
main.py
docker-compose.yml
inventory.yml
Tree
Lưu cấu trúc thư mục.
Chứa:
- Pointer đến Blob
- Pointer đến Tree khác
Ví dụ:
project/
├── app.py
├── Dockerfile
└── ansible/
Commit
Commit object chứa:
- Pointer đến Snapshot (Tree)
- Date/Time
- Parent Commit
- Commit Message
- Author
- Committer
Ví dụ:
Commit
└── Tree
├── Blob
├── Blob
└── Tree
SHA-1 Hash – Danh tính của mọi Object
Mỗi Git Object được định danh bằng:
40-character SHA-1 Hash
Ví dụ:
9fceb02c1d...
Hash được sử dụng để:
- So sánh thay đổi
- Truy xuất object cực nhanh
- Liên kết object
- Kiểm tra tính toàn vẹn dữ liệu
Thông thường Git chỉ hiển thị:
9fceb
hoặc
9fceb02
Miễn là phần hash này là duy nhất.
Snapshot – Bí mật khiến Git hoạt động cực nhanh
Nhiều người nghĩ Git lưu sự khác biệt (delta) giữa các phiên bản.
Thực tế, Git hoạt động dựa trên Snapshot.
Snapshot là một Tree Object chứa con trỏ đến toàn bộ file được Git theo dõi tại thời điểm commit.
Ví dụ:
Commit A
└── Snapshot A
Commit B
└── Snapshot B
Nếu chỉ sửa:
app.py
thì Git chỉ tạo thêm:
- Blob mới của app.py
- Tree mới
- Commit mới
Các file còn lại vẫn sử dụng object cũ thông qua pointer.
Ví dụ:
config.yml
Dockerfile
README.md
vẫn giữ nguyên hash.
Đây chính là lý do:
- Commit rất nhanh
- Branch rất nhẹ
- Merge hiệu quả
- Repository có hiệu năng cao
Branch Thực Chất Là Gì?
Mỗi commit lưu:
Parent Commit Pointer
Kết quả:
A → B → C → D
hình thành một chuỗi commit gọi là:
Branch
Các loại commit: Initial Commit
Không có parent. Normal Commit
Có một parent. Merge Commit
Có nhiều parent.
Ví dụ:
main
A → B → C
feature
↘ D → E
Merge
A → B → C → M
↘ D → E ↗
Xem lịch sử commit
git log
Thông tin hiển thị:
- Commit Hash
- Author
- Date
- Commit Message
Ví dụ:
git log --oneline
Output:
a1b2c Fix login bug
d3e4f Add Terraform module
e5f6a Update README
Kiểm tra nội dung object
Xem nội dung commit:
git cat-file
Kiểm tra trạng thái Working Directory:
git ls-files --modified
Kiểm tra Staging Area:
git ls-files --stage
Khi sửa và stage một file, bạn sẽ thấy:
- Chỉ file thay đổi có hash mới
- Các file còn lại giữ nguyên hash
Do đó mỗi commit chỉ tạo thêm một số object nhỏ:
- Commit Object
- Snapshot Object
- Blob của file đã thay đổi
Đây chính là bí quyết giúp Git có thể quản lý hàng triệu file và hàng trăm nghìn commit với hiệu năng cực cao.
Tóm tắt
Git không phải là công cụ lưu file đơn thuần mà là một content-addressable filesystem được xây dựng từ:
Blob
Tree
Commit
SHA-1 Hash
Snapshot
Branch
Kiến trúc:
Working Directory
↓
Staging Area
↓
Local Repository
↓
Remote Repository
Việc hiểu rõ cơ chế bên trong của Git sẽ giúp DevOps Engineer, Automation Engineer và DevSecOps Engineer:
- Tự tin xử lý merge conflict
- Thiết kế CI/CD Pipeline hiệu quả
- Tối ưu Git workflow
- Hiểu cách GitLab/GitHub Actions hoạt động
- Dễ dàng làm chủ các công cụ IaC như Terraform, Ansible và Kubernetes GitOps
Trong thế giới DevOps hiện đại, hiểu Git ở mức object và snapshot không còn là kiến thức "nice to have" mà đã trở thành một kỹ năng nền tảng bắt buộc đối với mọi kỹ sư hạ tầng và tự động hóa.