Merge: fast-forward và 3-way merge
Merging: Fast-forward and 3-way Merge
Sau khi làm xong một tính năng trên branch riêng, bạn cần đưa nó về branch chính. Cách phổ biến nhất là gộp merge. Có hai kiểu merge và hiểu rõ chúng giúp bạn đọc lịch sử dự án dễ hơn.
git merge làm gì?
git merge gộp các thay đổi từ một branch khác vào branch bạn đang đứng.
Bạn luôn đứng ở branch đích (thường là main), rồi gộp branch nguồn vào:
# Đứng ở main rồi gộp branch feature vào
git switch main
git merge feature
Tùy vào lịch sử của hai branch, Git chọn một trong hai cách: fast-forward hoặc 3-way merge.
Fast-forward merge
Fast-forward xảy ra khi branch đích không có commit mới nào kể từ lúc branch nguồn tách ra.
Nghĩa là main vẫn nằm đúng trên đường thẳng dẫn tới feature.
Lúc này Git không cần "gộp" gì cả — nó chỉ dời con trỏ main tiến lên tới commit cuối của feature.
Kết quả là lịch sử vẫn là một đường thẳng, không có merge commit nào được tạo.
# main chưa đổi gì kể từ khi tách feature → fast-forward
git merge feature
# Updating a1b2c3d..f4e5d6c
# Fast-forward
3-way merge và merge commit
Khi cả hai branch đều có commit mới kể từ điểm tách (lịch sử đã phân kỳ), Git không thể chỉ dời con trỏ. Lúc này nó làm 3-way merge three-way merge: dựa trên ba commit — commit chung gần nhất (tổ tiên chung) và commit cuối của mỗi branch — để tính ra kết quả gộp.
Git tạo một merge commit đặc biệt có hai commit cha, ghi lại điểm hai nhánh hợp lại:
git switch main
git merge feature
# Merge made by the 'recursive' strategy.
Nếu hai branch sửa cùng một chỗ trong cùng một file, 3-way merge sẽ báo xung đột conflict và bạn phải giải quyết thủ công (xem bài tiếp theo).
| Tiêu chí | Fast-forward | 3-way merge |
|---|---|---|
| Khi nào | Branch đích chưa có commit mới | Cả hai branch đều có commit mới |
| Thao tác | Chỉ dời con trỏ tiến lên | Tính gộp từ 3 commit |
| Merge commit | Không tạo | Có tạo (2 commit cha) |
| Lịch sử | Đường thẳng | Có nhánh hợp lại |
Ép hoặc cấm fast-forward
Dùng git merge --no-ff feature để luôn tạo merge commit kể cả khi có thể fast-forward (giúp thấy rõ ranh giới một tính năng). Ngược lại git merge --ff-only chỉ cho merge khi fast-forward được.
Trọng tâm thi
Đề hỏi "khi nào merge không tạo merge commit" → fast-forward, xảy ra khi branch đích chưa có commit mới nên Git chỉ dời con trỏ. Khi hai branch phân kỳ, Git làm 3-way merge và tạo merge commit có hai cha.
Tóm tắt
git merge <branch>gộp thay đổi của branch khác vào branch đang đứng.- Fast-forward: branch đích chưa đổi → chỉ dời con trỏ, không có merge commit, lịch sử thẳng.
- 3-way merge: hai branch phân kỳ → tạo merge commit có hai commit cha.
- Sửa cùng một chỗ ở cả hai branch → conflict, phải giải quyết thủ công.