Giao diện
Thực hành: Git Branching Basics
🎯 Mục tiêu
🎯 Sau bài thực hành này, bạn sẽ:
- Tạo, chuyển và xóa branch thành thạo
- Hiểu rõ HEAD pointer và ý nghĩa của detached HEAD
- Phân biệt fast-forward merge và three-way merge
- Áp dụng branching strategy trong workflow thực tế
Phần 1: Trắc nghiệm
🧠 Quiz
Câu 1: HEAD trong Git trỏ đến đâu?
- [ ] A) Luôn trỏ đến commit mới nhất trên branch
main - [x] B) Trỏ đến commit hiện tại mà bạn đang làm việc (thường qua một branch)
- [ ] C) Trỏ đến remote repository trên GitHub
- [ ] D) Trỏ đến commit đầu tiên của repository
💡 Giải thích: HEAD là con trỏ đặc biệt cho biết bạn đang ở đâu trong lịch sử. Thông thường HEAD trỏ đến tên branch (ví dụ
refs/heads/main), và branch đó trỏ đến commit mới nhất. Khi checkout trực tiếp một commit SHA, HEAD rơi vào trạng thái "detached".
🧠 Quiz
Câu 2: Khi nào Git thực hiện fast-forward merge?
- [x] A) Khi branch đích nằm hoàn toàn phía trước branch hiện tại trên cùng đường thẳng
- [ ] B) Khi hai branch có cùng số lượng commit
- [ ] C) Khi xảy ra conflict và Git tự động giải quyết
- [ ] D) Khi dùng flag
--fast-forwardtrong lệnh merge
💡 Giải thích: Fast-forward xảy ra khi branch hiện tại không có commit mới nào kể từ điểm rẽ. Git chỉ cần di chuyển pointer về phía trước — không tạo merge commit. Đây là merge đơn giản nhất.
🧠 Quiz
Câu 3: Trạng thái "detached HEAD" nghĩa là gì?
- [ ] A) Repository bị lỗi và cần khôi phục
- [ ] B) Branch hiện tại đã bị xóa
- [x] C) HEAD trỏ trực tiếp đến một commit thay vì trỏ qua branch
- [ ] D) Không thể tạo commit mới
💡 Giải thích: Detached HEAD xảy ra khi bạn checkout một commit SHA, tag, hoặc remote branch. Bạn vẫn có thể tạo commit, nhưng chúng sẽ không thuộc branch nào — dễ bị mất khi chuyển đi. Giải pháp: tạo branch mới từ vị trí đó bằng
git checkout -b <branch-name>.
Phần 2: Sắp xếp thứ tự lệnh
🧩 Parsons Problem
Bài 1: Tạo feature branch, phát triển và merge về main
Sắp xếp các bước đúng thứ tự:
git checkout main— đảm bảo đang ở branch maingit checkout -b feature/login— tạo và chuyển sang branch mới- Viết code cho tính năng login
git add . && git commit -m "feat: implement login form"git checkout main— quay về maingit merge feature/login— merge feature vào maingit branch -d feature/login— xóa branch đã merge
🧩 Parsons Problem
Bài 2: Kiểm tra và dọn dẹp branches
Sắp xếp các bước đúng thứ tự:
git branch— liệt kê tất cả branch localgit branch -v— xem commit cuối cùng trên mỗi branchgit branch --merged— xem branch nào đã được merge vào branch hiện tạigit branch -d feature/old-feature— xóa an toàn branch đã mergegit branch -D feature/abandoned— xóa branch chưa merge (bắt buộc)
Phần 3: Bài tập tình huống
Scenario: Phát triển song song hai tính năng
Bối cảnh: Bạn đang làm dự án website portfolio. Branch main có file index.html và style.css. Bạn cần phát triển đồng thời:
- Feature A: Thêm trang About (
about.html) - Feature B: Thêm dark mode vào
style.css
Yêu cầu thực hiện:
- Từ
main, tạo branchfeature/about-pagevà thêm fileabout.html - Quay về
main, tạo branchfeature/dark-modevà chỉnh sửastyle.css - Merge
feature/about-pagevàomaintrước (sẽ là fast-forward) - Merge
feature/dark-modevàomain(sẽ là three-way merge vì main đã tiến lên) - Xác nhận cả hai tính năng đều có trên
mainbằnggit log --oneline --graph
Câu hỏi suy ngẫm: Tại sao merge thứ hai tạo merge commit còn merge đầu tiên thì không? Dùng git log --oneline --graph --all để kiểm chứng.