Nội dung chính
- Tổng quan về Git
- Git branch là gì?
- Phân loại Git Branch
- Các thao tác cơ bản về Git Branch
- Các thao tác làm việc với nhiều Git Branch
- Thao tác đồng bộ Git Branch giữa local và remote repository
- Cách làm việc hiệu quả với Git Branch
- Các lỗi thường mắc phải khi làm việc với Git Branch
- Các câu hỏi thường gặp về Git Branch
- Tổng kết Git Branch
Git Branch là một thành phần quan trọng trong Git, nó được xem là một trợ thủ đắc lực cho lập trình viên. Branching giúp phát triển tính năng mới mà không làm ảnh hưởng đến phiên bản chính, đồng thời tăng khả năng cộng tác giữa các thành viên.
Đọc bài viết này để hiểu rõ hơn về:
- Git Branch là gì?
- Phân loại Git Branch
- Các thao tác đối với Git Branch
- Cách làm việc với Branch và các lỗi hay gặp
Tổng quan về Git
Git là một hệ thống quản lý phiên bản phân tán (Distributed Version Control System – DVCS) mạnh mẽ, được ra đời vào năm 2005 bởi Linus Torvalds. Ban đầu, Git xây dựng với mục đích dành cho việc phát triển nhân Linux, cho đến hiện nay, Git trở thành một trong các phần mềm quản lý mã nguồn phổ biến nhất.
Điểm nổi bật của Git là khả năng quản lý các phiên bản trong mã nguồn dựa vào các bản chụp nhanh (snapshot) thay đổi của tập tin, thay vì lưu trữ lại sự khác biệt như các hệ thống khác. Git cung cấp các tính năng để theo dõi lịch sử thay đổi của mã nguồn, phân tách và hợp nhất các nhánh phát triển và quản lý việc lưu trữ mã nguồn.
Đọc thêm các bài viết tổng quan về Git:
- Git là gì: Định nghĩa, Thuật ngữ cơ bản và Cách cài đặt
- Git vs GitHub: Các điểm khác nhau và Cách kết hợp
- Tổng hợp 20+ các lệnh Git cơ bản cần biết
Git branch là gì?
Git branch là gì?
Git Branch là tính năng nổi bật của Git, nó giúp phân tách các luồng phát triển mã nguồn. Trong git, mỗi branch (nhánh) là một phiên bản riêng biệt của mã nguồn. Một branch bao gồm tập hợp các commit được kế thừa từ branch cha, và các commit mới của riêng branch hiện tại.
Tại sao Branch lại có vai trò quan trọng trong Git?
Hãy giả sử, bạn đang làm việc trong một dự án lớn và cần phát triển các tính năng mới.
Trường hợp không dùng Git:
- Sao chép các tập tin cần chỉnh sửa để tránh ảnh hưởng đến phiên bản hiện tại
- Xây dựng tính năng mới trên tập tin đã sao chép
- Bạn phát hiện có một số tập tin các cũng cần phải chỉnh sửa, bạn lại tiếp tục lặp lại bước 1 và 2
- KHẨN CẤP! Có lỗi xảy ra trên môi trường production mà bạn cần phải xử lý (mặc dù nó không liên quan đến tính năng mới đang phát triển)
- Sao lưu các tập tin đang làm thành một tên khác hoặc lưu ở một vị trí khác
- Bạn chuyển qua xử lý lỗi và cập nhật mã nguồn
- Bạn quay trở lại cái tập tin đã sao lưu trước đó để tiếp tục công việc đang dang dở
- Sau khi hoàn thành tính năng mới bạn đưa tập tin vào mã nguồn
- Sau đó bạn phát hiện ra phần mã của tính năng mới đã không bao gồm phần xử lý lỗi Khẩn Cấp trước đó
Trường hợp có sử dụng Git branch:
- Tách một nhánh mới với tên new-feature để phát triển tính năng mới
- Xây dựng các tính năng mới
- KHẨN CẤP! Có lỗi xảy ra trên môi trường production mà bạn cần phải xử lý (mặc dù nó không liên quan đến tính năng mới đang phát triển)
- Chuyển sang nhánh Gốc và tách một nhánh mới với tên hotfix-small-bug
- Xử lý lỗi và hợp nhất mã vào nhánh Gốc
- Quay trở lại nhánh new-feature và tiếp tục phát triển tính năng
- Hợp nhất tính năng mới vào nhánh Gốc, lúc này sẽ được nếu có sự xung đột mã của hotfix-small-bug sẽ được cảnh báo, còn không chúng sẽ được hợp nhất với nhau
Qua ví dụ trên ta thấy được, dựa vào việc sử dụng Branch, bạn có thể phát triển tính năng mới một cách độc lập nhưng khi hợp nhất vào nhánh Gốc, vẫn đảm bảo mã nguồn không bị thiếu sót.
Dựa vào khả năng đó, Git branch đã cung cấp rất nhiều công dụng hữu ích bao gồm:
- Phát triển tính năng độc lập: Khả năng phân tách nhánh giúp lập trình viên có thể phát triển các tính năng mới mà không làm ảnh hưởng đến hoạt động của nhánh chính
- Tạo bản vá lỗi nhanh chóng: Khi có sự cố xảy ra, bạn có thể khắc phục lỗi trên một nhánh riêng và hợp nhất nó vào nhánh Gốc, trong khi nhánh Gốc vẫn hoạt động ổn định
- Tăng khả năng cộng tác: Khả năng hợp nhất nhánh giúp các lập trình viên trong một nhóm có thể kết hợp mã mới của nhau một cách nhanh chóng với tỉ lệ rủi ro mất dữ liệu thấp.
Phân loại Git Branch
Branch có thể được phân loại theo hai tiêu chí sau: Theo chức năng và Theo vòng đời.
Phân loại Git Branch theo chức năng
Trong quá trình phát triển và duy trì phần mềm, chúng ta có thể sẽ cần sử dụng đến nhiều loại branch khác nhau tùy theo mục đích sử dụng.
Loại branch | Mục đích sử dụng |
Develop | Nhánh tập trung hợp nhất các tính năng mới để chuẩn bị đưa vào nhánh chính |
Feature | Nhánh phát triển tính năng mới, được hợp nhất vào develop sau khi hoàn thành |
Release | Chuẩn bị cho một phiên bản phát hành mới và bổ sung các chỉnh sửa cuối cùng |
Main | Nhánh chứa mã nguồn đã được kiểm tra kỹ và hoạt động ổn định, sẵn sàng để đưa vào sử dụng thực tế |
Hotfix | Khắc phục các lỗi khẩn cấp ở phiên bản phát hành |
Phân loại Git Branch theo vòng đời
Trong một mã nguồn sử dụng Git, chúng ta sẽ bắt gặp hai dạng nhánh với vòng đời tồn tại khác nhau bao gồm:
- Long-Running Branches: Đây là các nhánh tồn tại xuyên suốt quá trình phát triển mã nguồn và được duy trì ổn định. Hai nhánh phổ biến thuộc loại này là nhánh Main và nhánh Develop.
- Short-Lived Branches: Là những nhánh phục vụ một tác vụ cụ thể, thường được tạo ra trong quá trình phát triển mã nguồn và tồn tại trong một thời gian ngắn. Các nhánh này thường sẽ được hợp nhất vào các nhánh Long-Running Branches sau khi hoàn tất công việc, và sau đó sẽ được xóa bỏ.
Các thao tác cơ bản về Git Branch
Tạo git branch mới
Cú pháp tạo branch mới:
git branch <tên branch mới>
Ngoài ra để vừa tạo một branch mới và chuyển ngay sang nhánh vừa tạo, bạn có thể sử dụng câu lệnh:
git checkout -b <tên branch mới>
Hoặc
git switch -c <tên branch mới>
Git checkout là một lệnh đa năng dùng để thực hiện nhiều tác vụ, điều này dẫn đến sự phức tạp cho câu lệnh này.
Chính vì vậy, git switch được bổ sung kể từ phiên bản 2.23, giúp tách biệt chức năng chuyển đổi và tạo nhánh thay cho git checkout.
Tuy nhiên, chúng ta vẫn có thể sử dụng được cả 2 lệnh.
Xóa git branch
Cú pháp xóa branch:
git branch -d <tên branch>
Nếu branch chưa được hợp nhất vào branch khác, bạn cần sử dụng -D:
git branch -D <tên branch>
Đổi tên git branch hiện tại
Cú pháp đổi tên branch hiện tại:
git branch -m <tên mới>
Kiểm tra danh sách git branch đang có
Cú pháp kiểm tra danh sách branch đang có:
git branch <-a | -r>
Trong đó, -a để hiển thị tất cả các branch (ở cục bộ và kho từ xa), -r để hiển thị các branch trên kho lưu trữ từ xa, nếu không có tùy chọn đi kèm, git branch sẽ hiển thị các branch ở cục bộ.
Các thao tác làm việc với nhiều Git Branch
Trong quá trình phát triển tính năng, sẽ có nhiều nhánh được sử dụng, dưới đây là một số câu lệnh để bạn thao tác giữa các branch.
Chuyển đổi trạng thái làm việc
git checkout <tên nhánh>
Hoặc
git switch <tên nhánh>
So sánh sự khác nhau giữa hai nhánh
git diff <nhánh 1> <nhánh 2>
Lệnh này so sánh nội dung của các commit cuối cùng trên cả hai nhánh và hiển thị các thay đổi theo định dạng dòng lệnh.
So sánh số commit của hai nhánh
Xem các commits được thêm vào nhánh 1 mà chưa có ở nhánh 2:
git log <nhánh 1> ^<nhánh 2>
Hoặc ngược lại để xem commit có ở nhánh 2:
git log <nhánh 2> ^<nhánh 1>
Hợp nhất nội dung giữa hai nhánh
Để hợp nhất nội dung thay đổi giữa hai nhánh, chúng ta có thể sử dụng Git rebase hoặc Git merge. Giữa 2 lệnh này có những điểm khác nhau như sau:
Tiêu chí | Git merge | Git rebase |
Cú pháp | git merge <tên nhánh> | git rebase <tên nhánh> |
Công dụng | Hợp nhất thay đổi giữa nhánh này sang nhánh khác | |
Nguyên lý | Giữ nguyên lịch sử commit, tạo ra một commit merge chứa nội dung hợp nhất của nhánh | Lấy commit từ nhánh được merge chèn lên đầu trong danh sách commit của nhánh hiện tại và không tạo ra commit merge |
Ưu điểm | 1. Hạn chế bị xung đột mã khi hợp nhất
2. An toàn khi làm việc với nhiều nhánh |
1. Tạo ra lịch sử commit thẳng, dễ truy xuất nguồn gốc
2. Giảm thiểu commit dư thừa vì không tạo ra commit merge |
Nhược điểm | 1. Khó quản lý lịch sử commit khi mã nguồn có nhiều nhánh
2. Tạo ra nhiều commit merge không cần thiết khi hợp nhất nhiều lần trên cùng một nhánh |
1. Dễ dẫn đến xung đột mã khi hợp nhất
2. Khó sử dụng cho người mới |
Thao tác đồng bộ Git Branch giữa local và remote repository
Khi tạo mới một nhánh ở cục bộ và bạn muốn cập nhật nó lên kho lưu trữ từ xa để các thành viên khác sử dụng, bạn có thể dùng lệnh:
git push -u origin <nhánh mới>
Trong đó, -u (upsteam) sẽ thiết lập nhánh hiện tại theo dõi nhánh tương ứng trên kho lưu trữ từ xa. Những lần thực hiện git push sau đó, bạn không cần phải chỉ định tên nhánh.
Cách làm việc hiệu quả với Git Branch
Git Branch là một tính năng mạnh mẽ của Git, tuy nhiên bạn cần có kỹ năng sử dụng Git Branch một cách tối ưu để tận dụng tốt các khả năng của Git Branch, cũng như tránh những ảnh hưởng tiêu cực.
Dưới đây là một số điểm cần lưu ý:
- Sử dụng chiến lược Branching phù hợp: Việc lựa chọn một WorkFlow để quản lý, phân nhánh phù hợp trong quá trình phát triển dự án giúp hoạt động của nhóm được nhất quán và dễ dàng quản lý các giai đoạn phát triển.
- Tạo nhánh mới khi phát triển tính năng hoặc xử lý tác vụ: Khi thực hiện một tính năng mới hoặc sửa chữa lỗi, bạn cần tách riêng thành các nhánh Short-lived để tránh ảnh hưởng đến nhánh gốc và giúp tập trung vào từng thay đổi cụ thể trên những nhánh đó.
- Thường xuyên cập nhật nhánh: Khi làm việc với các kho lưu trữ từ xa, có nhiều người cộng tác, các nhánh chính sẽ thường xuyên được hợp nhất mã mới. Vì vậy trong quá trình phát triển, bạn nên thường xuyên cập nhật nhánh cục bộ để tránh tình trạng xung đột mã
- Xóa các nhánh không cần thiết: Việc loại bỏ các nhánh Short-lived sau khi hợp nhất giúp dễ kiểm soát các nhánh hiện tại, tránh tình trạng rối rắm.
Các lỗi thường mắc phải khi làm việc với Git Branch
- Không cập nhật nhánh chính trước khi tách nhánh: Điều này dẫn đến nhánh được tách không được kế thừa các commit mới từ nhánh gốc, có thể dẫn đến xung đột khi hợp nhất. Để giải quyết điều này, bạn có thể sử dụng git merge với nhánh gốc (đã cập nhật) để cập nhật commit mới.
- Quên chuyển nhánh khi bắt đầu một công việc mới: Điều này có thể dẫn đến các commit thay đổi trực tiếp ngay trên nhánh chính, làm ảnh hưởng đến nhánh chính.
- Không kiểm tra và xử lý xung đột trước khi hợp nhất: Việc tiến hành hợp nhất mà không kiểm tra trước các xung đột có thể xảy ra, dẫn đến khi có xung đột, mã trở nên phức tạp và khó giải quyết. Để khắc phụ vấn đề này, bạn nên sử dụng git pull, git merge hoặc git rebase từ nhánh cha sang nhánh con trước khi muốn hợp nhất code từ nhánh con.
- Không xóa nhánh sau khi hợp nhất: Điều này dẫn đến tập hợp nhánh trong repository trở nên lộn xộn và khó quản lý.
Các câu hỏi thường gặp về Git Branch
Làm sao để tạo branch mới trên remote repository?
Để tạo một branch mới từ local lên remote repository bạn có thể thực hiện theo các bước sau:
git checkout -b <nhánh mới> # Tách nhánh mới git push -u origin <nhánh mới> # Đẩy nhánh mới lên remote repository
Vai trò của branch trong làm việc nhóm?
Branch đóng vai trò vô cùng quan trọng trong Git và quá trình làm việc nhóm của một dự án sử dụng Git. Các vai trò nổi bật của Branch phải kể đến là:
- Phân chia công việc cụ thể: Mỗi thành viên có thể làm việc trên các nhánh khác nhau một cách độc lập mà không ảnh hưởng đến mã nguồn chính.
- Giảm thiểu xung đột: Trong quá trình hợp nhất nhánh, nếu nhánh luôn được cập nhật trước đó sẽ giúp giảm thiểu các xung đột có thể xảy ra.
- Quản lý tính năng và bản phát hành hiệu quả: Với việc phân chia nhánh với nhiệm vụ rõ ràng, các nhóm phát triển có thể quản lý các bản phát hành tương ứng với các nhánh và có thể chuyển đổi giữa các phiên bản dễ dàng.
Khi nào nên dùng release branch?
Release branch nên được sử dụng khi bạn chuẩn bị phát hành một phiên bản sản phẩm mới và cần hoàn thiện các chi tiết cuối cùng. Nhánh release thường được hợp nhất vào nhánh Main và nhánh Develop sau khi hoàn tất.
Khi nào cần tạo một branch mới?
Bạn nên tạo một nhánh mới khi:
- Bắt đầu phát triển một tính năng mới: Mỗi tính năng nên có một nhánh riêng (feature branch) để quản lý độc lập và tránh ảnh hưởng đến nhánh chính.
- Tạo bản vá/sửa lỗi: Khi có một lỗi cần khắc phục gấp trên nhánh chính, bạn nên tạo một nhánh HotFix để sửa lỗi mà không ảnh hưởng đến các nhánh khác.
- Chuẩn bị cho bản phát hành: Tạo nhánh Release khi cần kiểm thử và chuẩn bị cho một phiên bản mới, giúp hoàn thiện các chi tiết cuối cùng.
- Thử nghiệm các ý tưởng: Khi bạn cần thử nghiệm một ý tưởng với sự thay đổi mã nguồn lớn, hoặc chưa cần đưa vào sử dụng, hãy tạo một nhánh riêng để dễ quản lý và không làm ảnh hưởng đến luồng phát triển chính.
Tổng kết Git Branch
Git branch là một tính năng nổi trội của Git mà bạn nên nắm vững và vận dụng tốt. Điều này sẽ giúp công việc phát triển mã nguồn của nhóm trở nên thuận lợi và hoạt động mượt mà hơn.
Thông qua bài viết này, ITviec hi vọng đã cung cấp được cho bạn những kiến thức bổ ích về việc sử dụng Git Branch trong Git, từ đó làm cơ sở để bạn có thể chinh phục các tính năng nâng cao và mạnh mẽ khác trong Git.