Git & Git Hub: Bài 6 Xử Lý Conflick trong Git
Hello.
Chào mừng các bạn đến với chủ đề git & github tại blog : Phát triển phần mềm 123AZ.
Bài viết ngày hôm nay chúng ta cùng tìm hiểu cách xử lý conflick trong git.
1. Conflick code là gì.
Hiểu đơn giản đó là sự va chạm đoạn mã code giữa 2 người lập trình viên cùng phát triển dự án.
Bạn tưởng tượng thế này:
Một file A.cpp tại dòng 100 => Bạn viêt một hàm là: FunctionA.
Cũng tại file A đó => Đồng nghiệp của bạn cũng viết một hàm là FunctionB.
Giả sử đồng nghiệp của bạn đẩy code lên server trước. Khi bạn lấy code từ server về, thì lập tức xảy ra va chạm.
Git nó thấy rằng, cùng tại file A dòng 100, server đang có hàm FunctionB,
trong khi tại máy tính local của bạn lại đang có hàm FunctionA.
Vậy thì git không biết sẽ lấy cái nào, nên nó đưa ra thống báo conflick cho lập trình viên biết và tìm cách xử lý.
Xử lý conflick chính là kỹ thuật merge code,
nghĩa là bạn phải hợp được mã code của bạn và của đồng nghiệp lại trong một file để sao cho chức năng của bạn đồng nghiệp vẫn chạy được, và các chức năng mới của bạn vẫn đảm bảo ok.
2. Thực hành xử lý conflick.
Tôi sử dụng RepoGame của tôi như và nhánh sdlgame2018.
Trong file common_function.h tôi thêm một hàm: int TestFunctionGame() tại dòng 78
Và trong file cpp tôi định nghĩa hàm này tại dòng 237.
Tôi giả sử lúc này, trên server tại dòng 78 file common_function.h và dòng 237 file common_function.cpp đã có một hàm khác, do một người khác làm.
– Tôi thực hiện lệnh git commit
– Sau đó tôi thực hiện git pull origin [tên nhánh]
Bạn sẽ thấy: code được lấy mới về nhưng có thông báo conflick xuất hiện.
Bạn hãy bật git extension lên và bạn sẽ thấy có thông báo nhấp nháy màu đỏ ở góc dưới cùng bên phải trên git extension.
Đó là thông báo conflick. Bạn ấn vào đó, git extension sẽ show cho bạn những file bị conflick.
Bạn chọn từng file và bắt đầu quá trình merge code.
Khi bận ấn vào merge code, thì file sẽ được show bởi TortoiseMerge (đã cấu hình công cụ merge tool là TortoiseMerge ở bài trước).
Nó sẽ cho bạn thấy được vị trí conflick. Tortoise sẽ show view thành 3 phần,
bên phải là file local, bên trái file server, và một phần chia ngang là file merge thống nhất.
Bạn có các lựa chọn merge như sau:
+ Chỉ chọn khối code ở tại local (user text block from right)=> nguy cơ mất code của người khác khi bạn push code
+ Chỉ chọn khối code của server (user text block from left)=> bạn mất hết code của bạn, trừ khi code server đã có rồi,
+ Chọn local trước, và server sau. (right before left)
+ Chọn server trước và local sau (left before right) (khuyến khích dùng kiểu này, để giữ nguyên vị trí dòng code của server)
Merge code là một kỹ thuật không đơn giản,
đòi hỏi phải có kinh nghiệm, chắc chắn và cẩn thẩn, thì mới đảm bảo việc không bị mất code của đồng nghiệp.
Sau khi bạn merge xong một đoạn conflick, bạn có thể ấn next conflick để xem các điểm va chạm tiếp theo,
nếu hết thì ấn save file.
Lại tiếp tục đến file tiếp theo trong bản thông báo các file conflick trong git extension.
Khi hết file conflick, git extension sẽ show một dialog hỏi bạn có commit luôn không.
Vì việc merge code là thêm các code mới từ server vào local,
nên project của bạn sẽ thay đổi => cần commit lại.
+ Nếu như conflick nó đơn giản, phần code bị conflick không nhiều, dễ merge,
bạn cảm thấy chắc chắn rằng merge là thành công,
thì bạn có thể chọn yes và commit luôn trên git extension.
+ Ngược lại khi bạn phải merge một số lượng file khá lớn, mỗi file lại có nhiều conflick,
bạn không dám đảm bảo merge xong có chạy được luôn không, thì đừng commit sau khi merge xong các file.
Bạn kiểm tra lại project, build lại xem có lỗi không,
xem tại file đó dòng đó đã có code của mình và server chưa,
nếu build có lỗi thì bạn phải sửa cho hết lỗi.
Sau đó nếu build thành công, thì hãy thực hiện lênh commit trên git như hình minh họa dưới đây.
Cuối cùng thực hiện git push origin [tên nhánh] để đẩy code lên server.
Như vậy đó là toàn bộ kỹ thuật xử lý merge code khi xảy ra conflick giữa server và máy local,
do hai người cùng tạo một đoạn code mới tại cùng một vị trí.
Hãy đọc kỹ bài viết và thực hành để nắm thật chắc kỹ thuật merge code và xử lý conflick trong git.