Chuyển đến nội dung chính

Hướng dẫn Git Merge: Tài liệu toàn diện kèm ví dụ

Tìm hiểu cách merge nhánh hiệu quả trong Git với hướng dẫn từng bước. Khám phá các chiến lược merge khác nhau, xử lý xung đột và áp dụng thực tiễn tốt để giữ lịch sử Git sạch sẽ.
Đã cập nhật 5 thg 10, 2026  · 15 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity

Nếu bạn từng làm việc trong một dự án có nhiều nhà phát triển (hoặc thậm chí tự mình quản lý nhiều tính năng), bạn sẽ biết branching là điều thiết yếu để giữ mọi thứ gọn gàng. Nhưng đến một lúc nào đó, tất cả các nhánh đó cần được hợp nhất lại—và đó là lúc git merge phát huy tác dụng.

Trong hướng dẫn này, tôi sẽ trình bày các loại merge trong Git, cách chúng hoạt động, và cách xử lý xung đột khi mọi thứ không diễn ra như kế hoạch. Cuối cùng, tôi sẽ chia sẻ một số thực tiễn tốt giúp bạn sử dụng git merge hiệu quả và tránh các lỗi thường gặp.

Git merge là gì?

Trong môi trường làm việc nhóm, các nhà phát triển thường làm việc trên các tính năng, bản sửa lỗi và cải tiến khác nhau trong các nhánh riêng biệt. Khi hoàn tất, họ dùng git merge để tích hợp các thay đổi đó.

Merge kết hợp các thay đổi từ một nhánh vào nhánh khác đồng thời vẫn giữ nguyên toàn bộ lịch sử phiên bản. Nó hợp nhất lịch sử commit của cả hai nhánh.

Hãy cùng hiểu quy trình thông qua một ví dụ.

Một commit gốc chung tách ra thành hai nhánh, dẫn đến hai đầu nhánh main và feature riêng biệt trước khi merge. Ảnh: Tác giả.

Trong hình trên, các nhánh feature và main đã tạo các commit mới kể từ khi nhánh feature được tạo ra.

Một nhánh feature và nhánh main rẽ ra từ một gốc chung và sau đó được kết hợp thành một merge commit duy nhất. Ảnh: Tác giả.

Git merge lấy tất cả commit mới từ cả hai nhánh, bắt đầu từ gốc chung của chúng, và kết hợp lại thành một merge commit duy nhất. Sau đó, nó cập nhật con trỏ head trỏ tới merge commit mới này.

Cách dùng lệnh git merge cơ bản

Merge không chỉ là chạy git merge rồi xong—bạn cần vài bước quan trọng để chuẩn bị trước. Phần này sẽ đi qua toàn bộ quy trình, từ chuẩn bị nhánh cho đến hoàn tất một lần merge thành công.

Bước 1: Chuẩn bị trước khi merge

Chỉ các thay đổi đã commit ở cả hai nhánh mới có thể được merge. Vì vậy, dùng lệnh git status để kiểm tra thay đổi chưa commit và commit chúng bằng lệnh git commit trước khi merge. 

Bước 2: Checkout sang nhánh đích

Trước khi chạy git merge, bạn nên chuyển sang nhánh đích, thường là nhánh main. Chuyển sang nhánh main bằng git checkout main hoặc git switch main. 

Bước 3: Merge một nhánh

Đảm bảo nhánh main đã được cập nhật với kho lưu trữ từ xa. Để làm vậy, chạy git pull origin main.

Giờ thì bạn đã sẵn sàng để merge nhánh feature vào nhánh main! Bạn có thể dùng lệnh như sau:

git merge feature-branch

Bước 4: Xử lý xung đột merge (nếu có)

Git cố gắng tự động xử lý các xung đột có thể xảy ra khi merge. Tuy nhiên, có thể cần can thiệp thủ công khi Git không tự giải quyết được. 

Ví dụ, nếu cùng một dòng trong cùng một tệp được sửa ở các nhánh khác nhau, xung đột merge có thể xảy ra. 

Khi Git phát hiện xung đột, nó sẽ tạm dừng quá trình merge và yêu cầu bạn xử lý. Khi đó:

  • Chạy git status để xem tệp nào bị xung đột. 
  • Mở các tệp đó.
  • Xem lại các dòng mã xung đột và cập nhật chúng để đảm bảo nhất quán giữa hai nhánh.

Bước 5: Commit lần merge

Sau khi xử lý xung đột, dùng lệnh git add .  để stage các tệp đã sửa. Sau đó, hoàn tất merge bằng cách commit với một thông điệp: 

git merge -m “resolved conflicts”

Ở các phần sau, chúng ta sẽ xem cách xử lý xung đột merge chi tiết hơn.  

Đối với người mới bắt đầu, đây là cheat sheet Git đầy đủ gồm mọi lệnh thiết yếu để tạo, cập nhật, xóa và quản lý nhánh. 

Nếu bạn đã có chút kinh nghiệm với Git và cần ôn lại các lệnh quan trọng, hãy xem hướng dẫn này về những lệnh Git được dùng nhiều nhất kèm ví dụ.

Các loại Merge trong Git

Hiểu các loại merge trong Git sẽ giúp bạn chọn chiến lược phù hợp cho tình huống của mình. Dưới đây là ba cách tiếp cận phổ biến khi merge. 

Merge fast-forward

Khi nhánh gốc không có commit mới kể từ khi nhánh feature được tạo, Git sẽ dùng cách fast-forward. 

Nếu nhánh feature của bạn được cập nhật trong khi nhánh main không đổi, merge sẽ di chuyển con trỏ head của main tới nhánh feature. 

Không tạo thêm merge commit nào, nhờ đó lịch sử commit sạch và tuyến tính.

Merge ba chiều (three-way)

Nếu cả nhánh gốc và nhánh feature đều có commit mới, Git sẽ tìm tổ tiên chung và tạo một merge commit mới. Commit này kết hợp lịch sử của cả hai nhánh, vẫn giữ riêng lịch sử của nhánh feature và nhánh main.

Trong ví dụ dưới đây, “E” và “G” là các commit mới vào nhánh main sau khi nhánh feature được tạo. 

      C---D---F (feature-branch)
     /         
A---B---E---G (main) 

Một merge commit mới, “M”, được tạo, giữ nguyên lịch sử của cả nhánh main và nhánh feature. 

       C---D---F
      /         \
 A---B---E---G---M (main)

Squash merge

Squash merge kết hợp tất cả thay đổi của một nhánh feature thành một commit duy nhất và merge nó vào nhánh đích. Cách này không giữ lịch sử commit riêng lẻ của nhánh feature. 

git merge --squash feature_branch_name

Squash merge đặc biệt hữu ích để tránh lộn xộn do nhiều commit nhỏ, đồng thời vẫn giữ trạng thái cuối cùng của tính năng trên nhánh đích.

Merge nhiều nhánh

Khi làm việc với dự án lớn, bạn có thể cần merge nhiều nhánh—hoặc lần lượt từng nhánh, hoặc gộp cùng lúc. Cách bạn chọn phụ thuộc vào quy trình và độ phức tạp của thay đổi. Phần này, tôi sẽ phân tích cả hai cách và khi nào nên dùng hiệu quả.

Merge tuần tự nhiều hơn một nhánh

Để merge các nhánh lần lượt, hãy dùng lệnh merge tuần tự cho từng nhánh feature. 

Bước 1: Chuyển sang nhánh đích nơi bạn muốn merge các thay đổi.

git checkout target_branch_name

Bước 2: Merge nhánh feature đầu tiên như dưới đây.

git merge feature_branch_1

Bước 3: Merge nhánh feature thứ hai như minh họa.

git merge feature_branch_2

Lặp lại quá trình này cho đến khi tất cả các nhánh khác được merge.

Merge song song nhiều hơn một nhánh

Thực hiện các bước sau để merge nhiều nhánh feature cùng lúc.

Bước 1: Chuyển sang nhánh đích nơi bạn muốn merge các thay đổi.

git checkout target_branch_name

Bước 2: Chạy lệnh sau với nhiều nhánh feature 

git merge feature_branch_1 feature_branch_2 feature_branch_3

Khi Git merge nhiều nhánh song song, có thể xảy ra xung đột. Nếu vậy, Git sẽ yêu cầu bạn tự xử lý.

Xử lý xung đột khi merge nhiều nhánh

Merge nhiều nhánh không phải lúc nào cũng đơn giản—đặc biệt khi một nhánh phụ thuộc vào nhánh khác. 

Ví dụ, merge feature_x vào main trước feature_y có thể gây xung đột. Tương tự, nếu các nhánh khác nhau sửa cùng tệp, merge song song có thể dẫn đến xung đột cần được xử lý cẩn thận.

Làm theo các bước này để xử lý xung đột merge:

  • Bước 1: Chạy git status để xem tệp nào gây xung đột.
  • Bước 2: Mở các tệp xung đột và chỉnh sửa cho đúng.
  • Bước 3: Thêm thay đổi vào stage và commit.

Hiểu lịch sử merge commit 

Với các xung đột phức tạp, bạn có thể cần nhiều thông tin hơn những gì git status cung cấp. Khi đó, bạn có thể dùng các lệnh như git log hoặc git show để đào sâu lịch sử.

  • git log: hiển thị toàn bộ lịch sử commit, bao gồm cả merge commit. Điều này giúp xác định merge cụ thể nơi vấn đề xảy ra. 
  • git show: Nếu bạn thấy một merge commit đáng ngờ từ lệnh trên, dùng git show để kiểm tra. Lệnh này cung cấp góc nhìn chi tiết về commit, cho biết những gì đã thay đổi trong lúc merge. Nó cũng xuất ra một định danh duy nhất cho nhánh cha trước khi một merge cụ thể diễn ra.
  • git diff: Bạn có thể lấy định danh duy nhất của nhánh cha và nhánh đã merge từ các lệnh trước, rồi dùng git diff để so sánh thay đổi giữa hai trạng thái đó.

Thực tiễn tốt khi Merge trong Git

Merge đôi khi có thể rối, đặc biệt khi nhiều nhà phát triển cùng làm trên một codebase. 

Dù chúng ta đã đề cập cách xử lý xung đột khi chúng xảy ra, cách tốt nhất là phòng tránh trước. Phần này sẽ đưa ra các mẹo thực tế để quá trình merge mượt mà và lịch sử Git của bạn sạch sẽ.

Giữ nhánh nhỏ gọn và tập trung

Nhánh lớn làm tăng rủi ro chỉnh sửa chồng chéo, dẫn đến nhiều xung đột hơn. Để giảm thiểu, hãy làm một tính năng trên mỗi nhánh và giữ nhánh nhỏ gọn, tập trung.

Thường xuyên pull và merge

Pull các thay đổi mới nhất từ kho từ xa để giữ nhánh gốc luôn cập nhật trước khi merge. Thường xuyên pull cập nhật từ nhánh main vào nhánh feature để đồng bộ. Những việc này giúp tránh các xung đột lớn và phức tạp về sau.

Dùng các công cụ merge tích hợp của Git

Thay vì chỉnh sửa tệp thủ công, bạn có thể dùng các công cụ tích hợp của Git để xử lý xung đột với giao diện trực quan. Khi chạy git mergetool, sẽ có ba lựa chọn:

  • LOCAL - Phiên bản nhánh main. Chọn mục này sẽ giữ nội dung tệp xung đột từ nhánh main và bỏ qua thay đổi từ nhánh feature. 
  • REMOTE - Phiên bản nhánh feature. Chọn mục này sẽ áp dụng nội dung của nhánh feature cho tệp xung đột.
  • BASE - Kết hợp các thay đổi của tệp xung đột từ cả hai nhánh và hợp nhất chúng. 

Merge theo đúng thứ tự

Khi merge nhiều nhánh, thứ tự rất quan trọng—đặc biệt nếu một tính năng phụ thuộc vào tính năng khác. Nếu feature_x phụ thuộc feature_y, merge feature_x trước có thể gây xung đột. Để tránh, luôn merge theo thứ tự phụ thuộc để quy trình trơn tru và giảm thiểu xung đột.

Squash merging 

Như đã đề cập, squash merging gộp tất cả commit từ một nhánh feature thành một commit duy nhất, giữ lịch sử commit gọn gàng và giảm khả năng xung đột merge.

Một cách tiếp cận khác là rebase, áp dụng các thay đổi của nhánh feature trực tiếp lên trên nhánh gốc. Điều này tạo lịch sử tuyến tính và tránh các merge commit không cần thiết. Tuy nhiên, cả hai phương pháp đều viết lại lịch sử và không giữ các commit riêng lẻ từ nhánh feature.

Kết luận

Trong hướng dẫn Git merge này, chúng ta đã đi từ những điều cơ bản về merge đến các thực tiễn tốt để tránh xung đột. Hiểu cách dùng git merge hiệu quả sẽ giúp đội ngũ cộng tác trơn tru, quy trình mượt mà và lịch sử mã sạch sẽ.

Nếu bạn muốn nâng cao kỹ năng Git, hãy xem khóa học Git trung cấp để thành thạo những quy trình và kỹ thuật nâng cao hơn!

Câu hỏi thường gặp

Sự khác nhau giữa git merge và git rebase là gì?

Cả hai lệnh đều tích hợp thay đổi từ một nhánh vào nhánh khác, nhưng git merge tạo một merge commit mới, giữ lịch sử của cả hai nhánh. Ngược lại, git rebase áp dụng các commit từ nhánh feature trực tiếp lên nhánh đích, tạo lịch sử tuyến tính nhưng đồng thời viết lại lịch sử.

Tôi có thể hoàn tác một lần merge trong Git không?

Có, nếu bạn chưa push lần merge lên, bạn có thể dùng:

git reset --hard HEAD~1

Lệnh này đặt lại nhánh của bạn về trạng thái trước khi merge. Nếu lần merge đã được push, bạn sẽ cần dùng git revert để hoàn tác thay đổi một cách an toàn mà vẫn giữ nguyên lịch sử.

Làm thế nào để merge một nhánh remote vào nhánh local của tôi?

Để merge một nhánh remote vào nhánh local của bạn, làm theo các bước sau:

git fetch origin  

git checkout my-branch  

git merge origin/feature-branch 

Điều này đảm bảo bạn đang merge các cập nhật mới nhất từ kho lưu trữ từ xa.

Làm sao để tránh các xung đột merge không cần thiết?

Để giảm thiểu xung đột:

  • Thường xuyên pull các thay đổi mới nhất trước khi bắt đầu công việc mới (git pull).
  • Merge theo thứ tự phụ thuộc nếu nhiều nhánh phụ thuộc lẫn nhau.
  • Dùng feature flag để tích hợp mã dần dần thay vì các nhánh sống lâu.

Điều gì xảy ra khi tôi merge một nhánh đã được merge trước đó?

Nếu một nhánh đã được merge, chạy lại git merge feature-branch sẽ không thay đổi gì. Git sẽ nhận thấy các nhánh có chung lịch sử và chỉ xác nhận rằng mọi thứ đều cập nhật.

Tôi có thể merge nhiều nhánh cùng lúc không?

Không, Git không hỗ trợ merge nhiều nhánh trong một lệnh duy nhất. Bạn cần merge lần lượt:

git merge feature-branch-1  

git merge feature-branch-2  

Nếu cần, bạn có thể tạo một nhánh tích hợp (integration) để merge nhiều nhánh, sau đó merge nhánh đó vào main.

Tôi nên dùng git merge --no-ff hay git merge --ff?

  • --no-ff (không fast-forward) tạo một merge commit mới, giúp dễ theo dõi lịch sử nhánh.
  • --ff (fast-forward) áp dụng trực tiếp thay đổi nếu có thể, tránh các commit dư thừa.

Với các dự án cần theo dõi nhánh tính năng, khuyến nghị dùng --no-ff.


Srujana Maddula's photo
Author
Srujana Maddula
LinkedIn

Srujana là một cây bút công nghệ tự do với bằng Cử nhân Khoa học Máy tính. Việc viết về nhiều chủ đề như khoa học dữ liệu, điện toán đám mây, phát triển, lập trình, bảo mật và nhiều lĩnh vực khác đến với cô một cách tự nhiên. Cô yêu thích văn học kinh điển và khám phá những điểm đến mới.

Chủ đề
Git

Tìm hiểu thêm về Git với các khóa học này!

Khóa học

Git nâng cao

2 giờ
44.5K
Khám phá các nhánh và kho lưu trữ từ xa để kiểm soát phiên bản trong các dự án phần mềm và dữ liệu cộng tác bằng Git!
Xem chi tiếtRight Arrow
Bắt Đầu Khóa Học
Xem thêmRight Arrow
Liên quan

blog

Claude Opus 4.6: Tính năng, Điểm chuẩn, Bài kiểm tra thực hành và hơn thế nữa

Mô hình mới nhất của Anthropic dẫn đầu ở mã hóa tác tử và lập luận phức tạp. Thêm vào đó, nó có cửa sổ ngữ cảnh 1M.
Matt Crabtree's photo

Matt Crabtree

10 phút

Xem ThêmXem Thêm