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
masterta tạo các commit làA1vàA2 - Tại commit
A2ta bắt đầu tạo nhánhbranchB:git checkout -b branchB - Tại nhánh
branchBta tạo commitB1 - Quay lại nhánh
masterta tạo commitA3vàA4 - Quay lại nhánh
branchBta 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à
mastervàbranchB - Nhiệm vụ là merge nhánh
branchBvào nhánhmaster - Nhánh
mastermàu xanh:A1 => A2 => A3 => A4 - Nhánh
branchBmàu đỏ:B1 => B2 - Hiện tại con trỏ HEAD đang đứng tại nhánh
mastercommitA4 - 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
branchBvàomaster:git merge branchB - Nếu không có conflict thì việc tự động merge thành công
- Tại nhánh
masterxuấ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
mastervàobranchB:git rebase master - Chuyển sang nhánh
master:git checkout master - Merge nhánh
branchBvàomaster:git merge branchB - Lúc này tất cả commit của
branchBsẽ được nối tiếp vào sau commit cuốiA4củ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
branchBvàomaster:git rebase branchB - Lúc này tất cả commit của
branchBsẽ được nối tiếp vàomastertạ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
masterlà 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
branchBta đang có 2 commit làB1vàB2 - CommitId ở dạng rút gọn lần lượt là
38dc36c4và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
B1vàB2áp dụng vàomaster:git cherry-pick 38dc36c4 5dfa5082 - Lúc này 2 commit
B1vàB2sẽ đượ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 ở
branchBvà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 ở
branchBvà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.combằ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
passphrasecho SSH thìEnterlà không dùng passphrase - Khi hỏi nhập lại
passphrasethì cũngEntertiếp - OK xong thì trong folder
C:\Users\TrungNT\.sshsẽ có 2 fileid_rsa_cong_ty_viettel.pubvàid_rsa_cong_ty_viettel - File
id_rsa_cong_ty_viettellà file chứa key private cứ để nguyên trong máy - File
id_rsa_cong_ty_viettel.publà 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