Menu
CoddyTech

Git Merge

Cập nhật lần cuối

git merge đưa các commit từ một nhánh khác vào nhánh hiện tại. Khi nhánh hiện tại chưa rẽ hướng, Git fast-forward, tức là chỉ dời con trỏ lên phía trước. Khi cả hai nhánh đều có commit mới, Git tạo một merge commit nối hai lịch sử lại với nhau. Khác với rebase, merge giữ nguyên chính xác lịch sử của cả hai nhánh.

Thử các lệnh này trong playground terminal: một shell thật ngay trên trình duyệt, không cần cài đặt gì.

git merge nối hai lịch sử bằng một merge commit; cả hai nhánh vẫn giữ các commit gốc của mình.

Cú pháp

LệnhTác dụng
git merge featureMerge feature vào nhánh hiện tại
git merge --no-ff featureLuôn tạo merge commit
git merge --ff-only featureChỉ merge khi fast-forward được
git merge --squash featureGộp các commit của nhánh thành một
git merge --abortHủy một lần merge bị xung đột

Fast-forward và merge commit

Tình huốngFast-forwardMerge commit (--no-ff)
Tạo commit mớiKhôngCó
Lưu lại dấu vết của nhánhKhôngCó
Xảy ra khiNhánh hiện tại chưa rẽ hướngCả hai nhánh đều có commit mới

Giải quyết xung đột merge

Khi cả hai nhánh cùng sửa những dòng giống nhau, Git sẽ tạm dừng.

BướcLệnhKết quả
1Sửa các tệp bị xung độtChọn dòng đúng, xóa các dấu đánh dấu
2git add <file>Đánh dấu xung đột đã được giải quyết
3git commitHoàn tất merge

Câu hỏi thường gặp về git merge

Làm sao để merge một nhánh vào nhánh khác trong Git?
Chuyển sang nhánh bạn muốn merge vào (ví dụ git switch main), rồi chạy git merge feature. Git gộp các commit từ feature vào main, bằng cách fast-forward hoặc tạo merge commit nếu cả hai nhánh đã rẽ hướng.
Fast-forward và merge commit khác nhau thế nào?
Fast-forward xảy ra khi nhánh hiện tại không thay đổi gì kể từ lúc nhánh kia tách ra: Git chỉ trượt con trỏ lên phía trước, không có commit mới. Merge commit được tạo khi cả hai nhánh đều có commit mới, nối lịch sử của chúng lại với nhau. Dùng --no-ff để luôn tạo merge commit, hoặc --ff-only để bắt buộc fast-forward.
Làm sao để giải quyết xung đột merge?
Khi merge bị xung đột, Git đánh dấu những đoạn mâu thuẫn trong các tệp liên quan bằng các dấu <<<<<<<, ======= và >>>>>>>. Sửa từng tệp để giữ lại nội dung đúng và xóa các dấu đó, rồi chạy git add cho các tệp đã giải quyết và git commit để hoàn tất merge.
Làm sao để hoàn tác hoặc hủy một lần merge?
Nếu merge vẫn đang dở (xung đột chưa được giải quyết), chạy git merge --abort để hủy và khôi phục trạng thái trước merge. Nếu merge đã hoàn tất ở local, git reset --hard ORIG_HEAD đưa nhánh về vị trí trước merge (khác với HEAD~1, cách này vẫn đúng sau một lần fast-forward, nhưng nó xóa phần việc chưa commit). Nếu merge đã được push, dùng git revert -m 1 <merge-hash>.
Có thể luyện tập lệnh này online không?
Có. Mở playground terminal để chạy git merge trong một shell thật ngay trên trình duyệt, không cần cài đặt gì. Khóa học Git tương tác miễn phí của Coddy cũng hướng dẫn merge và giải quyết xung đột từng bước.
Hình minh họa các ngôn ngữ lập trình của Coddy

Học Git cùng Coddy

Bắt đầu