-----
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: Làm web (14) - Git: quản lý nhánh