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

Nhánh, Pull Request và review bằng Claude

Vì sao người làm một mình vẫn cần nhánh và PR, cách đọc phần thay đổi, và cách bắt AI tự review mã của chính nó.

Cấp 225 phút làm

Người làm một mình thường nghĩ nhánh và Pull Request là nghi thức của công ty lớn. Với Vibe Code thì ngược lại: chúng là cái phanh của bạn khi làm việc với một đồng nghiệp gõ nhanh gấp 50 lần mình.

Nhánh để làm gì, nói thật

Nhánh là một bản sao mã nguồn để bạn làm hỏng thoải mái, trong khi bản chính (main) vẫn lành.

Ba tình huống mà nhánh cứu bạn, đều rất thật:

  1. Thử một tính năng chưa biết có nên giữ. Làm trên nhánh, không hay thì xóa nhánh, main chưa bao giờ biết tới nó.
  2. Khách đang dùng bản hiện tại. Bạn không được phép để main hỏng giữa giờ làm việc của người ta.
  3. Bạn cần một link preview để khách xem trước khi gật — Cloudflare Pages tự tạo link riêng cho mỗi nhánh.

Vòng làm việc đầy đủ

# 1. Bắt đầu từ main sạch
git checkout main
git pull

# 2. Tạo nhánh theo việc
git checkout -b bo-loc-thang

# 3. Làm việc (bạn + AI), commit theo từng bước nhỏ
git add . ; git commit -m "Them o chon thang va ham loc"
git add . ; git commit -m "Dong bo so dong tong voi ket qua loc"

# 4. Đẩy nhánh lên GitHub
git push -u origin bo-loc-thang

# 5. Mở Pull Request
gh pr create --fill

Đặt tên nhánh theo việc, không theo ngày: bo-loc-thang, sua-loi-luu-ten-co-dau, them-xuat-excel. Ba tuần sau bạn vẫn hiểu.

Pull Request là cái gì, với người làm một mình

PR là một trang web hiển thị toàn bộ khác biệt giữa nhánh của bạn và main, kèm chỗ để ghi chú và chỗ để bàn.

Dù chỉ có một mình, PR cho bạn ba thứ không thay được:

  • Màn hình đọc thay đổi tử tế — xanh là thêm, đỏ là bớt, theo từng file. Dễ đọc hơn git diff rất nhiều khi thay đổi lớn.
  • Một chỗ ghi lại vì sao. Lịch sử commit nói cái gì; phần mô tả PR nói vì sao — thứ mà ba tháng sau bạn sẽ cần.
  • Cổng chặn. Có PR thì bạn không thể lỡ tay đẩy mã nửa vời vào main.

Mẫu mô tả PR dùng được ngay:

## Việc
Thêm bộ lọc theo tháng cho bảng đơn hàng.

## Vì sao
Chị kế toán phải tự cuộn tìm đơn trong tháng, mỗi lần mất ~3 phút,
ngày nào cũng làm 2 lần.

## Đã kiểm
- [x] Chọn tháng 9 → còn 42 dòng, khớp số ở dòng tổng
- [x] Chọn lại "Tất cả" → về 318 dòng như cũ
- [x] Trên điện thoại 375px: ô chọn không bị che, chữ không bẻ dòng
- [x] Console sạch lỗi
- [ ] CHƯA kiểm: dữ liệu năm trước (chưa có trong cơ sở dữ liệu)

## Rủi ro
Nếu đơn có ngày để trống thì bị lọc mất. Hiện chưa có đơn nào như vậy.

Mục "Đã kiểm" là mục làm nên giá trị của PR. Nó buộc bạn đi bấm thử thật, và nó chừa lại bằng chứng. Mục "CHƯA kiểm" cũng bắt buộc — bài test ở Cấp 5 sẽ nói rõ tại sao: một kết luận không nói rõ phần chưa kiểm là một kết luận không dùng được.

Link preview theo nhánh — lợi thế mà rất ít người tận dụngchuyên gia insight & case thực tế

Khi Pages nối Git, mỗi nhánh được một địa chỉ riêng kiểu bo-loc-thang.du-an.pages.dev. Tôi dùng nó theo cách này với khách:

"Anh bấm link này xem thử bộ lọc tháng. Đây là bản riêng, chưa ai thấy. Anh thấy ổn em mới đưa vào bản chính."

Ba cái lợi đo được: 1. Khách góp ý thẳng hơn, vì chưa phải chuyện đã rồi. 2. Bạn không cần nói chuyện kỹ thuật — chỉ gửi link. 3. Khi họp mà khách đổi ý, bạn sửa ngay trên nhánh, 2 phút sau gửi link mới. Đây là lúc khách thấy đáng tiền.

Chi phí: 0 đồng, một lệnh git push.

Gộp nhánh vào main

Khi PR đã ổn:

gh pr merge --squash --delete-branch

--squash gộp mọi commit của nhánh thành một mốc duy nhất trên main. Với người làm một mình, đây gần như luôn là lựa chọn đúng: main giữ được lịch sử gọn, mỗi mốc là một tính năng hoàn chỉnh, và nếu phải lùi thì lùi một lần là sạch.

Rồi về máy:

git checkout main
git pull

Bắt Claude review mã của chính nó

Đây là phần mạnh nhất của bài, và là thứ người làm một mình thiếu nhất: một người thứ hai đọc lại.

Đọc toàn bộ thay đổi của nhánh này so với main (git diff main...HEAD).
Review như một người khó tính, theo đúng thứ tự ưu tiên:

1. ĐÚNG SAI: có trường hợp nào cho kết quả sai không? Dữ liệu rỗng,
   dữ liệu null, ngày để trống, tên có dấu, số 0, số âm?
2. MẤT DỮ LIỆU: có đường nào ghi đè hoặc xóa mất dữ liệu cũ không?
3. PHÁ LUỒNG CŨ: có thay đổi hành vi mặc định mà tôi không yêu cầu không?
4. ĐƠN GIẢN HƠN: chỗ nào làm phức tạp quá mức cần thiết?

Với mỗi vấn đề: nói file và dòng, nói hậu quả cụ thể, nói cách sửa nhỏ nhất.
Nếu không có vấn đề thật thì nói "không có" — đừng bịa ra để có cái nói.

Câu cuối là câu bắt buộc. Thiếu nó, AI sẽ tìm ra "vấn đề" cho đủ lệ bộ, và bạn mất thời gian với những góp ý trang trí.

Thứ tự duyệt khi AI review xongchuyên gia thực thi

Đừng sửa hết mọi thứ nó nêu. Lọc theo đúng thứ tự này:

  1. Mất dữ liệu → sửa ngay, không thương lượng.
  2. Sai kết quả → sửa ngay.
  3. Phá hành vi cũ → sửa ngay.
  4. Bảo mật → sửa ngay nếu dính dữ liệu người khác.
  5. "Có thể gọn hơn", "nên tách hàm", "nên thêm chú thích" → bỏ qua, trừ khi bạn thấy mã khó đọc thật.

Mục 5 là bẫy mất thời gian lớn nhất. Mã gọn không có giá trị nếu không ai chạm vào nó nữa. Sửa những gì làm người dùng đau, không sửa những gì làm mã nguồn đẹp.

Tôi làm một mình, tôi có cần PR không?người dùng bình thường góp ý

Tôi bỏ PR trong hai tháng đầu, thấy phiền. Rồi có một tuần tôi sửa 5 thứ liên tiếp ngay trên main, thứ thứ ba làm hỏng thứ nhất, và tôi không biết bắt đầu lùi từ đâu — vì cả 5 nằm lẫn trong một dãy commit lộn xộn.

Giờ tôi theo một luật rất nhẹ, không nghi thức: việc nào xong trong 10 phút thì làm thẳng trên main; việc nào từ nửa tiếng trở lên thì tạo nhánh. Chỉ vậy thôi và chưa bao giờ rối nữa. Đừng để ai bắt bạn theo quy trình của công ty 50 người.

`git pull` khi đang có thay đổi chưa commit

Lỗi hay gặp: bạn đang sửa dở, gõ git pull, Git báo một đoạn tiếng Anh dài và từ chối. Người mới hay sợ ở đây và gõ loạn lên.

Không có gì nguy hiểm — Git đang bảo vệ việc bạn đang làm. Hai lựa chọn: - Chốt lại rồi kéo: git add . ; git commit -m "..." ; git pull - Bỏ việc đang làm rồi kéo: git restore . ; git pull

Đừng bao giờ gõ lệnh lạ tìm trên mạng khi Git từ chối. Git từ chối nghĩa là chưa có gì mất; làm theo một lệnh không hiểu mới là lúc mất.

Chốt review bài nàychuyên gia review
  • Đủ: vòng nhánh → PR → squash merge, mẫu mô tả PR có mục đã/chưa kiểm, đề review 4 lớp, thứ tự duyệt góp ý.
  • Cố tình bỏ: quy trình nhiều nhánh dài hạn, xử lý xung đột gộp. Một người làm thì xung đột gần như không xảy ra; xảy ra thì hỏi AI đúng lúc đó.
  • Rủi ro còn lại: AI review bằng cách đọc, nó không chạy app. Nó bắt được lỗi logic, không bắt được "nút bị che trên iPhone". Phần đó vẫn phải tay người bấm, hoặc đọc bài test.
Bài tập chốt

Làm một tính năng nhỏ qua đủ vòng: nhánh → 2–3 commit → push → PR có mô tả đủ 4 mục → bắt Claude review theo đề ở trên → sửa đúng những gì thuộc nhóm 1–4 → squash merge → xóa nhánh.

Ghi lại: AI nêu mấy vấn đề, bạn thật sự sửa mấy cái. Tỉ lệ đó là thước đo bạn đã biết lọc hay chưa. Lần đầu thường là 8 nêu / 2 sửa, và như thế là đúng.