Cherry Pick trong Git

Cherry-pick trong git là việc ta chọn các commits từ một nhánh (branch) và đưa các commits đó vào một branch khác.

Cherry-pick chủ yếu được sử dụng khi ta không muốn merge toàn bộ thay đổi của một branch, mà chỉ muốn lấy một phần thay đổi để áp dụng vào một branch khác.

Câu lệnh để thực hiện cherry-pick như sau:

git cherry-pick <commit-hash>
  • commit-hash: là một chuỗi ký tự được Git tạo ra để đánh dấu một commit.

Lưu ý: Khi thực hiện cherry-pick chúng ta cần chắc chắn mình đang ở trên branch (nhánh) cần chuyển các commits đến.

Để cherry-pick nhiều commits một lúc

  • Cherry-pick nhiều commits
git cherry-pick commit_hash_1 commit_hash_5 commit_hash_8
  • Cherry-pick nhiều commits liền nhau
git cherry-pick commit_hash_1..commit_hash_3

Câu lệnh trên khi thực hiện sẽ lấy ra 2 commits liền nhau là commit thứ 2 và thứ 3. Nếu muốn lấy cả commit thứ 1 thì ta dùng câu lệnh sau:

git cherry-pick commit-hash_1^..commit_hash_3

Ví dụ sử dụng cherry-pick

Đầu tiên ta sẽ khởi tạo một dự án với git bằng câu lệnh git init trong thư mục sample

mkdir sample
cd sample
git init

Khởi tạo git thành công ta sẽ nhận được thông báo sau:

Initialized empty Git repository in /sample/.git/

Ta tạo một file là main.txt bằng câu lệnh

vi main.txt

Sau khi tạo được main.txt ta thực hiện thêm file vừa tạo này vào commit và thực hiện commit đầu tiên.

git add .
git commit -m "first commit"

Kết quả sau khi commit

[main (root-commit) e9c8fed] first commit
 1 file changed, 1 insertion(+)
 create mode 100644 main.txt

Ta dùng câu lệnh sau để xem các commit đã thực hiện

git log --oneline
e9c8fed (HEAD -> main) first commit

Giả sử bây giờ chúng ta sẽ nhận được yêu cầu làm 2 tính năng trong dự án này và mỗi tính năng sẽ được thực hiện độc lập bởi 2 nhóm. Chúng ta sẽ thực hiện tách 2 branch là branch_1 tương ứng với tính năng 1, branch_2 tương ứng với tính năng 2.

git branch branch_1
git branch branch_2
git 

Ta sử dụng câu lệnh git branch để xem tất cả các branch đang có trên máy tính của ta hiện tại.

  branch_1
  branch_2
* main

Sau khi được bàn giao nhiệm vụ cả 2 nhóm thực hiện công việc và lần lượt đẩy các commit trên mỗi branch lên như sau.

branch_1

902a965 (HEAD -> branch_1) Feature 1 step 2
c4111de Feature 1 step 1
e9c8fed (main) first commit

branch_2

46af7ee (HEAD -> branch_2) Feature 2 step 1
e9c8fed (main) first commit

Sau một thời gian phát triển như trên tính năng 1 đã làm đến bước thứ 2 và tính năng 2 đang làm ở bước thứ 1. Để kiểm tra tiến độ khách hàng cần chúng ta gửi toàn bộ kết quả đã thực hiện được tính đến thời điểm hiện tại. Và nếu 1 trong 2 tính năng mà đảm bảo được yêu cầu thì sẽ có thể publish cho người dùng.

Để khách hàng có thể kiểm tra tiến độ của dự án thì ta cần tạo thêm một branch mà ta đặt tên là review được tách trực tiếp từ branch main (branch chính của dự án). Branch này sẽ chứa nội dung của cả 2 branch: branch_1 branch_2.

git checkout main
git branch review
git checkout review
git branch
  branch_1
  branch_2
  main
* review

Tiếp theo ta thực hiện merge cả 2 branch tính năng vào branch review.

git merge branch_1
Updating e9c8fed..902a965
Fast-forward
 feature_1_step1.txt | 0
 feature_1_step2.txt | 0
 2 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 feature_1_step1.txt
 create mode 100644 feature_1_step2.txt
git merge branch_2
 feature_2_step_1.txt | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 feature_2_step_1.txt

Lúc này trên branch review đã chứa đầy đủ nội dung của cả 2 branch_1 và branch_2.

Sau khi xem nội dụng từ branch review khách hàng thấy rằng tính năng 1 trên branch_1 đã có thể được publish tới người dùng và khách hàng muốn chuyển nội dung của branch_1 tại thời điểm mà khách hàng review vào branch main để publish.

Lúc này ta sẽ cần sử dụng cherry-pick để lấy các commit trong branch review để lấy các nội dụng của branch_1 mà đã được khách hàng xem và yêu cầu publish.

Trong branch review ta sẽ thực hiện câu lệnh lấy log các commit để tìm được commit của branch_1.

git checkout review
git log --oneline
2319cca (HEAD -> review) Merge branch 'branch_2' into review
46af7ee (branch_2) Feature 2 step 1
902a965 Feature 2 step 1
c4111de Feature 1 step 1
e9c8fed (main) first commit

Như log trên ta sẽ lấy commit c4111de Feature 1 step 1902a965 Feature 2 step 1 đặt vào trong branch main.

git cherry-pick c4111de 902a965

Kết quả sau khi cherry-pick thì branch main của ta sẽ như sau:

927ee99 (HEAD -> main) Feature 1 step 2
82b3623 Feature 1 step 1
e9c8fed first commit

Leave a Reply

Your email address will not be published. Required fields are marked *