Git – Các vấn đề về conflict

Trước tiên, bạn chỉ nên đọc bài viết này nếu đã nắm được các phần cơ bản về git. Nếu chưa, hãy tìm hiểu trong series Git cho người mới bắt đầu

Conflict là gì?

Nói một cách đơn giản, conflict là xung đột xảy ra khi chúng ta tiến hành merge branch. Vậy khi nào merge bị conflict và khi nào thì không bị, chúng ta hãy cùng xem một ví dụ đơn giản sau:

Đầu tiên, ta khởi tạo git và tạo file test_file, sau đó add file vào và commit trong nhánh mặc định là master:

$ git init
$ touch test_file
$ git add test_file
$ git commit -m "Initial commit"

Bây giờ, ta đang làm việc trong nhánh master với 1 file là test_file.


Tiếp theo, ta tạo nhánh newbranch để làm việc:

$ git checkout -b newbranch

Từ đây, mọi thay đổi trên nhánh newbranch sẽ không ảnh hưởng đến nhánh master và ngược lại cho tới khi chúng được merge. Ta tiến hành thêm nội dung cho file test_file rồi commit:

$ echo "line 1 in newbranch" >> test_file
$ git add test_file
$ git commit -m "Edit test file in newbranch"

Lúc này, nội dung trong file test_file đã được thêm ở dòng đầu tiên, tuy nhiên chỉ là trong nhánh newbranch. Giờ hãy quay về lại nhánh master:

$ git checkout master

Như đã nói ở trên, mọi thay đổi trên nhánh newbranch không ảnh hưởng đến nhánh master nên file test_file ở nhánh master lúc này vẫn như ban đầu (còn trống). Ta thêm dòng đầu tiên cho test_file này với nội dung khác rồi commit:

$ echo "line 1 in master" >> test_file
$ git add test_file
$ git commit -m "Edit test_file in master"

Tới đây, ta đã có 2 file test_file khác nhau trong mỗi nhánh. Để kiểm tra nội dung mỗi file, ta có thể checkout qua nhánh tương ứng và dùng lệnh cat test_file:

Bây giờ, chúng ta merge 2 nhánh này lại với nhau để xem điều gì sẽ xảy ra, sử dụng lệnh:

$ git merge newbranch

Lúc đó màn hình hiện lên thông báo:

Điều này có nghĩa là đã có xung đột xảy ra khi merge 2 file test_file với nhau. Ta có thể sử dụng

cat test_file  để xem nội dung của test_file sau khi merge, kết quả thu được là:

Như vậy, khi ta gộp 2 nhánh lại, git sẽ tự động gộp 2 file test_file lại và cập nhật sự thay đổi. Nhưng khi phát hiện file đã bị thay đổi trên cùng một dòng từ cả 2 nhánh, git không biết nên cập nhật chỉnh sửa của nhánh nào. Vì thế, git sẽ hiện thông báo conflict như ở trên. Nếu ở mỗi nhánh, ta chỉnh sửa file ở các dòng khác nhau thì khi merge sẽ không xảy ra conflict

Xử lý khi gặp conflict

Conflict xảy ra là một chuyện rất bình thường khi làm việc với git, vậy thì xử lý conflict như thế nào? Rất đơn giản, git đã cung cấp đầy đủ tên file cũng như đánh dấu lại những chỗ bị conflict. Tất cả những gì bạn phải làm đó là chỉnh sửa file bị conflict này cho phù hợp.

Tiếp tục ví dụ trước, như được thông báo, file bị conflict là test_file, ta tiến hành chỉnh sửa file này bằng cách dùng lệnh vi test_file, giả sử ta giữ lại 2 dòng đã thêm như sau:

Sau đó lưu lại, add file và commit.

$ git add test_file
$ git commit -m "Resolve conflict and commit"

Lưu ý: File test_file sau khi sửa sẽ được cập nhật ở nhánh hiện tại (master branch) trong khi file test_file ở nhánh còn lại (newbranch) không thay đổi tức là giữ nguyên trạng thái như lúc chưa merge.

Các trường hợp có thể xảy ra conflict

Như đã nói ở trên, conflict chỉ xảy ra khi gộp file bị thay đổi cùng một dòng. Do vậy các thao tác như merge branch, rebase branch hay pull file, push file,… gây ảnh hưởng trực tiếp tạo ra việc gộp file đều có khả năng xảy ra conflict. Và cách để xử lý những conflict này thì vẫn là xử lý bằng tay như đã đề cập ở phần trên.

 

Gửi phản hồi