Git - Kĩ thuật chia branch, "Branch early, branch often"

Note: This post is over 10 years old. The information may be outdated.

Đây là một bài mình viết trên blog CodeDaily, nói về kĩ thuật chia branch, branch workflow.

Có một câu nói mà các developer khi làm việc trên Git phải thuộc nằm lòng, đó là:

Branch early, branch often

Ý nghĩa của câu nói trên tức là bạn cần phải tạo cho mình thói quen sử dụng branch, khi làm bất kì việc gì (một task mới, một feature mới,…) thì việc đầu tiên luôn là: Tạo một branch mới.

Vì sao phải tạo branch? Tui làm trên branch master không được hả?

Ờ thì chả ai cấm bạn làm trực tiếp trên master branch, nhưng việc này tiềm ẩn nhiều nguy cơ khó lường. Ví dụ như: Khi bạn đang hì hục làm 1 chức năng nào đó, bất ngờ KH gọi và bảo có 1 bug nghiêm trọng cần phải fix gấp, bạn sẽ làm gì? Dùng stash để đẩy hết code đang làm sang một bộ nhớ tạm thời, hoặc backup code đang làm rồi revert toàn bộ để ưu tiên fix bug cho KH trước?

Những cách này tất nhiên giải quyết được vấn đề, nhưng không hay cho lắm, và tất nhiên sẽ luôn gây ra một số rắc rối nhất định.

Để tránh những trường hợp như trên, chúng ta nên tập thói quen tạo branch. Để hiểu rõ hơn về cách làm việc với branch, hãy xem qua cách giải quyết vấn đề được nêu ra ở ví dụ trên:

Bắt đầu ngày làm việc, bạn chọn làm một chức năng mới. Việc đầu tiên cần làm là tạo một branch mới bằng câu lệnh git checkout với tham số -b

Bắt đầu ngày làm việc, bạn chọn làm một chức năng mới. Việc đầu tiên cần làm là tạo một branch mới bằng câu lệnh git checkout với tham số -b

Trong quá trình làm việc, bạn nên commit code khi hoàn thành một số chức năng nhất định. Nhưng chưa cần vội push.

Sẽ có những lúc đang làm cắm cúi và anh KH từ đâu lao đến ném cho một đống việc thế này.

Và tất nhiên bạn không thể nào từ chối dược, đành quay sang fix trước cho lão ấy. Khi đó, chỉ cần chuyển về branch master (lưu ý phải commit hết code lên branch đang làm trước khi chuyển branch) bằng câu lệnh checkout

Mục đích của việc chuyển về branch master là để khi làm chức năng mới, sẽ không dính dáng gì đến các chức năng đang làm dở. Và bạn cũng nên pull thường xuyên để lấy code mới nhất về trước khi bắt đầu thực hiện chức năng mới. Từ master, bạn tạo ra một branch mới:

Sau khi đã hoàn thành công việc, bạn hãy commit lên branch đó:

Sau đó chuyển về master và dùng lệnh git merge để nhập các thay đổi từ branch vừa xong vào master.

Lúc này, bạn có thể push code lên và thông báo với lão KH rằng mình đã fix xong các yêu cầu của lão. Sau đó quay trở về branch mà bạn đang làm dở công việc trước đó.

Tiếp tục code, đến khi hoàn thành thì commit lên.

Và quay về master, dùng lệnh git merge để nhập các chức năng vừa làm xong vào master. Và cuối cùng là push code. Vậy là công việc của bạn đã hoàn thành :D

Mặc dù sử dụng branch có vẻ tốn rất nhiều thao tác, nhưng đây là một việc hết sức cần thiết. Để tiện lợi hơn, thay vì gõ lệnh bằng tay, bạn có thể sử dụng một số công cụ như SourceTree, rất trực quan và rất mạnh.

Để kết thúc bài viết, các bạn hãy làm một bài tập nho nhỏ: Nhìn vào cây branch dưới đây và hình dung lại những thao tác đã làm trong bài ví dụ trên, tương ứng với với mỗi một node.

GitGit