0

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 .git nế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"

.gitignore ngă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 restore có 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 .gitignore ignore.


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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí