Vibe Code
Giáo trình/Phần 2 — Nền móng Git & GitHub

Repo GitHub sạch trong 10 phút

Tạo repo (riêng tư hay công khai?), đẩy mã lên, README viết cho ai, và cấu trúc thư mục không làm AI lạc.

Cấp 220 phút làm

Cuối bài: mã nguồn của bạn nằm trên GitHub, máy hỏng không mất, và bất kỳ máy nào cũng kéo về làm tiếp được.

Riêng tư hay công khai — quyết định trước khi tạo

Riêng tư (Private) Công khai (Public)
Ai xem được Chỉ bạn và người bạn mời Cả thế giới, Google tìm thấy
Dùng cho App của khách, mã có logic kinh doanh, mọi thứ dính dữ liệu thật Mã mẫu, thư viện, giáo trình, hồ sơ cá nhân
Actions miễn phí Có hạn mức phút/tháng Không giới hạn phút

Mặc định của giáo trình này: Private. Lý do đơn giản: repo riêng tư có thể mở ra công khai bất cứ lúc nào, còn mã đã công khai thì coi như đã bị người khác (và bot quét khóa) đọc — đổi về riêng tư cũng không rút lại được.

Mã của khách là tài sản của kháchchuyên gia insight & case thực tế

Một chuyện tôi đã thấy tận mắt: một bạn làm app cho quán cà phê, để repo công khai vì "chẳng có gì bí mật". Trong mã có số điện thoại chủ quán, địa chỉ nhà cung cấp, và bảng giá nhập hàng gán cứng. Sáu tháng sau một đối thủ tìm ra qua Google.

Không ai cố ý rò rỉ. Nhưng mã nguồn luôn chứa nhiều thông tin kinh doanh hơn mình tưởng: tên bảng, cấu trúc quy trình, số liệu mẫu còn sót, email nội bộ trong phần ghi chú. Riêng tư là mặc định đúng, và nó miễn phí.

Cách 1 — Tạo bằng dòng lệnh (nhanh nhất)

Cần gh (GitHub CLI) — tải tại cli.github.com hoặc:

winget install GitHub.cli
gh auth login

Chọn: GitHub.com → HTTPS → đăng nhập bằng trình duyệt. Bạn tự nhập trong trình duyệt — không để ai, kể cả AI, nhập hộ.

Rồi tại thư mục project:

cd C:\NVAI\Claude\web-dau-tien
gh repo create web-dau-tien --private --source=. --remote=origin --push

Một lệnh làm cả bốn việc: tạo repo trên GitHub, nối với thư mục của bạn, đặt tên origin, và đẩy mã lên.

Kiểm:

gh repo view --web

Cách 2 — Tạo trên web (nếu không muốn cài gh)

  1. github.com/new → tên repo → chọn Private → đừng tích thêm README/.gitignore (bạn đã có) → Create.
  2. GitHub hiện sẵn khối lệnh, dạng:
git remote add origin https://github.com/TEN-BAN/web-dau-tien.git
git branch -M main
git push -u origin main

Lần đầu push sẽ hỏi đăng nhập — cửa sổ của Git Credential Manager sẽ mở, bạn xác thực bằng trình duyệt.

Đừng dùng mật khẩu GitHub trên dòng lệnh

GitHub bỏ xác thực bằng mật khẩu từ 2021. Nếu một hướng dẫn nào bảo bạn gõ mật khẩu vào dòng lệnh, hướng dẫn đó đã cũ. Hai cách đúng: đăng nhập qua trình duyệt (gh auth login, hoặc Credential Manager), hoặc dùng Personal Access Token với quyền hẹp nhất — xem Bí mật và token.

README — viết cho chính bạn 3 tháng sau

README là file đầu tiên người ta (và AI) đọc. Với Vibe Code, nó có một tác dụng ít ai nói: AI đọc README để hiểu project, nên README tốt làm mọi lượt hỏi sau đó chính xác hơn.

Mẫu dùng được ngay, cho một project thật:

# Web giới thiệu quán Chang An

Trang giới thiệu một trang, chạy trên Cloudflare Pages.

## Chạy thử tại máy
Mở trực tiếp file `index.html` bằng trình duyệt. Không cần build.

## Deploy
    wrangler pages deploy dist --project-name=changan-web

Bản chính: https://changan-web.pages.dev
Tên miền thật: https://changan.example.com

## Cấu trúc
- `index.html` — toàn bộ trang (HTML + CSS + JS trong một file)
- `dist/`      — thư mục được deploy (sinh ra, không sửa tay)
- `anh/`       — ảnh gốc chưa nén

## Quy ước
- Màu nhấn duy nhất: #1f5f4b. Không thêm màu mới.
- Mọi liên kết nội bộ viết không có đuôi .html
- Đổi ảnh thì ĐỔI TÊN FILE (vd anh-mon-b.jpg → anh-mon-c.jpg)
  vì header cache đặt immutable.

## Việc còn treo
- [ ] Nén ảnh món ăn (hiện 1,8 MB)
- [ ] Thêm phần đánh giá khách hàng

Bốn phần không được thiếu: chạy thử thế nào · deploy thế nào · file nào là file nào · quy ước riêng. Phần "Việc còn treo" thì nhỏ mà cực hữu dụng: nó là bộ nhớ ngoài của bạn.

Bắt AI viết README rồi bạn sửachuyên gia thực thi
Đọc toàn bộ project này rồi viết file README.md gồm đúng 5 mục:
chạy thử tại máy, deploy, cấu trúc file, quy ước riêng, việc còn treo.
Ngắn gọn, tiếng Việt. Chỉ viết những gì bạn ĐỌC ĐƯỢC trong mã —
nếu không biết thì ghi "chưa rõ", đừng đoán.

Câu cuối là câu phải có. Không có nó, AI sẽ viết một README nghe rất chuyên nghiệp với những lệnh không tồn tại — và ba tháng sau bạn làm theo, không chạy, mất một giờ.

Cấu trúc thư mục không làm AI lạc

Chưa cần phức tạp. Nhưng ba nguyên tắc sau tiết kiệm cho bạn rất nhiều ở Cấp 3:

1. Tên file và thư mục: chữ thường, gạch nối, không dấu, không dấu cách. bang-gia.json ✔ · Bảng giá.json ✘ · bang gia.json ✘

2. Tách thứ nguồn khỏi thứ sinh ra.

web-dau-tien/
├─ README.md
├─ .gitignore
├─ src/          ← bạn và AI sửa ở đây
│  ├─ index.html
│  └─ anh/
├─ dist/         ← build sinh ra, DEPLOY cái này, không sửa tay
└─ build.py      ← script tạo dist từ src

Vì sao quan trọng: khi có bước build, sửa thẳng vào dist/ là mất ngay lần build sau. Đây là lỗi tốn thời gian kinh điển, và nó lặp lại ở mọi người, ít nhất một lần. Nếu project của bạn có dist/, hãy viết thẳng vào README: "CẤM sửa trong dist."

3. Một file đừng quá ~1.500 dòng. Quá thì AI bắt đầu sửa chệch chỗ, và git diff khó đọc. Tách theo màn hình hoặc theo việc, đừng tách theo kiểu kỹ thuật khi chưa cần.

Ba tháng sau tôi không nhận ra project của mìnhngười dùng bình thường góp ý

Tôi mở lại một project bỏ 6 tuần, và mất nửa ngày chỉ để tìm ra lệnh deploy. Tôi từng gõ nó mỗi ngày, tưởng không bao giờ quên.

Từ đó tôi có một luật cá nhân, rất thô nhưng chưa bao giờ hỏng: mọi lệnh tôi gõ từ 2 lần trở lên thì ghi vào README ngay lúc đó. Không ghi "để sau". Mất 20 giây, cứu nửa ngày.

Mời người khác vào repo

Khi làm cho khách hoặc có đồng nghiệp:

gh repo add-collaborator TEN-NGUOI-KIA --permission push

Hoặc trên web: repo → Settings → Collaborators → Add people.

Nguyên tắc quyền: cho mức thấp nhất đủ việc. Người chỉ xem thì read. Và khi kết thúc hợp tác, xóa quyền ngay hôm đó — đừng để danh sách cộng tác viên biến thành bãi rác, vì mỗi người trong đó là một đường vào mã của khách.

Chốt review bài nàychuyên gia review
  • Đạt: repo riêng tư, mã đã đẩy lên, README 5 mục, cấu trúc src/dist, quy ước đặt tên.
  • Chưa làm: chưa dùng nhánh, chưa Pull Request, chưa tự động deploy. Ba bài tới.
  • Rủi ro còn lại: nếu project của bạn đã có file chứa khóa (.dev.vars, .env) mà .gitignore viết sau khi commit, khóa đã nằm trong lịch sử. Kiểm ngay: git log --all --oneline -- .dev.vars — có kết quả là phải đổi khóa.
Bài tập chốt
  1. Đẩy project lên GitHub ở chế độ riêng tư.
  2. Viết README 5 mục, tự tay sửa lại phần AI viết sai.
  3. Phép thử thật: xóa thư mục project trên máy (đã đẩy lên rồi, không sao), rồi kéo về:
cd C:\NVAI\Claude
git clone https://github.com/TEN-BAN/web-dau-tien.git
cd web-dau-tien

Nếu kéo về và chạy lại được bằng đúng hướng dẫn trong README của chính bạn — bạn đậu bài này. Nếu không chạy được, README còn thiếu, sửa ngay bây giờ chứ đừng để ba tháng sau.