Trong Git, hợp nhất(merge) là một thủ tục để kết nối lịch sử đã phân nhánh. Nó kết hợp hai hoặc nhiều lịch sử với nhau. Lệnh git merge tạo điều kiện cho bạn lấy dữ liệu được tạo bởi git branch và tích hợp chúng vào một nhánh duy nhất. Git merge sẽ liên kết một loạt các commit thành một lịch sử thống nhất. Nói chung, hợp nhất git được sử dụng để kết hợp hai nhánh.
Nó được sử dụng để duy trì các dòng phát triển riêng biệt; ở một số giai đoạn, bạn muốn hợp nhất các thay đổi trong một nhánh. Điều cần thiết là phải hiểu cách hợp nhất hoạt động trong Git.
Trong hình trên, có hai nhánh master và feature . Chúng ta có thể thấy rằng chúng ta đã thực hiện một số commit trong cả nhánh feature và nhánh chính, và hợp nhất chúng. Nó hoạt động như một con trỏ. Nó sẽ tìm thấy một commit cơ sở chung giữa các nhánh. Khi Git tìm thấy một commit cơ sở được chia sẻ, nó sẽ tạo một “commit hợp nhất” mới. Nó kết hợp các thay đổi của từng chuỗi commit hợp nhất được xếp hàng đợi.
Nội dung chính
1. Lệnh “git merge”
Lệnh git merge được sử dụng để gộp các nhánh.
Cú pháp cho lệnh hợp nhất git như sau:
git merge < query >
Nó có thể được sử dụng trong nhiều ngữ cảnh khác nhau. Một số như sau:
Kịch bản 1: Để hợp nhất commit được chỉ định với nhánh hiện đang hoạt động:
Sử dụng lệnh dưới đây để hợp nhất commit được chỉ định với nhánh hiện đang bạn đang hoạt động.
git merge < commit >
Lệnh trên sẽ hợp nhất commit được chỉ định với nhánh hiện đang hoạt động. Bạn cũng có thể hợp nhất commit đã chỉ định với một nhánh cụ thể bằng cách chuyển tên nhánh vào <commit>. Hãy xem cách commit với một nhánh hiện đang hoạt động.
Xem ví dụ dưới đây. Tôi đã thực hiện một số thay đổi trong file demo123.txt của dự án của mình và commit nó trong nhánh test của tôi .
Sao chép commit cụ thể mà bạn muốn hợp nhất trên một nhánh đang hoạt động và thực hiện thao tác hợp nhất. Xem kết quả bên dưới:
Trong đầu ra ở trên, chúng ta đã hợp nhất commit trước đó trong thử nghiệm nhánh hoạt động2.
Kịch bản 2: Để hợp nhất các commit vào nhánh chính:
Để hợp nhất một commit được chỉ định thành chính, trước tiên hãy tìm id commit của nó. Sử dụng lệnh log để tìm id commit cụ thể.
git log
Xem kết quả bên dưới:
Để hợp nhất các commit vào nhánh chính, hãy chuyển sang nhánh chính.
git checkout master
Bây giờ, Chuyển sang nhánh ‘master’ để thực hiện thao tác hợp nhất trên một commit. Sử dụng lệnh git merge cùng với tên nhánh chính. Cú pháp cho điều này như sau:
git merge master
Xem kết quả bên dưới:
Như được hiển thị trong đầu ra ở trên, commit cho id commit bb79d24f6e5c759213e4d4ea01f8564aef626a98 đã hợp nhất vào nhánh chính. Hai file đã thay đổi trong nhánh chính. Tuy nhiên, chúng tôi đã thực hiện commit này trong nhánh test. Vì vậy, có thể hợp nhất bất kỳ commit nào trong bất kỳ nhánh nào.
Mở các file mới và bạn sẽ nhận thấy rằng dòng mới mà chúng ta đã commit với nhánh kiểm tra hiện được sao chép trên nhánh chính.
Tình huống 3: Git merge nhánh.
Git cho phép gộp toàn bộ nhánh này vào nhánh khác. Giả sử bạn đã thực hiện nhiều thay đổi trên một nhánh và muốn hợp nhất tất cả các thay đổi đó cùng một lúc. Git cho phép bạn làm như vậy. Xem ví dụ dưới đây:
Trong đầu ra đã cho, tôi đã thực hiện các thay đổi trong newfile2 trên nhánh test2. Bây giờ, tôi đã commit thay đổi này trong nhánh thử nghiệm.
Bây giờ, chuyển sang nhánh mong muốn mà bạn muốn hợp nhất. Trong ví dụ đã cho, tôi đã chuyển sang nhánh chính. Thực hiện lệnh dưới đây để hợp nhất toàn bộ nhánh trong nhánh đang hoạt động.
git merge < branchname >
Như bạn có thể thấy từ đầu ra đã cho, toàn bộ commit của branch test2 đã được hợp nhất thành branch master.
2. Xung đột khi Git Merge
Khi hai nhánh đang cố gắng hợp nhất và cả hai đều được chỉnh sửa cùng một lúc và trong cùng một file, Git sẽ không thể xác định phiên bản nào sẽ thực hiện để thay đổi. Tình huống như vậy được gọi là xung đột hợp nhất. Nếu tình huống như vậy xảy ra, nó sẽ dừng ngay trước khi hợp nhất commit để bạn có thể giải quyết xung đột theo cách thủ công.
Hãy cùng hiểu nó bằng ví dụ sau.
Giả sử kho lưu trữ từ xa của tôi đã được sao chép bởi hai thành viên trong nhóm của tôi là user1 và user2 . Người dùng1 đã thực hiện các thay đổi như bên dưới trong file chỉ mục dự án của tôi.
Cập nhật nó trong kho lưu trữ cục bộ với sự trợ giúp của lệnh git add.
Bây giờ hãy commit các thay đổi và cập nhật nó với kho lưu trữ từ xa. Xem kết quả bên dưới:
Bây giờ, kho lưu trữ từ xa của tôi sẽ trông như thế này:
Nó sẽ hiển thị trạng thái của file như được chỉnh sửa bởi ai và khi nào.
Bây giờ, cùng lúc, user2 cũng cập nhật file chỉ mục như sau.
Người user2 đã thêm và commit các thay đổi trong kho lưu trữ cục bộ. Nhưng khi anh ta cố gắng đẩy nó đến máy chủ từ xa, nó sẽ phát ra lỗi. Xem kết quả bên dưới:
Trong kết quả đầu ra ở trên, máy chủ biết rằng file đã được cập nhật và không được hợp nhất với các nhánh khác. Vì vậy, yêu cầu push đã bị máy chủ từ xa từ chối. Nó sẽ đưa ra một thông báo lỗi như [từ chối] không thể đẩy một số giới thiệu đến <URL từ xa> . Nó sẽ đề xuất bạn pull kho lưu trữ trước trước khi push. Xem lệnh dưới đây:
Trong đầu ra đã cho, lệnh git rebase được sử dụng để kéo kho lưu trữ từ URL từ xa. Tại đây, nó sẽ hiển thị thông báo lỗi như xung đột hợp nhất trong <tên file> .
3. Giải quyết xung đột:
Để giải quyết xung đột, cần biết xung đột có xảy ra hay không và tại sao lại xảy ra. Lệnh công cụ hợp nhất Git được sử dụng để giải quyết xung đột. Lệnh hợp nhất được sử dụng như sau:
git mergetool
Trong kho lưu trữ của tôi, nó sẽ dẫn đến:
Kết quả trên hiển thị trạng thái của file bị xung đột. Để giải quyết xung đột, hãy vào chế độ insert chỉ bằng cách nhấn phím I và thực hiện các thay đổi như bạn muốn. Nhấn phím Esc để thoát ra từ chế độ chèn. Nhập: w! ở cuối trình chỉnh sửa để lưu và thoát các thay đổi. Để chấp nhận các thay đổi, hãy sử dụng lệnh rebase. Nó sẽ được sử dụng như sau:
git rebase --continue
Do đó, xung đột đã được giải quyết. Xem kết quả bên dưới:
Trong kết quả đầu ra ở trên, xung đột đã được giải quyết và kho lưu trữ cục bộ được đồng bộ hóa với kho lưu trữ từ xa.
Để xem đó là văn bản được chỉnh sửa đầu tiên của xung đột hợp nhất trong file của bạn, hãy tìm kiếm file được đính kèm với điểm đánh dấu xung đột <<<<<<< . Bạn có thể thấy những thay đổi từ HEAD hoặc nhánh cơ sở sau dòng <<<<<<< HEAD trong trình soạn thảo văn bản của bạn. Tiếp theo, bạn có thể thấy dải phân cách như ======= . Nó phân chia các thay đổi của bạn với các thay đổi trong nhánh khác, theo sau là >>>>>>> NHÁNH-TÊN. Trong ví dụ trên, user1 đã viết “<h1> Git là điều khiển phiên bản </h1>” trong nhánh cơ sở hoặc HEAD và user2 đã viết “<h2> Git là kiểm soát phiên bản </h2>”.
Quyết định xem bạn chỉ muốn giữ lại các thay đổi của nhánh của mình hay các thay đổi của nhánh khác hoặc tạo một thay đổi mới. Xóa các điểm đánh dấu xung đột <<<<<<<, =======, >>>>>>> và tạo các thay đổi cuối cùng mà bạn muốn hợp nhất.
Cài ứng dụng cafedev để dễ dàng cập nhật tin và học lập trình mọi lúc mọi nơi tại đây.
Tài liệu từ cafedev:
- Full series tự học Git từ cơ bản tới nâng cao tại đây nha.
- Ebook về Git tại đây.
- Các nguồn kiến thức MIỄN PHÍ VÔ GIÁ từ cafedev tại đây
Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:
Chào thân ái và quyết thắng!