Git Handbook

03 · Branch & Merge

Tạo nhánh, chuyển nhánh, merge, fast-forward, conflict resolution và detached HEAD.

1. Branch là một reference nhẹ

Branch không phải bản copy nguyên repository. Nó là một reference có thể di chuyển khi commit mới được tạo trên branch đó.

A---B---C  main
                   D---E  feature/login

git-branch

Liệt kê, tạo, đổi tên hoặc xóa branch.
Official docs ↗
Cú pháp
git branch [options]
Hiểu đơn giản
git branch feature/x chỉ tạo reference; không tự checkout.
git branch
git branch -vv
git branch feature/login
git branch -m feature/auth
git branch -d feature/login
git branch -D feature/login
-d bảo vệ branch chưa merge; -D force delete.

2. Chuyển branch

git-switch

Chuyển branch hoặc tạo branch mới rồi chuyển sang.
Official docs ↗
Cú pháp
git switch [-c] <branch>
Hiểu đơn giản
Lệnh hiện đại, rõ mục đích hơn git checkout cho thao tác branch.
git switch main
git switch -c feature/login
git switch -

3. Merge

git-merge

Tích hợp lịch sử của branch/commit khác vào branch hiện tại.
Official docs ↗
Cú pháp
git merge [--no-ff|--ff-only] <branch>
Hiểu đơn giản
Nếu lịch sử cho phép, Git có thể fast-forward. Nếu hai nhánh đã diverge, Git thường tạo merge commit.
git switch main
git merge feature/login

git merge --no-ff feature/payment
git merge --ff-only origin/main

Fast-forward

Trước:
A---B  main
           C---D  feature

Sau fast-forward:
A---B---C---D  main, feature

Merge commit

A---B---C------M  main
     \        /
      D---E---F  feature

4. Merge conflict

Conflict xảy ra khi Git không thể tự quyết định kết quả cho một số phần thay đổi.

<<<<<<< HEAD
const mode = "production";
=======
const mode = "staging";
>>>>>>> feature/config
  1. Mở file conflict và quyết định nội dung cuối.
  2. Xóa conflict markers.
  3. git add <file> để đánh dấu đã resolve.
  4. git commit hoặc tiếp tục operation đang chạy.
git status
# sửa file
git add src/config.js
git commit
Nếu muốn hủy merge đang dở: git merge --abort.

5. Detached HEAD

Khi checkout/switch trực tiếp một commit thay vì branch, HEAD không còn trỏ tới branch. Bạn có thể xem/test lịch sử, nhưng commit mới có nguy cơ khó tìm nếu không tạo branch.

git switch --detach HEAD~3
# test something
git switch -c experiment/save-work