Computer >> Máy Tính >  >> Lập trình >> Lập trình

Cách giải quyết xung đột Git Merge

Trong hầu hết các trường hợp, Git có thể giải quyết sự khác biệt giữa các nhánh và hợp nhất chúng. Điều này là do các nhà phát triển thường thực hiện thay đổi đối với các dòng hoặc tệp khác nhau. Có một số trường hợp Git không thể hợp nhất một kho lưu trữ. Những tình huống này được gọi là xung đột hợp nhất.

Trong hướng dẫn này, chúng ta sẽ nói về hợp nhất là gì, xung đột hợp nhất là gì và cách bạn có thể giải quyết xung đột hợp nhất git. Hãy bắt đầu!

Xung đột hợp nhất là gì?

Xung đột hợp nhất là khi Git không thể hợp nhất hai nhánh mà không có sự trợ giúp của bạn.

Hợp nhất là một tính năng nền tảng của hệ thống kiểm soát phiên bản như Git. Chúng cho phép các nhà phát triển duy trì nhiều dòng phát triển riêng biệt trong một kho lưu trữ. Điều này có nghĩa là một nhà phát triển có thể làm việc để sửa lỗi trên một nhánh mà không cần phải thay đổi bản sao chính của dự án.

Hợp nhất xung đột phát sinh trong hai trường hợp:

  • Hai nhánh đã thay đổi cùng một dòng mã.
  • Một chi nhánh đã xóa một tệp đã bị thay đổi trên một chi nhánh khác.

Khi xung đột hợp nhất phát sinh, một lỗi sẽ được trình bày trong Git. Điều này cho bạn biết rằng Git không thể hợp nhất các nhánh thành công.

Cách giải quyết xung đột tệp đã xóa

Các nhánh Git độc lập với nhau. Điều này có nghĩa là nhà phát triển có thể xóa tệp trên một nhánh mà thay đổi đó không ảnh hưởng đến nhánh kia.

Xung đột hợp nhất có thể xảy ra nếu một thay đổi được thực hiện đối với tệp trên một nhánh và tệp đó bị xóa trên nhánh khác. Điều này là do Git không biết nên xóa hoặc thay đổi tệp.

81% người tham gia cho biết họ cảm thấy tự tin hơn về triển vọng công việc công nghệ của mình sau khi tham gia một cuộc thi đào tạo. Kết hợp với bootcamp ngay hôm nay.

Sinh viên tốt nghiệp bootcamp trung bình dành ít hơn sáu tháng để chuyển đổi nghề nghiệp, từ khi bắt đầu bootcamp đến khi tìm được công việc đầu tiên của họ.

Giả sử chúng ta có hai nhánh:dev và master. Trên nhánh nhà phát triển, chúng tôi đã xóa tệp README.md. Trên nhánh chính, chúng tôi đã thêm văn bản mới.

Chúng ta có thể hợp nhất các nhánh này bằng cách sử dụng lệnh git merge:

git merge dev

Điều này sẽ hợp nhất nhánh "dev" vào nhánh hiện tại của chúng ta, nhánh này là chính. Mã của chúng tôi đã trả về một xung đột hợp nhất:

Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.

Để giải quyết xung đột này, chúng ta cần đưa ra quyết định:chúng ta muốn giữ lại tệp hay thay đổi nó? Nếu bạn muốn giữ lại tệp, hãy sử dụng lệnh git add và thêm nó trở lại kho lưu trữ:

git add README.md

Nếu không, hãy sử dụng lệnh git rm để xóa nó khỏi kho lưu trữ của bạn:

git rm README.md

Lệnh rm command sẽ xóa tệp khỏi kho lưu trữ cục bộ của bạn. Trước khi bạn sử dụng lệnh rm, hãy kiểm tra kỹ để đảm bảo rằng bạn muốn xóa tệp.

Khi bạn đã chọn phải làm gì với các tệp xung đột, bạn có thể tạo cam kết với các thay đổi của mình và hợp nhất nhánh:

git add README.md
git commit -m "feat: Add README.md to repository"
git merge dev

Lệnh git add sẽ thực hiện các thay đổi của chúng ta. Lệnh git commit tạo ra một commit mới. Lệnh git merge hợp nhất các nhánh dev và master của chúng ta. Các chi nhánh của chúng tôi hiện có thể hợp nhất vì chúng tôi đã giải quyết xung đột hợp nhất.

Cách giải quyết xung đột thay đổi tệp

Các nhà phát triển đôi khi thực hiện các thay đổi đối với các tệp giống nhau trên hai nhánh khác nhau. Git không thể phân biệt thay đổi nào cần giữ khi hai nhánh được hợp nhất.

Trong trường hợp này, một xung đột hợp nhất sẽ phát sinh. Giả sử chúng ta có một kho lưu trữ với hai nhánh:master và dev. Chúng tôi đã thực hiện một thay đổi đối với tệp README.md trên cả hai nhánh. Điều này đã gây ra xung đột hợp nhất:

Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.

Bước đầu tiên là xác định nguyên nhân gốc rễ của xung đột hợp nhất. Bạn có thể thực hiện việc này bằng cách sử dụng lệnh git status:

On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)

    both modified:   README.md

Từ thông báo này, chúng tôi có thể thấy rằng tệp README.md đã được sửa đổi trên cả hai nhánh. Bây giờ, chúng ta phải giải quyết xung đột hợp nhất của chúng ta. Hãy mở tệp README.md của chúng tôi bằng trình chỉnh sửa văn bản:

This is a README.md file.
This is in a repository called merge-conflicts.
<<<<<<< HEAD
This file is on the main branch.
=======
This file is on the dev branch.
>>>>>>> dev

Git đã chỉnh sửa tệp để cho chúng tôi biết rằng tồn tại xung đột hợp nhất và thêm các điểm đánh dấu xung đột. Git sử dụng các ký tự dấu nhỏ hơn, lớn hơn và bằng để thể hiện xung đột hợp nhất.

Dấu nhỏ hơn (<) đại diện cho những thay đổi được thực hiện đối với nhánh hiện tại. Dấu hiệu lớn hơn (>) cho bạn biết sự thay đổi được thực hiện đối với nhánh mà bạn đã cố gắng hợp nhất với nhánh hiện tại của mình. Các dấu bằng (=) phân biệt sự khác biệt.

Trong trường hợp này:

  • “Tệp này nằm trên nhánh chính.” nằm trên chi nhánh chính của chúng tôi (hoặc HEAD).
  • “Tệp này nằm trên nhánh nhà phát triển.” nằm trong chi nhánh nhà phát triển của chúng tôi.

Để giải quyết xung đột công cụ hợp nhất này, tất cả những gì bạn cần làm là xóa văn bản mà bạn không muốn. Giả sử rằng chúng tôi muốn mã của mình nói:“Tệp này nằm trên một nhánh”. Chúng tôi có thể thực hiện sửa đổi này như vậy:

This is a README.md file.
This is in a repository called merge-conflicts.
This file is on a branch.

Khi chúng tôi đã thực hiện những thay đổi này, chúng tôi đã sẵn sàng thực hiện hợp nhất cuối cùng. Hãy thực hiện các thay đổi của chúng tôi, chuyển chúng vào hệ thống lưu trữ của chúng tôi và hợp nhất dev của chúng tôi và master chi nhánh:

git add .
git commit -m "feat: Resolve merge conflict."
git merge dev

Bây giờ chúng tôi đã giải quyết xung đột hợp nhất của mình, mã của chúng tôi hợp nhất thành công.

Kết luận

Hợp nhất xung đột phát sinh khi bạn thực hiện thay đổi đối với cùng một dòng văn bản trên hai nhánh hoặc khi bạn thay đổi tệp trên một nhánh và xóa tệp đó trên nhánh khác.

Trong hướng dẫn này, chúng tôi đã thảo luận về cách giải quyết xung đột hợp nhất trong cả hai trường hợp. Bây giờ, bạn đã sẵn sàng để bắt đầu giải quyết các xung đột hợp nhất như một chuyên gia Git.