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.
git checkout main
git merge feature/login # nếu main chưa có commit mới → fast-forward
# History: A - B - C(feature) ← HEAD/mainNo-ff merge (--no-ff): luôn tạo merge commit dù có thể fast-forward.
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.