12 bài trước đi từ mô hình object bất biến tới remote, submodule, hooks, tag — mỗi bài 1 khái niệm riêng lẻ. Bài cuối này tổng hợp tất cả vào 1 dự án duy nhất: Git Kata Trainer — mỗi "kata" cho bạn 1 đồ thị commit khởi đầu và 1 mục tiêu cấu trúc cần đạt được, bạn tự gõ lệnh Git thật để biến đồ thị ban đầu thành đúng kết quả mong muốn, và được chấm điểm tự động.
Tổng Kết Hành Trình 12 Bài
| Kata | Kỹ năng ôn lại | Bài liên quan |
|---|---|---|
| 1 | Tạo branch, chuyển HEAD, commit trên nhánh mới | Bài 3 |
| 2 | Merge 2 nhánh phân kỳ thành 1 merge commit | Bài 4 |
| 3 | Rebase để có lịch sử tuyến tính thay vì merge commit | Bài 5 |
| 4 | Cherry-pick đúng 1 commit mà không merge cả nhánh | Bài 6 |
| 5 | Dùng reset --hard để loại bỏ 1 commit lỗi |
Bài 7 |
| 6 | Đánh dấu release bằng annotated tag | Bài 12 |
Cách Chấm Điểm Hoạt Động
Mỗi kata mô tả rõ trạng thái khởi đầu và mục tiêu bằng lời — không có 1 chuỗi lệnh "đúng" duy nhất. Nút "Kiểm tra" không so sánh lệnh bạn gõ, mà đọc thẳng cấu trúc đồ thị commit hiện tại (con trỏ branch, quan hệ cha-con, tag) để xác nhận mục tiêu đã đạt — y hệt cách 1 bài test tự động thật kiểm tra kết quả cuối cùng thay vì cách bạn làm ra nó.
Sân chơi: Git Kata Trainer
Chọn 1 kata, đọc mục tiêu, gõ lệnh vào terminal, rồi bấm "Kiểm tra" khi nghĩ đã xong.
Chọn Kata
Terminal giả lập
git commit -m "..."git branch <tên> [ref]git checkout [-b] <tên>git merge <branch>git rebase <branch>git cherry-pick <ref>git reset --hard <ref>git tag [-a] <tên> [-m "..."]
Nhật ký
Trắc nghiệm ôn tập
Câu 1: Điều kiện nào khiến git merge chỉ di chuyển con trỏ (fast-forward) thay vì tạo 1
merge commit mới?
Trắc nghiệm ôn tập
Câu 2: Vì sao commit sau khi rebase luôn có hash khác với commit gốc trước khi rebase?
Trắc nghiệm ôn tập
Câu 3: Annotated tag khác lightweight tag ở điểm nào khiến nó phù hợp hơn cho release chính thức?