Cách giải quyết git conflict – Nhật ký dev

Table of Content

Tình huống

Khi làm việc nhóm, pull, push, merge code, sẽ có trường hợp hai người cùng chỉnh sửa một file, một dòng code, khi đồng bộ sẽ xảy ra xung đột (conflict).
Khi bạn làm việc với nhiều branch, nhảy qua nhảy về, commit, sửa chung một dòng code, cũng sẽ xảy ra conflict.
Trên đây là hai tình huống thường gặp về git conflict.
Vậy giải quyết nó thế nào? Có khó không?

Đây là bài viết trong loạt bài viết về git, những bài khác các bạn có thể xem tại:

Bài viết này giả sử bạn đã có kiến thức căn bản về git branch. Nếu chưa, vui lòng đọc bài viết git branch và mô hình pull request trước khi tiếp tục.

Code chút thôi

Mở terminal, tạo project mới với tên demo_conflict

$ mkdir demo_conflict
$ cd demo_conflict
$ git init
Initialized empty Git repository in /Users/user/Desktop/demo_conflict/.git/

Tạo master branch và thêm file vào, sửa và commit:

$ git checkout -b master
Switched to a new branch 'master'
$ touch file_in_master
$ echo "line 1 in master" >> file_in_master 
$ git add file_in_master 
$ git commit -m "init and add first line in master"
[master (root-commit) 8ce99ba] init and add first line in master
1 file changed, 1 insertion(+)
create mode 100644 file_in_master

Tiếp đến tạo conflict branch và thêm dòng thứ hai vào rồi commit lên conflict branch

$ git checkout -b conflict
Switched to a new branch 'conflict'
$ git commit -m "Add line 2 in conflict branch" >> file_in_master 
$ git add file_in_master
$ git commit -m "Add line 2 in conflict branch"
[conflict 9bc520e] Add line 2 in conflict branch
1 file changed, 1 insertion(+)

Đến đây là xong khâu chuẩn bị, quay về master và sinh ra conflict thôi:
Trình tự như sau: trong khi bên conflict branch chỉnh sửa dòng 2, và commit lên, thì bên master mình cũng chỉnh sửa dòng 2 và commit lên bên này. Mọi thứ vẫn ok, cho đến khi ta thực hiện ghép code bên conflict branch vào master bằng lệnh merge hoặc rebase, ở ví dụ này mình dùng merge:

$ git checkout master
Switched to branch 'master'
$ echo "line 2 in master branch, this will lead to conflict issue" >> file_in_master 
$ git add file_in_master 
$ git commit -m "add line 2 in master branch, this will lead to conflict issue"
[master b5fb839] add line 2 in master branch, this will lead to conflict issue
1 file changed, 1 insertion(+)
$ git merge conflict
CONFLICT (content): Merge conflict in file_in_master
Recorded preimage for 'file_in_master'
Automatic merge failed; fix conflicts and then commit the result.

Đến đây là conflict xảy ra (để ý dòng 9, 10 và 11), mở file file_in_master ra và ta sẽ nhận được:

line 1 in master
>>>>>>> HEAD
line 2 in master branch, this will lead to conflict issue
=======
line 2 in conflict branch
<<<<<<< conflict

git đã gom hết nội dung của hai branch lại và chỉ rõ cho ta là bị conflict ở dòng nào, dòng nào thuộc branch nàonào. Ở trên HEAD tức là cái commit cuối cùng của branch mà mình đang đứng (master).
Công việc của mình bây giờ là chỉnh sửa file này lại theo ý mình muốn, trong ví dụ này, mình giữ lại thay đổi của cả hai branch:

line 1 in master
line 2 in master branch, this will lead to conflict issue
line 2 in conflict branch

Sau đó tiến hành add vào git indexcommit như bình thường thôi:

$ git add .
$ git commit -m "resolve conflict"
Recorded resolution for file_in_master.
[master c084034] resolve conflict

Lưu ý rằng conflict branch bên kia vẫn y nguyên, không ảnh hưởng gì cả, do mình chỉ thực hiện lấy code bên kia ghép vào bên này thôi mà 🙂

Tạm kết

Khi làm việc nhóm, việc conflict code là chuyện bình thường và rất hay gặp phải. Chỉ cần hiểu được nguyên nhân dẫn đến conflict và nắm được nguyên lý của việc giải quyết conflict thì mọi chuyện sẽ trở nên dễ dàng đi rất nhiều 🙂

Happy coding!