Skip to content

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-forward trong 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ự:

  1. git checkout main — đảm bảo đang ở branch main
  2. git checkout -b feature/login — tạo và chuyển sang branch mới
  3. Viết code cho tính năng login
  4. git add . && git commit -m "feat: implement login form"
  5. git checkout main — quay về main
  6. git merge feature/login — merge feature vào main
  7. git 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ự:

  1. git branch — liệt kê tất cả branch local
  2. git branch -v — xem commit cuối cùng trên mỗi branch
  3. git branch --merged — xem branch nào đã được merge vào branch hiện tại
  4. git branch -d feature/old-feature — xóa an toàn branch đã merge
  5. git 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.htmlstyle.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:

  1. Từ main, tạo branch feature/about-page và thêm file about.html
  2. Quay về main, tạo branch feature/dark-mode và chỉnh sửa style.css
  3. Merge feature/about-page vào main trước (sẽ là fast-forward)
  4. Merge feature/dark-mode vào main (sẽ là three-way merge vì main đã tiến lên)
  5. Xác nhận cả hai tính năng đều có trên main bằng git 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.