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: repo mới bật sẵn cả 3 merge method (merge commit / squash / rebase) — vào Settings tắt bớt để ép team dùng 1 strategy thống nhất. Nút merge của PR không bao giờ fast-forward — luôn tạo commit mới (merge commit, hoặc commit squash/rebase).
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.