Bài viết sau mình sẽ không nêu ra lí thuyết của sự khác nhau giữa các cách mà thông qua ví dụ và hình ảnh sẽ giúp các bạn hiểu nhanh vấn đề khi merge nhánh.
1. Tạo folder git-origin
- Tạo mới folder
git-origin
, folder này để làm mẫu cho các ví dụ bên dưới - Khởi tạo git bằng câu lệnh
git init
- Mặc định lúc này chúng ta đang ở nhánh
master
- Tại nhánh
master
ta tạo các commit làA1
vàA2
- Tại commit
A2
ta bắt đầu tạo nhánhbranchB
:git checkout -b branchB
- Tại nhánh
branchB
ta tạo commitB1
- Quay lại nhánh
master
ta tạo commitA3
vàA4
- Quay lại nhánh
branchB
ta tạo commitB2
- Như vậy nếu tính theo dòng thời gian ta có lịch sử commit là:
A1 => A2 => B1 => A3 => A4 => B2
- Tổng kết:
- Có 2 nhánh là
master
vàbranchB
- Nhiệm vụ là merge nhánh
branchB
vào nhánhmaster
- Nhánh
master
màu xanh:A1 => A2 => A3 => A4
- Nhánh
branchB
màu đỏ:B1 => B2
- Hiện tại con trỏ HEAD đang đứng tại nhánh
master
commitA4
- Nhìn dưới dạng Git Graph như sau:
- Có 2 nhánh là
2. Git merge
- Chuyển sang nhánh
master
:git checkout master
- Lúc này đang đứng tại commit
A4
- Merge nhánh
branchB
vàomaster
:git merge branchB
- Nếu không có conflict thì việc tự động merge thành công
- Tại nhánh
master
xuất hiện thêm commit có nội dung:Merge branch 'branchB'
- Sau khi merge:
A1 => A2 => B1 => A3 => A4 => B2 => commit merged
3. Git rebase v1
- Chuyển sang nhánh
branchB
:git checkout branchB
- Lúc này đang đứng tại commit
B2
- Rebase nhánh
master
vàobranchB
:git rebase master
- Chuyển sáng nhánh
master
:git checkout master
- Merge nhánh
branchB
vàomaster
:git merge branchB
- Lúc này tất cả commit của
branchB
sẽ được nối tiếp vào sau commit cuốiA4
của nhánhmaster
- Sau khi rebase:
A1 => A2 => A3 => A4 => B1 => B2
4. Git rebase v2
- Chuyển sang nhánh
master
:git checkout master
- Lúc này đang đứng tại commit
A4
- Rebase nhánh
branchB
vàomaster
:git rebase branchB
- Lúc này tất cả commit của
branchB
sẽ được nối tiếp vàomaster
tại commit bắt đầu rẽ nhánh làA2
- Sau khi rebase:
A1 => A2 => B1 => B2 => A3 => A4
5. Git cherry-pick
- Có một cách nữa khá thủ công để merge code vào nhánh
master
là dùnggit cherry-pick
- Ý tưởng chính của nó là lựa chọn commit ở nhánh bất kì và áp dụng vào nhánh
master
- Để làm được điều đó bạn cần biết ID của commit
- Tại
branchB
ta đang có 2 commit làB1
vàB2
- CommitId ở dạng rút gọn lần lượt là
38dc36c4
và5dfa5082
- Cách làm như sau
- Chuyển sang nhánh
master
:git checkout master
- Lúc này đang đứng tại commit
A4
- Pick các commit
B1
vàB2
áp dụng vàomaster
:git cherry-pick 38dc36c4 5dfa5082
- Lúc này 2 commit
B1
vàB2
sẽ được nối tiếp vào sau commit cuốiA4
- Sau khi rebase:
A1 => A2 => A3 => A4 => B1 => B2
6. Kết luận
- Git merge sẽ chuyển toàn bộ commit ở
branchB
vàomaster
, tạo ra 1 commit thông báo merged thành công, thứ tự commit theo thời gian. - Git rebase sẽ chuyển toàn bộ commit ở
branchB
vàomaster
, không tạo ra commit merged, thứ tự commit tùy thuộc cách áp dụng rebase - Git cherry-pick thì chỉ chọn một số commit ở
branchB
áp dụng vàomaster
, không tạo ra commit merged, các commit được nối tiếp vào nhánhmaster