Lab 10 — Git Fundamentals
1. Mục tiêu
Ở các Lab trước, chúng ta tập trung vào quản trị Linux và troubleshooting server.
Từ Lab 10, chúng ta bắt đầu bước vào một kỹ năng cực kỳ quan trọng của DevOps:
Git — quản lý source code và lịch sử thay đổi.
Sau lab này, bạn cần:
- Hiểu Git và Git repository.
- Hiểu
working directory,staging area,repository. - Biết commit đúng cách.
- Biết xem lịch sử thay đổi.
- Biết
diff,restore,reset. - Biết
.gitignore. - Biết làm việc với remote repository.
- Có workflow Git cơ bản giống môi trường thực tế.
2. Git là gì?
Git là hệ thống Version Control System (VCS).
Nó giúp chúng ta:
Code
↓
Thay đổi
↓
Commit
↓
Lịch sử
Ví dụ:
v1 → v2 → v3 → v4
Nếu v4 bị lỗi, chúng ta có thể xem:
Ai thay đổi?
Thay đổi gì?
Thay đổi khi nào?
Và có thể quay lại version trước.
3. Tại sao DevOps cần Git?
Trong môi trường thực tế, Git không chỉ chứa source code.
Repository có thể chứa:
Application
Dockerfile
Helm Chart
Kubernetes YAML
Ansible
Terraform
CI/CD Pipeline
Monitoring configuration
Đặc biệt với GitOps:
Git
│
│ Desired State
▼
ArgoCD
│
▼
Kubernetes
Vì vậy:
Git là một trong những nền móng quan trọng nhất của DevOps.
4. Cài Git
Kiểm tra:
git --version
Ubuntu:
sudo apt update
sudo apt install git
macOS:
brew install git
Kiểm tra:
git --version
Ví dụ:
git version 2.x.x
5. Cấu hình Git
Git cần biết bạn là ai.
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
Kiểm tra:
git config --global --list
6. Git Repository
Tạo project:
mkdir lab10
cd lab10
Khởi tạo Git:
git init
Git tạo thư mục:
.git/
Kiểm tra:
ls -la
Có thể thấy:
.git
.git chứa metadata và lịch sử của repository.
Không xóa
.gitnếu bạn không muốn biến repository thành một thư mục bình thường.
7. Ba khu vực quan trọng của Git
Đây là kiến thức cần nhớ nhất:
Working Directory
│
│ git add
▼
Staging Area
│
│ git commit
▼
Repository
Có thể hiểu:
Working Directory
File bạn đang chỉnh sửa.
Staging Area
Những thay đổi bạn muốn đưa vào commit tiếp theo.
Repository
Lịch sử commit đã được Git lưu lại.
8. Tạo file đầu tiên
echo "# Lab 10" > README.md
Kiểm tra:
git status
Bạn sẽ thấy:
Untracked files:
README.md
Git phát hiện file nhưng chưa theo dõi.
9. git add
Đưa file vào staging:
git add README.md
Kiểm tra:
git status
Bây giờ:
Changes to be committed:
new file: README.md
Flow:
README.md
│
│ git add
▼
Staging Area
10. git commit
Commit:
git commit -m "docs: add README"
Kiểm tra:
git status
Kết quả:
nothing to commit, working tree clean
Flow hoàn chỉnh:
Edit
↓
git add
↓
git commit
11. Commit là gì?
Một commit là một snapshot của repository tại một thời điểm.
Ví dụ:
A
│
├── Initial project
│
B
│
├── Add API
│
C
│
├── Add authentication
│
D
│
└── Fix login bug
Mỗi commit có:
- Commit ID.
- Author.
- Timestamp.
- Commit message.
- Changes.
12. Xem lịch sử
git log
Dạng ngắn:
git log --oneline
Ví dụ:
a82f1c2 fix: handle login error
b51a901 feat: add authentication
f82e120 docs: add README
Thường dùng:
git log --oneline --graph --decorate
Rất hữu ích khi repository có nhiều branch.
13. git diff
Tạo thay đổi:
echo "Git Fundamentals" >> README.md
Sau đó:
git diff
Git cho bạn biết:
- dòng cũ
+ dòng mới
Điều này cực kỳ hữu ích trước khi commit.
Thói quen tốt
Trước khi:
git add .
hãy xem:
git diff
để chắc chắn bạn không commit nhầm.
14. git diff --staged
Sau:
git add README.md
Dùng:
git diff --staged
để xem:
Những gì sẽ được commit.
Flow:
Working Directory
│
│ git diff
▼
Thay đổi chưa stage
Staging Area
│
│ git diff --staged
▼
Thay đổi chuẩn bị commit
15. git add . — Cẩn thận
Bạn thường thấy:
git add .
Nó tiện, nhưng có rủi ro.
Ví dụ:
project/
├── src/
├── config/
├── .env
└── debug.log
Bạn chạy:
git add .
có thể vô tình stage:
.env
debug.log
Trong đó .env có thể chứa:
DATABASE_PASSWORD=...
API_KEY=...
Không nên commit secret.
16. .gitignore
Tạo:
touch .gitignore
Ví dụ:
.env
*.log
node_modules/
target/
dist/
.idea/
.vscode/
Sau đó:
git add .gitignore
git add .
Kiểm tra:
git status
.env sẽ không xuất hiện nếu nó chưa từng được track.
17. Một lỗi rất hay gặp với .gitignore
Nếu bạn đã commit:
.env
sau đó mới thêm:
.env
thì .gitignore không tự xóa file khỏi Git tracking.
Cần:
git rm --cached .env
Sau đó:
git commit -m "chore: stop tracking env file"
.gitignorengăn file chưa được track được thêm vào Git. Nó không phải công cụ xóa secret đã tồn tại trong history.
18. git restore
Tạo thay đổi:
echo "temporary change" >> README.md
Xem:
git diff
Nếu muốn bỏ thay đổi chưa commit:
git restore README.md
Kiểm tra:
git status
File quay lại trạng thái của commit gần nhất.
19. Restore file đã stage
Nếu đã:
git add README.md
nhưng đổi ý:
git restore --staged README.md
Điều này:
Không xóa thay đổi
mà chỉ:
Staging Area
↓
Working Directory
20. git reset
Một command bạn sẽ gặp rất nhiều:
git reset
Trong trường hợp đơn giản, nó bỏ file khỏi staging.
Ví dụ:
git add README.md
git reset README.md
File vẫn còn thay đổi trong working directory nhưng không còn staged.
Trong Git hiện đại, bạn có thể ưu tiên:
git restore --staged README.md
vì rõ nghĩa hơn.
21. Commit message tốt
Không nên:
git commit -m "update"
hoặc:
git commit -m "fix"
Nên viết:
git commit -m "fix: handle nginx upstream timeout"
hoặc:
git commit -m "feat: add health check endpoint"
Ví dụ convention phổ biến:
feat: thêm tính năng
fix: sửa bug
docs: documentation
refactor: refactor code
test: test
chore: maintenance
22. Một commit nên làm một việc
Không nên:
Commit:
- Add login
- Fix nginx
- Update README
- Upgrade Docker
- Remove debug code
Nên tách:
feat: add login
fix: update nginx upstream
docs: update README
chore: upgrade docker image
Lợi ích:
Dễ review
Dễ rollback
Dễ debug
Dễ cherry-pick
23. Remote Repository
Git local:
Your Computer
│
▼
Local Git Repository
Remote repository có thể nằm trên GitHub/GitLab/Bitbucket.
Mô hình:
Local
│
│ git push
▼
Remote
và:
Remote
│
│ git pull
▼
Local
24. Kết nối Remote
Ví dụ:
git remote add origin <REMOTE_URL>
Kiểm tra:
git remote -v
Bạn sẽ thấy:
origin <REMOTE_URL> (fetch)
origin <REMOTE_URL> (push)
origin chỉ là tên convention cho remote repository chính.
25. Push
Kiểm tra branch:
git branch
Nếu branch là:
master
có thể đổi thành:
git branch -M main
Push:
git push -u origin main
-u thiết lập upstream.
Sau đó thường chỉ cần:
git push
26. Clone
Nếu repository đã tồn tại trên remote:
git clone <REMOTE_URL>
Git sẽ:
Download source
+
Download history
Ví dụ:
git clone <REMOTE_URL> lab10-clone
Sau đó:
cd lab10-clone
git status
27. Fetch vs Pull
Đây là điểm cần hiểu rõ.
git fetch
git fetch
Chỉ lấy thông tin mới từ remote.
Không tự thay đổi working directory của bạn.
Remote
│
│ fetch
▼
Local Git
git pull
git pull
Thường tương đương:
fetch
+
integrate changes
Có thể hình dung:
git pull
↓
git fetch
↓
merge/rebase
28. Thực hành Remote
Tạo file:
echo "Git Remote" >> README.md
Commit:
git add README.md
git commit -m "docs: add git remote section"
Push:
git push
Sau đó kiểm tra repository trên GitHub/GitLab.
Bạn sẽ thấy commit mới.
29. Git Workflow cơ bản
Một workflow đơn giản:
Edit
│
▼
git status
│
▼
git diff
│
▼
git add
│
▼
git diff --staged
│
▼
git commit
│
▼
git push
Hãy tập workflow này thành thói quen.
30. Challenge 1 — Git từ đầu
Tạo:
lab10-project/
├── README.md
├── app.txt
└── .gitignore
Nội dung:
README.md
→ Git Lab 10
app.txt
→ Hello DevOps
.gitignore:
*.log
.env
Sau đó:
git init
git status
git add .
git commit -m "chore: initialize project"
Kiểm tra:
git log --oneline
31. Challenge 2 — Theo dõi thay đổi
Sửa:
echo "Version 2" >> app.txt
Sau đó lần lượt chạy:
git status
git diff
git add app.txt
git diff --staged
git commit -m "feat: update application"
Mục tiêu là hiểu rõ:
Modified
↓
Staged
↓
Committed
32. Challenge 3 — Khôi phục file
Sửa:
echo "Wrong change" >> app.txt
Kiểm tra:
git diff
Sau đó:
git restore app.txt
Kiểm tra:
git status
Bạn vừa loại bỏ thay đổi chưa commit.
Cẩn thận:
git restorecó thể làm mất những thay đổi local chưa được commit.
33. Challenge 4 — Tạo secret giả
Tạo:
echo "DB_PASSWORD=123456" > .env
Nếu .env đã nằm trong .gitignore:
git status
.env không nên xuất hiện.
Kiểm tra:
git check-ignore -v .env
Command này rất hữu ích để biết:
File đang bị rule nào trong
.gitignoreignore.
34. Challenge 5 — Cố tình commit nhầm
Tạm thời bỏ .env khỏi .gitignore.
Sau đó:
git add .env
git commit -m "test: commit env"
Bây giờ thêm lại:
.env
Nhưng:
git status
.env vẫn có thể được Git theo dõi.
Xử lý:
git rm --cached .env
Sau đó:
git commit -m "chore: remove env from tracking"
Bài học
Secret không nên xuất hiện trong Git history ngay từ đầu.
Nếu secret thật đã bị commit/push:
Không chỉ xóa file rồi commit tiếp.
Bạn phải coi secret đó đã bị lộ và rotate/revoke credential.
35. Debug Git bằng git status
Trong quá trình làm việc, nếu không biết repository đang ở trạng thái nào:
git status
Đây gần như là:
Command đầu tiên nên chạy khi bạn không biết chuyện gì đang xảy ra.
Ví dụ:
modified
untracked
staged
ahead
behind
đều có thể được nhìn thấy từ git status.
36. Một số command cần nhớ
| Command | Mục đích |
|---|---|
git init |
Tạo repository |
git clone |
Clone repository |
git status |
Xem trạng thái |
git add |
Stage thay đổi |
git commit |
Tạo commit |
git log |
Xem lịch sử |
git diff |
Xem thay đổi |
git restore |
Khôi phục thay đổi |
git reset |
Bỏ stage/reset |
git fetch |
Lấy thay đổi từ remote |
git pull |
Fetch + integrate |
git push |
Đẩy commit lên remote |
git remote -v |
Xem remote |
37. Một workflow thực tế
Khi bắt đầu một task:
git status
Làm việc:
Edit
↓
Edit
↓
Test
Trước khi commit:
git diff
Stage:
git add <files>
Kiểm tra:
git diff --staged
Commit:
git commit -m "feat: ..."
Cuối cùng:
git push
Đây là workflow rất đơn giản nhưng cực kỳ quan trọng.
38. Những lỗi người mới thường gặp
1. Commit tất cả bằng git add .
Có thể vô tình commit:
.env
*.log
build/
node_modules/
→ Dùng .gitignore.
2. Commit message quá chung chung
Không nên:
update
fix
test
change
Nên:
fix: handle database connection timeout
3. Không kiểm tra diff
Trước commit:
git diff
git diff --staged
giúp tránh commit nhầm.
4. Commit secret
Không commit:
Password
API Key
Private Key
Token
Credential
Nếu đã push secret thật:
Rotate secret ngay.
Đừng nghĩ git rm là đủ.
39. Git trong DevOps
Git không chỉ dành cho Developer.
Sau này bạn có thể có repository:
devops-platform/
├── ansible/
├── terraform/
├── kubernetes/
├── helm/
├── monitoring/
├── logging/
└── pipelines/
Mỗi thay đổi:
Git Commit
↓
Review
↓
CI
↓
CD
↓
Production
Đây chính là nền móng của:
Infrastructure as Code
GitOps
CI/CD
40. Kết quả cần đạt
Sau Lab 10, bạn phải hiểu rõ flow:
Git
│
┌─────────┴─────────┐
│ │
Working Directory Repository
│ │
│ git add │
▼ │
Staging Area │
│ │
│ git commit │
└───────────────────┘
│
▼
git push
│
▼
GitHub/GitLab
Và workflow:
Edit
↓
git status
↓
git diff
↓
git add
↓
git diff --staged
↓
git commit
↓
git push
Quan trọng nhất
Đừng cố học thuộc hàng trăm Git command.
Hãy nắm chắc:
git status
git add
git diff
git diff --staged
git commit
git log
git restore
git fetch
git pull
git push
Nếu bạn sử dụng thành thạo nhóm command này và hiểu Working Directory → Staging → Commit → Remote, bạn đã có nền móng Git đủ tốt để bước sang Lab 11 — Git Branching & Collaboration, nơi chúng ta sẽ mô phỏng workflow làm việc thực tế của một team DevOps/Developer:
main
│
├── feature/login
│
├── feature/payment
│
└── fix/nginx
│
▼
Pull Request
│
▼
Code Review
│
▼
main
│
▼
CI/CD
All rights reserved