Làm web (13) - Git: tích hợp căn bản

Bài học trước: Làm web (12) - Git: phân nhánh căn bản
-----
Cơ bản về tích hợp

Giả sử bạn đã hoàn thành công việc trên nhánh iss53 và quyết định tích hợp vào nhánh master. Nhánh master là nhánh được tích hợp vào, tạm gọi là nhánh chính, nhánh iss53 gọi là nhánh phụ. Để tích hợp, bạn cần chuyển con trỏ HEAD về nhánh chính, sau đó tích hợp bằng lệnh $ git merge.

Ví dụ,

Maxsys@DESKTOP-7LPDOL6 MINGW64 /e/langbiang (iss53)
$ git checkout master
Switched to branch 'master'

$ git merge iss53
Merge made by the 'recursive' strategy.
 index.html              |   2 +
 ting) test chuyen nhanh | 238 ++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 240 insertions(+)
 create mode 100644 index.html
 create mode 100644 ting) test chuyen nhanh

Sau khi gõ lệnh $ git merge iss53, Git sẽ mở một cửa sổ soạn thảo, cho phép nhập thông điệp (message) cho việc merge, bạn nhập thông điệp, đóng cửa sổ soạn thảo để Git hoàn thành việc tích hợp. Nếu không muốn Git mở cửa sổ soạn thảo thì thêm tham số -m “nội dung thông điệp” ngay trong lệnh $ git merge.

Ví dụ,

$ git merge iss53 -m “tich hop iss53 vao master”

Lần tích hợp này khác so với lần tích hợp nhánh hotfix trước đây. Ở lần này, lịch sử commit của master và iss53 đã đi theo hai nhánh khác nhau, do vậy, việc tích hợp không đơn là di chuyển con trỏ master tiến lên như khi tích hợp hotfix.

Xem hình minh họa,



Trong lần tích hợp này, Git sẽ tạo một commit mới, mà snapshot của commit chính là sự kết hợp của 3 snapshot khác, gồm: hai snapshot mới nhất của master và iss53, cùng với snapshot là “cha” chung (common ancestor) của master và iss53. Không giống như các commit thông thường chỉ có một commit cha, commit được tạo ra bởi quá trình merge này sẽ có hai commit cha.

Xem kết quả,

$ git log --oneline --decorate --all --graph
*   7e24aee (HEAD -> master) Merge branch 'iss53'
|\
| * b765740 (iss53) da them logo [issue 53]
| * 1cef1be them logo cho home page
* | e31a627 sua lai logo
|/
* 47ed23e thay doi tren master branch
| * cd69866 (testing) test chuyen nhanh
|/
* a89362e (tag: v1.4-lw, tag: v1.3, tag: v1.2,

Xem hình minh họa,


  
Việc tích hợp đã hoàn thành, nhánh iss53 không còn cần thiết nữa, do vậy bạn có thể xóa nó đi, và kết thúc công việc có số hiệu #53.

$ git branch -d iss53
Deleted branch iss53 (was b765740).

$ git log --oneline --decorate --all --graph
*   7e24aee (HEAD -> master) Merge branch 'iss53'
|\
| * b765740 da them logo [issue 53]
| * 1cef1be them logo cho home page
* | e31a627 sua lai logo
|/
* 47ed23e thay doi tren master branch
| * cd69866 (testing) test chuyen nhanh
|/
* a89362e (tag: v1.4-lw, tag: v1.3, tag: v1.2,

Giải quyết xung đột khi tích hợp

Việc trộn nhánh không phải luôn luôn thành công. Có thể có xung đột (confict) giữa hai nhánh. Xung đột sẽ xảy ra nếu trước đó, ở trên cả hai nhánh, bạn đều sửa trên cùng một vị trí của cùng một tập tin, nghĩa là Git không thể lấy nội dung này đè lên nội dung kia. Khi đó Git sẽ thông báo nội dung tích hợp bị xung đột.

Ví dụ,

Maxsys@DESKTOP-7LPDOL6 MINGW64 /e/langbiang (master)
$ git merge iss123 -m "tich hop iss123 vao master"
Auto-merging conflict_test.txt
CONFLICT (content): Merge conflict in conflict_test.txt
Automatic merge failed; fix conflicts and then commit the result.

Khi bị xung đột, Git sẽ không tự động tạo ra commit mới cho việc tích hợp. Nó sẽ ngưng lại, và chờ bạn xử lý phần nội dung bị xung đột. Để biết tập tin nào không được tích hợp do bị xung đột, sử dụng lệnh $ git status.

Ví dụ,

$ git status
On branch master
Your branch is ahead of 'origin/master' by 7 commits.
  (use "git push" to publish your local commits)

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:   conflict_test.txt

Các tập tin có xung đột mà chưa được xử lý được gọi là unmerged (chưa được tích hợp). Git sẽ sử dụng định dạng chuẩn (do Git quy định) để đánh dấu vùng nội dung bị xung đột. Bạn có thể mở tập tin có xung đột bằng trình soạn thảo mã nguồn bất kì (ví dụ notepad) để quan sát vùng xung đột. Ví dụ nội dung của tập tin conflict_test.txt sẽ như sau:

viet tren nhanh master
<<<<<<< HEAD
viet tren nhanh hotfix
=======
viet tren nhanh iss123
>>>>>>> iss123

Nội dung bị xung đột được đánh dấu bằng khối: <<<<<     ====     >>>>>. Trong đó, phần trên dấu ==== thuộc “nhánh chính” (trong ví dụ này là nhánh master, con trỏ HEAD đang trỏ tới master), phần dưới dấu ==== thuộc “nhánh phụ” (trong ví dụ này là nhánh iss123). Để xử lý xung đột, bạn có thể chọn phần trên, phần dưới hoặc kết hợp cả hai phần lại cho hợp lý. Ví dụ, bạn có thể xử lý xung đột trên bằng cách thay thế toàn bộ khối “<<<< …. >>>> iss123” bằng nội dung: “viet tren nhanh”.

Ba hàng có chứa <<<<, ====, và >>>> sẽ bị xóa đi. Sau khi đã xử lý các xung đột trên mỗi tập tin, bạn cần lưu lại, đóng chương trình soạn thảo, chạy lệnh $ git add <tên tập tin> để báo cho Git biết là xung đột đã được xử lý. Git xem các tập tin được đưa vào khu vực tổ là đã được xử lý xung đột.

Sau khi đã xử lý xung đột xong, bạn gõ lệnh $ git commit để hoàn thành việc tích hợp đang bị ngưng lại. Git sẽ mở lại thông điệp bạn đã nhập trong lệnh $ git merge trước đó, bạn có thể chỉnh sửa lại thông điệp nếu cần thiết, đóng cửa sổ soạn thảo thông điệp để hoàn thành việc trộn nhánh.

Ví dụ,

$ git commit
[master e71b39c] tich hop iss123 vao master

Xem kết quả,

$ git log --all --graph --decorate --oneline
*   e71b39c (HEAD -> master) tich hop iss123 vao master
|\
| * a8ac313 (iss123) them noi dung tren iss123
* | e90d0e6 (hotfix) them noi dung tren hotfix
|/
* 3993e98 them conflict_test file
*   7e24aee Merge branch 'iss53'

Bạn có thể cài đặt các công cụ giao diện đồ hoạ để xử lý xung đột. Ví dụ, công cụ meld (http://meldmerge.org/). Đọc thêm về các công cụ merge tại đây: https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_advanced_merging

Lab 30. Tạo ra tình huống có xung đột khi tích hợp.

– Làm việc trên local repo

– Trên nhánh master, tạo tập tin conflict_test.txt, nhập nội dung vào dòng đầu tiên “viet tren nhanh master”, commit

– Tạo hai nhánh hotfix và iss123

– Chuyển qua nhánh hotfix, nhập thêm nội dung cho conflict_test.txt vào dòng thứ 2 là “viet tren nhanh hotfix”, commit

– Chuyển qua nhánh iss123, nhập thêm nội dung cho conflict_test.txt vào dòng thứ 2 là “viet tren nhanh iss123”

– Tích hợp hotfix vào master

– Tích hợp iss123 vào master

– Xử lý xung đột thủ công bằng một trình soạn mã


– Thực hiện các thao tác còn lại để hoàn thành việc tích hợp.
-----------
Cập nhật [14/10/2019]
-----------
Xem thêm: Tổng hợp các bài viết về Làm web
Xem thêm: Làm web (14) - Git: quản lý nhánh