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ì.
Cú pháp
| Lệnh | Tác dụng |
|---|---|
git merge feature | Merge feature vào nhánh hiện tại |
git merge --no-ff feature | Luôn tạo merge commit |
git merge --ff-only feature | Chỉ merge khi fast-forward được |
git merge --squash feature | Gộp các commit của nhánh thành một |
git merge --abort | Hủy một lần merge bị xung đột |
Fast-forward và merge commit
| Tình huống | Fast-forward | Merge commit (--no-ff) |
|---|---|---|
| Tạo commit mới | Không | Có |
| Lưu lại dấu vết của nhánh | Không | Có |
| Xảy ra khi | Nhánh hiện tại chưa rẽ hướng | Cả 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ước | Lệnh | Kết quả |
|---|---|---|
| 1 | Sửa các tệp bị xung đột | Chọn dòng đúng, xóa các dấu đánh dấu |
| 2 | git add <file> | Đánh dấu xung đột đã được giải quyết |
| 3 | git commit | Hoà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?
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?
--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?
<<<<<<<, ======= 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?
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?
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.