Làm web (14) - Git: quản lý nhánh

Bài học trước: Làm web (13) - Git: tích hợp căn bản
-----

3.8.5     Quản lý nhánh


Tới thời điểm này, bạn đã biết tạo, trộn, và xóa nhánh. Phần này sẽ tìm hiểu thêm một số công cụ giúp bạn làm việc với nhánh dễ dàng hơn.

Để xem các nhánh hiện có, sử dụng lệnh $ git branch.

Ví dụ,

$ git branch
  hotfix
  iss123
* master
  phienban1
  testing

Để ý, dấu (*) phía trước chữ master cho biết nhánh hiện tại bạn đang đứng là master (con trỏ HEAD đang trỏ tới nhánh master). Như vậy, nếu bây giờ bạn thực hiện commit thì nhánh master sẽ di chuyển lên phía trước.

Để xem lệnh commit mới nhất trên mỗi nhánh, sử dụng lệnh $ git branch -v.

Ví dụ,

$ git branch -v
  hotfix    e90d0e6 them noi dung tren hotfix
  iss123    a8ac313 them noi dung tren iss123
* master    e71b39c [ahead 9] tich hop iss123 vao master
  phienban1 a89362e Update testdesktop.txt
  testing   cd69866 test chuyen nhanh

Để xem trong các nhánh trên, nhánh nào đã tích hợp vào nhánh hiện tại (master), sử dụng lệnh $ git branch --merged.

Ví dụ,

$ git branch --merged
  hotfix
  iss123
* master
  phienban1

Để ý, các nhánh mà không có dấu (*) phía trước là đã được tích hợp. Do đã được tích hợp vào nhánh khác rồi, nên bạn hoàn toàn có thế xóa các nhánh này đi (dùng lệnh $ git branch -d <tên nhánh>) mà không làm mất dữ liệu.

Để xem trong các nhánh trên, nhánh nào chưa tích hợp vào nhánh hiện tại (master), sử dụng lệnh git branch --no-merged.

Ví dụ,

$ git branch --no-merged
  testing

Vì chưa được tính hợp vào nhánh hiện tại, nên nếu bạn sử dụng lệnh $ git branch -d để xóa, Git sẽ báo lỗi và không cho xóa. Lý do Git không cho xóa vì sợ bạn sẽ làm mất hết các thay đổi vì nó chưa được tích hợp vào nhánh khác.

$ git branch -d testing
error: The branch 'testing' is not fully merged.
If you are sure you want to delete it, run 'git branch -D testing'.

Tuy nhiên, nếu bạn vẫn muốn xóa nhánh chưa được tích hợp thì dùng lệnh $ git branch -D <tên nhánh>

Ở các ví dụ trên, bạn thực hiện kiểm tra nhánh đã được tích hợp và chưa được tính hợp vào nhánh hiện tại (là nhánh đã được checkout). Tuy nhiên, bạn vẫn có thể đứng ở nhánh này để kiểm tra cho nhánh khác.

Ví dụ, bạn đang đứng ở nhánh testing, nhưng lại muốn kiếm tra các nhánh nào đã được tích hợp vào nhánh master thì dùng lệnh sau:

Maxsys@DESKTOP-7LPDOL6 MINGW64 /e/langbiang (testing)
$ git branch --merged master
  hotfix
  iss123
  master
  phienban1

Hoặc, bạn đang đứng ở nhánh testing, nhưng lại muốn kiếm tra các nhánh nào chưa được tích hợp vào nhánh master thì dùng lệnh sau:

$ git branch --no-merged master
* testing

Đọc thêm tiếng Việt:


Đọc thêm tiếng Anh:

3.8.6     Quy trình làm việc với phân nhánh


Bạn đã biết phân nhánh và gộp nhánh, tuy nhiên bạn chưa biết cách áp dụng chúng trong khi làm dự án. Phần này sẽ đề cập tới một số quy trình làm việc (workflow) phổ biến có áp dụng phân nhánh, để bạn có thể áp dụng chúng một cách hợp lý, hiệu quả vào công việc.

Nhờ tính chất linh hoạt trong việc tạo, hủy và trộn nhánh nên lập trình viên có thể thực hiện các thao tác này thường xuyên mà không mất nhiều thời gian.

Đọc thêm tiếng Việt:


Đọc thêm tiếng Anh:


Xem thêm clip:

Chiến lược phân nhánh và tạo nhánh (tiếng Anh):


Áp dụng phân nhánh trong Agile/Scrum (tiếng Anh):


Trước hết cần tìm hiểu về hai loại nhánh quan trọng là nhánh dài hạn và nhánh ngắn hạn.

Nhánh dài hạn

Nhánh dài hạn (hay còn gọi là nhánh chính, long-running branches) là nhánh luôn mở, tồn tại xuyên suốt trong quá trình phát triển dự án.

Ví dụ một số nhánh dài hạn:

– master: là nhánh chứa mã nguồn đã chạy hoàn toàn ổn định, đây là mã nguồn đã phát hành (release), hoặc chuẩn bị phát hành.

– dev (hoặc develop hoặc next hoặc test): là nhánh chạy song song với nhánh master, dùng để làm việc hoặc sử dụng để kiểm tra sự ổn định của mã nguồn. Khi mã nguồn tại nhánh dev đạt tới sự ổn định sẽ được tích hợp vào nhánh master. Tương tự như vậy, khi mã nguồn tại các nhánh ngắn hạn, sau khi đã được kiểm tra và không còn lỗi sẽ được tích hợp vào nhánh dev.

Trong quá trình phát triển dự án, các nhánh có độ ổn định cao sẽ nằm ở cuối trong lịch sử commit, các nhánh có độ ổn định thấp hơn sẽ nằm ở trên đầu.

Xem hình minh họa,



Để dễ hình dung, cứ tưởng tượng mỗi nhánh là một băng truyền, các băng truyền có liên thông với nhau, mỗi băng truyền sẽ yêu cầu mã nguồn có mức độ ổn định khác nhau. Mã nguồn có mức độ ổ định cao hơn sẽ được di chuyển (tích hợp) qua băng truyền có độ ổn định cao hơn.

Xem hình minh họa,



Nhánh ngắn hạn

Nhánh ngắn hạn (hay còn gọi là nhánh chủ đề, topic branches, short-lived branch) là các nhánh được tạo ra để thực hiện một công việc cụ thể, ví dụ: phát triển một chức năng (feature), sửa lỗi (hotfix), tạo phiên bản mới cho sản phẩm (release). Nhánh ngắn hạn chỉ tồn tại trong thời gian ngắn và sẽ bị xóa đi.

Quan sát một tình huống sử dụng nhánh ngắn hạn: ví dụ bạn đang làm việc trên nhánh master, bạn muốn thực hiện một chức năng mới (iss91), đang đứng tại nhánh master, bạn sẽ tạo một nhánh ngắn hạn có tên iss91, làm việc trên nhánh iss91 được một lúc, từ nhánh iss91 bạn tạo thêm nhánh iss91v2 để thực hiện công việc theo một hướng khác, thực hiện một vài commit trên nhánh iss91v2, sau đó quay trở lại nhánh master làm việc và thực hiện một số commit trên nhánh master, tiếp theo, trên nhánh master bạn tạo một nhánh mới để thử một ý tưởng mới (tên là dumbidea), thực hiện một số commit trên nhánh dumbidea.

Xem hình minh họa (Hình 386a),



Sau một thời gian làm việc, bạn quyết định giữ lại cách giải quyết theo nhánh iss91v2. Khi trình bày ý tưởng trên nhánh dumbidea, các đồng nghiệp đánh giá rất cao và cũng muốn tích hợp vào dự án. Vậy là bạn sẽ thực hiện trộn hai nhánh iss91v2 và dumbidea vào nhánh master (bỏ qua nhánh iss91 với hai commit C5 và C6).

Hình sau thể hiện lịch sử của dự án sau khi trộn iss91v2 và dumbidea vào master. (Hình 386b)



Lưu ý: tất cả các thao tác tạo và trộn nhánh bạn đã thực hiện đều xảy ra trên máy cục bộ, chưa thực hiện bất kì thao tác nào với máy chủ ở xa.

Lab 31. Thực hiện tạo và trộn nhánh.

– Tạo một local repo, tạo các nhánh master, iss91, issu91v2, dumbidea, và thực hiện các commit (nội dung message của mỗi commit sẽ là C0, C1, C2…v.v) giống như hình 386a.

– Trộn hai nhánh iss91v2 và dumbidea vào nhánh master, giống như hình 386b.


– Dùng lệnh $ git log để kiểm tra kết quả của mỗi bước
-----------
Cập nhật [14/10/2019]
-----------
Xem thêm: Tổng hợp các bài viết về Làm web
Xem thêm: Làm web (15) - Git: