Chuyển tới nội dung chính

01 - Git Overview: Git Là Gì & Tại Sao Cần Git?

Đối tượng: Junior mới onboard Thời gian học: 30-45 phút Mục tiêu: Hiểu Git giải quyết vấn đề gì, không còn sợ Git


📖 Mục Lục

  1. Vấn Đề Trước Khi Có Git
  2. Git Là Gì?
  3. Git vs SVN
  4. Các Khái Niệm Cơ Bản
  5. Cài Đặt Git
  6. Cấu Hình Ban Đầu

1. Vấn Đề Trước Khi Có Git

😱 Kịch bản kinh điển

project/
├── code_v1.zip
├── code_v2.zip
├── code_v2_final.zip
├── code_v2_final_FINAL.zip
├── code_v2_final_FINAL_fixed.zip
├── code_backup_20231225.zip
└── code_ĐỪNG_XÓA.zip ← Ai cũng sợ xóa

🤯 Những vấn đề thường gặp

Vấn đềHậu quả
Nhiều người sửa 1 fileGhi đè code của nhau
Không biết ai sửa gì"Ai xóa function này???"
Muốn quay lại version cũ"Version cũ ở đâu?"
Code hỏng"Hôm qua chạy được mà!"
Làm việc offline"Không có mạng = không làm được"

💡 Git giải quyết TẤT CẢ những vấn đề này!


2. Git Là Gì?

Định nghĩa đơn giản

┌─────────────────────────────────────────────────────────────────┐
│ │
│ Git = Hệ thống quản lý phiên bản phân tán │
│ (Distributed Version Control System) │
│ │
│ Nói đơn giản: Git lưu lại MỌI thay đổi của code, │
│ cho phép bạn quay lại BẤT KỲ thời điểm nào. │
│ │
└─────────────────────────────────────────────────────────────────┘

Hình dung Git như "Time Machine" cho code

        Quá khứ                    Hiện tại                Tương lai
│ │ │
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Commit 1 │───▶│ Commit 2 │───▶│ Commit 3 │───▶ ...
│ "Init" │ │ "Add UI" │ │ "Fix bug"│
└──────────┘ └──────────┘ └──────────┘

└──── Có thể quay lại đây bất cứ lúc nào!

Git theo dõi gì?

✅ Theo dõi:                    ❌ KHÔNG theo dõi mặc định:
├── Source code (.js, .py...) ├── node_modules/
├── Config files ├── File build (.exe, .dll)
├── Documentation ├── File secret (.env)
└── Assets (nếu cần) └── File tạm (.log, .tmp)

3. Git vs SVN

💡 Nếu bạn chưa dùng SVN, có thể skip phần này

So sánh nhanh

                    SVN (Tập trung)              Git (Phân tán)

┌───┐ ┌───┐
│ S │ │ S │ Server
└─┬─┘ └─┬─┘
│ │
┌────────────┼────────────┐ ┌──────┼──────┐
│ │ │ │ │ │
▼ ▼ ▼ ▼ ▼ ▼
┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐
│ A │ │ B │ │ C │ │ A │ │ B │ │ C │
└───┘ └───┘ └───┘ └─┬─┘ └─┬─┘ └─┬─┘
│ │ │
Chỉ có code ┌─┴─┐ ┌─┴─┐ ┌─┴─┘
Không có history │Rep│ │Rep│ │Rep│
└───┘ └───┘ └───┘
Mỗi người có
FULL history

Bảng so sánh chi tiết

Tiêu chíSVNGit
Kiến trúcTập trungPhân tán
Làm việc offline❌ Không✅ Có
Tốc độChậm (phụ thuộc mạng)Nhanh (local)
BranchChậm, nặngNhanh, nhẹ
HistoryChỉ trên serverMỗi máy đều có
Backup1 điểm chếtNhiều bản sao
Độ phổ biến 2024↓ Giảm↑ Thống trị

⚠️ Tại sao team dùng Git?

1. Làm việc OFFLINE được      → Commit trên máy bay? OK!
2. Branch CỰC NHANH → Thử nghiệm thoải mái
3. Merge THÔNG MINH → Ít conflict hơn
4. BACKUP tự nhiên → Mỗi clone = 1 backup
5. CỘNG ĐỒNG lớn → GitHub, GitLab, Bitbucket

4. Các Khái Niệm Cơ Bản

4.1. Repository (Repo)

Repository = Thư mục dự án + Lịch sử Git

my-project/ ← Đây là Repository
├── .git/ ← Git lưu history ở đây (ĐỪNG ĐỘNG VÀO!)
├── src/
├── package.json
└── README.md

Hai loại repo:

  • Local repo: Trên máy của bạn
  • Remote repo: Trên server (GitHub, GitLab...)

4.2. Commit

Commit = Một "ảnh chụp" của code tại 1 thời điểm

┌─────────────────────────────────────────────────┐
│ Commit: abc123 │
├─────────────────────────────────────────────────┤
│ Author: Nguyen Van A │
│ Date: 2024-01-15 10:30 │
│ Message: "Add login feature" │
├─────────────────────────────────────────────────┤
│ Changes: │
│ + src/login.js (new file) │
│ ~ src/app.js (modified) │
│ - src/old-auth.js (deleted) │
└─────────────────────────────────────────────────┘

Commit tốt:

  • ✅ Nhỏ, tập trung 1 việc
  • ✅ Message rõ ràng
  • ✅ Code chạy được

Commit xấu:

  • ❌ Quá to, nhiều thay đổi không liên quan
  • ❌ Message "fix bug", "update"
  • ❌ Code bị lỗi

4.3. Branch

Branch = Nhánh phát triển song song

main

──────────────●──────────────────────●────────▶
│ │
│ feature/login │
└──────●─────●─────────┘
│ │
Commit Commit

Mỗi branch là 1 "vũ trụ song song" của code

Branches phổ biến:

main (hoặc master)  → Code production, luôn stable
develop → Code development, integration
feature/* → Tính năng mới
fix/* → Sửa bug
hotfix/* → Sửa bug khẩn cấp trên production

4.4. Merge

Merge = Gộp code từ branch này vào branch khác

main

──────●───────────────────────────●──────────▶
│ ╱│
│ feature/login ╱ │
└──────●─────●───────────╱ │
A B Merge ───┘

Lấy code từ feature/login gộp vào main

4.5. Clone, Pull, Push

┌─────────────────────────────────────────────────────────────────┐
│ REMOTE (GitHub) │
│ ☁️ │
└───────────────────────────────┬─────────────────────────────────┘

┌────────────────────┼────────────────────┐
│ │ │
clone push pull
(lần đầu) (đẩy lên) (kéo về)
│ │ │
▼ ▲ ▼
┌─────────────────────────────────────────────────────────────────┐
│ LOCAL (Máy bạn) │
│ 💻 │
└─────────────────────────────────────────────────────────────────┘
LệnhHành độngKhi nào dùng
cloneTải repo về máyLần đầu lấy dự án
pullCập nhật code mới nhấtTrước khi làm việc
pushĐẩy code lên serverSau khi commit xong

5. Cài Đặt Git

Windows

# Cách 1: Tải từ website
# https://git-scm.com/download/windows

# Cách 2: Dùng winget
winget install --id Git.Git -e --source winget

# Cách 3: Dùng Chocolatey
choco install git

macOS

# Cách 1: Xcode Command Line Tools (khuyên dùng)
xcode-select --install

# Cách 2: Homebrew
brew install git

Linux (Ubuntu/Debian)

sudo apt update
sudo apt install git

Kiểm tra cài đặt

git --version
# Output: git version 2.43.0 (hoặc version khác)

✅ Nếu thấy version → Cài đặt thành công!


6. Cấu Hình Ban Đầu

6.1. Cấu hình bắt buộc

# Tên của bạn (hiển thị trong commit)
git config --global user.name "Nguyen Van A"

# Email (phải trùng với email GitHub/GitLab)
git config --global user.email "[email protected]"

6.2. Cấu hình khuyến nghị

# Default branch là main (thay vì master)
git config --global init.defaultBranch main

# Editor mặc định (chọn 1)
git config --global core.editor "code --wait" # VS Code
git config --global core.editor "vim" # Vim
git config --global core.editor "nano" # Nano

# Xử lý line ending (QUAN TRỌNG cho team Windows + Mac)
# Windows:
git config --global core.autocrlf true
# Mac/Linux:
git config --global core.autocrlf input

# Màu sắc terminal
git config --global color.ui auto

6.3. Kiểm tra cấu hình

# Xem tất cả config
git config --list

# Xem config cụ thể
git config user.name
git config user.email

6.4. SSH Key (Khuyến nghị)

# Tạo SSH key
ssh-keygen -t ed25519 -C "[email protected]"

# Xem public key (copy key này lên GitHub/GitLab)
cat ~/.ssh/id_ed25519.pub

Thêm SSH key vào GitHub:

  1. Vào GitHub → Settings → SSH and GPG keys
  2. Click "New SSH key"
  3. Paste public key vào

Test SSH:

ssh -T [email protected]
# Output: Hi username! You've successfully authenticated...

📝 Tổng Kết

Những gì bạn đã học:

Khái niệmÝ nghĩa
GitHệ thống quản lý version phân tán
RepositoryThư mục dự án + lịch sử
CommitẢnh chụp code tại 1 thời điểm
BranchNhánh phát triển song song
MergeGộp nhánh
Clone/Pull/PushĐồng bộ local ↔ remote

Checklist trước khi tiếp tục:

□ Đã cài Git (git --version chạy OK)
□ Đã config user.name
□ Đã config user.email
□ Đã setup SSH key (nếu dùng GitHub/GitLab)

❓ FAQ - Câu Hỏi Thường Gặp

Q: Git và GitHub khác nhau thế nào?

Git     = Phần mềm quản lý version (chạy trên máy bạn)
GitHub = Dịch vụ hosting Git repo (giống Google Drive cho code)

Tương tự:
Git = Email protocol
GitHub = Gmail

Q: Tôi có thể dùng Git mà không cần GitHub không?

✅ Có! Git hoạt động hoàn toàn offline. GitHub chỉ cần khi làm việc team.

Q: Thư mục .git có thể xóa không?

🔴 KHÔNG! Xóa .git = Mất toàn bộ lịch sử Git của project.

Q: Git lưu file ở đâu?

Git lưu trong thư mục .git/ dưới dạng nén, không phải bản sao file.


➡️ Bước Tiếp Theo

Học file 02-git-basic-commands.md - Các lệnh Git cơ bản


Tài liệu thuộc bộ Git Training Documentation v1.0