Nhân ngày cuối năm, mình sẽ gửi tới các bạn bài viết về cách sử dụng git cherry-pick một cách hiệu quả nhất khi làm việc với git, git cherry-pick là một lệnh cực kì hữu ích mà bất kì một Engineer nào cũng nên biết và sử dụng thành thạo để công việc luôn luôn suôn sẻ cũng như dễ thở hơn.

Thử hình dung bạn và đồng nghiệp đang cùng phát triển trên một branch master chung, cả hai đều tạo ra hai branch release riêng cho mỗi tính năng của mình, về lý thuyết thì điều này là hợp lý, và nó tuân theo một git-flow chung.

Nhưng giả sử bạn cần sử dụng một code base chung với đồng nghiệp, nhưng code thì lại ở trên nhánh feature riêng của họ, lúc này bài toán đặt ra là bạn cần phải lấy một vài commit code từ nhánh của đồng nghiệp và ghép vào nhánh của bạn để tiếp tục phát triển trên cái base chung đó.

Cùng nhau đi vào cách sử dụng git cherry-pick như sau, trước tiên ta lấy code từ branch master ra branch release/1.0.0

git checkout -b release/<name>L

Sau đó đẩy file_1.txt lên branch release/1.0.0 , mục đích làm điều này để demo cho việc đây là code base chung như mình đã nói ở bên trên.

add file_1.txt

Sau đó tiếp tục đẩy file_2.txt lên branch release/1.0.0 để demo cho việc bổ sung code mới ở branch release/1.0.0

add file_2.txt

Ta kiểm tra lại trên gitlab thì branch release/1.0.0 lúc này đã có hai commit chúng ta vừa thực hiện.

Lưu ý cái commit_id ở bên phải hình trên nhé, nó dùng để lấy lại code theo commit_id

Giờ checkout code từ branch master ra một branch release/1.0.1 mới, sau đó cherry-pick file_2.txt ở branch release/1.0.0 về, ta thực hiện như hình bên dưới:

cherry-pick commit file_2.txt về branch release/1.0.1
branch release/1.0.1 đã có code từ branch release/1.0.0

Lúc này chúng ta đã lấy được code từ branch release/1.0.0 và bỏ sang branch release/1.0.1, tiếp tục thực hiện tương tự với cái file_1.txt.

cherry-pick file_1.txt từ branch release/1.0.0 sang release/1.0.1
file_1.txt đã nằm trên branch release/1.0.1

Ở trên chúng ta đã cùng nhau thực hiện xong việc lấy code từ một branch và apply code đó vào một branch khác sử dụng cherry-pick, đó là một cách thực hiện đơn giản và rất dễ làm, tuy nhiên trong quá trình làm việc sẽ có những bài toán khó nhằn hơn và bạn phải linh hoạt trong việc sử dụng cherry-pick, ví dụ một số case:

  • Code bạn cần lấy nằm ở trên nhiều branch khác nhau, branch A bạn muốn lấy một số commit nhất đinh, branch B bạn lại muốn lấy một số commit khác, rồi tiếp tục branch C lại lấy thêm vài commit nữa
  • Code của đồng nghiệp đang nằm trên branch A, và bạn chẳng may sử dụng branch A để code tiếp cho tính năng của bạn, và sau rất nhiều lượt commit code loạn xị ngậu và rắc rối thì bạn cần đưa code của bạn ra một branch B để không vướng với code của đồng nghiệp nằm trên branch A

Lúc này mình ngoài việc sử dụng linh hoạt cherry-pick, revert thì mình suggest thêm các bạn sử dụng một command nữa để lấy code theo commit_id:

git checkout <commit_id> <đường dẫn file bạn cần lấy>

Lệnh này cực kì hữu ích trong việc lấy code từ bất kì branch nào vào branch của bạn, bất kể file đó đã tồn tại trên branch của bạn hay chưa, chỉ cần nó thuộc commit_id đó thì bạn đều có thể lấy được.

Một số bài viết liên quan: