Một số cách merge code trong git
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 sang 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
7. Tạo SSH Key dưới local
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
- Mở Git bash gõ câu lệnh ở trên
- Thay
your_email@example.com
bằng email của bạn - Khi được hỏi lưu file ở đâu thì
Enter
để lưu ở vị trí mặc định, mặc định tên file làid_rsa
- Nếu bạn muốn sử dụng nhiều file SSH thì có thể đặt tên khác như:
id_rsa_cong_ty_viettel
- Khi hỏi nhập
passphrase
cho SSH thìEnter
là không dùng passphrase - Khi hỏi nhập lại
passphrase
thì cũngEnter
tiếp - OK xong thì trong folder
C:\Users\TrungNT\.ssh
sẽ có 2 fileid_rsa_cong_ty_viettel.pub
vàid_rsa_cong_ty_viettel
- File
id_rsa_cong_ty_viettel
là file chứa key private cứ để nguyên trong máy - File
id_rsa_cong_ty_viettel.pub
là file chứa key public thì ta copy key này cho github, gitlab...
Passphrase được dùng để encrypt cái private key trên máy tính cá nhân của bạn. Trong đó encrypt khi sử dụng thì phải decrypt nên để tránh rườm rà, coi như máy tính của bạn an toàn khỏi encrypt nữa
// chuyển terminal sang folder home của user trên máy
cd ~
// chuyển terminal sang .ssh
cd .ssh
// xem nội dung bên trong file id_rsa_cong_ty_viettel.pub
cat id_rsa_cong_ty_viettel.pub
8. Add SSH key to ssh-agent
// Chạy ssh-agent
eval $(ssh-agent -s)
// Thêm ssh-key vào ssh-agent
ssh-add ~/.ssh/id_rsa_cong_ty_viettel
// Nếu thấy báo như này là ngon
Identity added: /c/Users/TrungNT/.ssh/id_rsa_cong_ty_viettel
9. Thêm SSH vào github account
// Copy SSH public key vào clipboard
clip < ~/.ssh/id_rsa_cong_ty_viettel
- Vào github => Account => Settings
- Vào mục SSH và GPG keys
- Thêm mới một SSH và paster cái SSH key vừa mới copy ở trên.
- Đặt title cho SSH để dễ phân biệt
// Xác nhận thêm SSH key thành công bằng lệnh sau
ssh -T git@github.com
// Nếu thông báo như này là ngon
Hi kentrung! You've successfully authenticated, but Github does not provide shell access.
All rights reserved