Trung BìnhGit iconGit

Fast-forward merge vs no-ff merge: khác nhau gì? GitHub mặc định dùng cái nào và tại sao team nên chủ động chọn?

Fast-forward merge (mặc định khi có thể): nếu branch hiện tại là ancestor trực tiếp của branch cần merge, git chỉ di chuyển HEAD pointer lên — không tạo merge commit.

History linear.

bash
git checkout main
git merge feature/login  # nếu main chưa có commit mới → fast-forward
# History: A - B - C(feature) ← HEAD/main

No-ff merge (--no-ff): luôn tạo merge commit dù có thể fast-forward.

bash
git merge --no-ff feature/login
# History: A - B - M ← merge commit
#               \
#                C(feature)

Trade-offs:
- Fast-forward: history clean, dễ git log --oneline, nhưng mất context "đây là feature branch"
- No-ff: thấy rõ feature grouping, dễ revert cả feature (git revert -m 1 <merge-commit>), nhưng log lộn xộn

GitHub default: merge commit (no-ff) — squash và rebase phải enable riêng trong Settings. Không fast-forward trên remote.

Recommendation: enforce squash merge (1 commit/PR) để main history clean, hoặc no-ff nếu cần preserve feature grouping. Đừng mix strategies trong 1 repo.

Xem toàn bộ Git cùng filter theo level & chủ đề con.

Mở danh sách Git