+5

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à A1A2
  • Tại commit A2 ta bắt đầu tạo nhánh branchB: git checkout -b branchB
  • Tại nhánh branchB ta tạo commit B1
  • Quay lại nhánh master ta tạo commit A3A4
  • Quay lại nhánh branchB ta tạo commit B2
  • 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à masterbranchB
    • Nhiệm vụ là merge nhánh branchB vào nhánh master
    • 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 commit A4
    • Nhìn dưới dạng Git Graph như sau:

image.png

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ào master: 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

image.png

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ào branchB: git rebase master
  • Chuyển sang nhánh master: git checkout master
  • Merge nhánh branchB vào master: 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ối A4 của nhánh master
  • Sau khi rebase: A1 => A2 => A3 => A4 => B1 => B2

image.png

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ào master: git rebase branchB
  • Lúc này tất cả commit của branchB sẽ được nối tiếp vào master tại commit bắt đầu rẽ nhánh là A2
  • Sau khi rebase: A1 => A2 => B1 => B2 => A3 => A4

image.png

5. Git cherry-pick

  • Có một cách nữa khá thủ công để merge code vào nhánh master là dùng git 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à B1B2
  • CommitId ở dạng rút gọn lần lượt là 38dc36c45dfa5082
  • 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 B1B2 áp dụng vào master: git cherry-pick 38dc36c4 5dfa5082
  • Lúc này 2 commit B1B2 sẽ được nối tiếp vào sau commit cuối A4
  • Sau khi rebase: A1 => A2 => A3 => A4 => B1 => B2

image.png

6. Kết luận

  • Git merge sẽ chuyển toàn bộ commit ở branchB vào master, 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ào master, 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ào master, không tạo ra commit merged, các commit được nối tiếp vào nhánh master

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ũng Enter tiếp
  • OK xong thì trong folder C:\Users\TrungNT\.ssh sẽ có 2 file id_rsa_cong_ty_viettel.pubid_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

Viblo
Let's register a Viblo Account to get more interesting posts.