Hợp nhất là một quá trình rất quan trọng khi làm việc với Git. Trong bài viết này, chúng ta sẽ thảo luận về lệnh hợp nhất Git Merge rất quen thuộc trong Git. Nếu bạn là người mới bắt đầu sử dụng Git và đang muốn hiểu quy trình hợp nhất trong Git, thì bạn nên đọc bài viết này.
Mục lục
1. Git Merge là gì?
Git Merge là một lệnh dùng để hợp nhất các chi nhánh độc lập thành một nhánh duy nhất trong Git.
Khi sử dụng lệnh hợp nhất trong Git, chỉ có nhánh hiện tại được cập nhật để phản ánh sự hợp nhất, còn nhánh đích sẽ không bị ảnh hưởng. Điều này có nghĩa rằng, Git Merge thường được sử dụng kết hợp với git checkout để chọn nhánh hiện tại và git branch để xóa nhánh nguồn đã lỗi thời.
2. Cách thức hoạt động của Git Merge
Công dụng chính của lệnh Git Merge là hợp nhất hai nhánh. Nó cũng được dùng để hợp nhất chuỗi commit (cam kết) thành một lịch sử thống nhất.
Để hiểu rõ cách thức hoạt động của lệnh Git Merge, chúng ta sẽ lấy một mẫu hợp nhất nhánh làm ví dụ. Trong hình minh họa sau, Git Merge sẽ lấy hai nhánh và tìm thấy một commit cơ sở chung giữa chúng. Khi Git tìm thấy một commit cơ sở chung, nó sẽ tạo một cam kết hợp nhất (merge commit) mới và hợp nhất các thay đổi theo trình tự của mỗi cam kết hợp nhất. Ở đây, chúng ta có 2 nhánh: master branch và stage branch. Bây giờ, chúng ta sẽ hợp nhất stage branch vào master branch.
Các cam kết hợp nhất là duy nhất vì chúng có hai cam kết chính. Git tự động hợp nhất các lịch sử riêng biệt khi một cam kết hợp nhất mới được tạo. Nó sẽ không kết hợp dữ liệu được thay đổi trong cả hai lịch sử. Tình huống này được gọi là “version control conflict” (xung đột kiểm soát phiên bản). Khi xảy ra xung đột, Git sẽ cần sự can thiệp của người dùng để tiếp tục.
3. Quy trình hợp nhất bằng lệnh Git Merge
Việc hợp nhất trong Git sẽ diễn ra theo quy trình sau:
- Thực thi git status để đảm bảo rằng nó đang trỏ HEAD đến đúng nhánh nhận hợp nhất. Chạy git checkout để chuyển sang nhánh nhận.
- Tìm nạp các remote commit mới nhất bằng lệnh git fetch. Đảm bảo rằng chi nhánh nhận và chi nhánh hợp nhất được cập nhật những thay đổi từ xa mới nhất.
- Kết thúc quá trình tìm nạp, sử dụng lệnh git pull để cập nhật nhánh chính.
- Cuối cùng, thực hiện lệnh git merge <branch name>, trong đó branch name là tên tên của nhánh sẽ được ghép vào nhánh nhận.
Hợp nhất bằng lệnh Git Merge trong Git có thể được thực hiện theo hai hình thức dưới đây:
3.1. Fast Forward Merge
Đây là một dạng hợp nhất “tua nhanh”, thường xảy ra khi có một đường dẫn tuyến tính từ đầu nhánh hiện tại đến nhánh đích. Với Fast Forward Merge, Git sẽ di chuyển đầu nhánh hiện tại lên đầu nhánh đích. Dưới đây là một ví dụ về hợp nhất tua nhanh:
Tuy nhiên, chúng ta không thể sử dụng Fast Forward Merge khi các nhánh đã phân kỳ. Trong trường hợp này, Git sử dụng 3-way merge (hợp nhất 3 chiều) như một giải pháp thay thế.
3.2. 3-way merge
Khi không có đường dẫn đến nhánh đích, Git không có lựa chọn nào khác ngoài việc kết hợp chúng thông qua hợp nhất 3 chiều. Việc hợp nhất này sử dụng thêm một lệnh Git Commit để buộc hai nhánh lại với nhau.
4. Cách giải quyết xung đột hợp nhất
Khi bạn muốn hợp nhất hai nhánh và phần giống nhau của cùng một tệp bị thay đổi, xung đột hợp nhất xảy ra. Nguyên nhân là do Git không tìm ra phiên bản nào sẽ sử dụng. Khi điều này xảy ra, nó sẽ dừng trước khi cam kết hợp nhất để giải quyết xung đột đó.
Xung đột hợp nhất chỉ xảy ra trong trường hợp hợp nhất 3 chiều. Thông thường, Git sử dụng quy trình edit/stage/commit để giải quyết xung đột hợp nhất. Việc chạy lệnh git status sẽ hiển thị các tệp cần được giải quyết.
Trong trường hợp có xung đột, Git sẽ chỉnh sửa nội dung của các tệp bị ảnh hưởng bằng các chỉ báo trực quan đánh dấu cả hai mặt của nội dung xung đột. Các điểm đánh dấu trực quan này là:
- <<<<<<<- Đánh dấu xung đột , xung đột bắt đầu sau dòng này.
- =======- Phân chia những thay đổi của bạn với những thay đổi trong nhánh khác.
- >>>>>>>- Kết thúc các dòng mâu thuẫn.
Sau khi tìm thấy phần xung đột, chúng ta sẽ chạy lệnh git add trên các tệp bị xung đột. Thao tác này nhằm thông báo cho cho Git biết các xung đột đã được giải quyết. Cuối cùng, thực thi lệnh git commit để tạo cam kết hợp nhất.
Trên đây là những kiến thức tổng quan về lệnh Git Merge. Hy vọng những chia sẻ của Got It sẽ giúp bạn hiểu rõ hơn về cách hợp nhất các chi nhánh và giải quyết các xung đột trong Git. Nếu bạn muốn làm chủ hệ thống kiểm soát phiên bản Git, hãy trang bị cho bản thân kỹ năng hợp nhất các nhánh bằng Git Merge nhé!
Tìm hiểu thêm: