Series Git CLI Thực chiến #4: Phân nhánh (Branching) – Thuật phân thân trong vũ trụ mã nguồn
Ở Bài 3, chúng ta đã đưa được mã nguồn lên kho chứa GitHub. Nhưng hãy tưởng tượng một viễn cảnh thực tế: Cả team Backend cùng cắm cúi code và tranh nhau git push thẳng lên nhánh main. Một người sửa logic kết nối Vitess, một người khác vô tình viết đè lên file cấu hình. Kết quả là mã nguồn xung đột (conflict) tan nát, hệ thống vỡ vụn, và những công cụ tự động hóa như Jenkins sẽ liên tục báo lỗi đỏ lòm.
Để nhánh main luôn trong trạng thái "sạch sẽ" và sẵn sàng deploy lên Production, Git cung cấp cho anh em một quyền năng tối thượng: Phân nhánh (Branching).
1. Bản chất của Phân nhánh là gì?
Hãy hình dung nhánh main là dòng thời gian thực tại, nơi mọi thứ đang hoạt động trơn tru. Khi anh em tạo ra một "nhánh" mới, anh em đang rẽ nhánh không gian, tạo ra một vũ trụ song song.
Trong cái vũ trụ song song đó, anh em có thể thoải mái đập đi xây lại, thử nghiệm các đoạn code điên rồ nhất mà không làm ảnh hưởng dù chỉ một dấu phẩy đến nhánh main đang chạy ở thực tại. Khi nào code chạy hoàn hảo, anh em mới dùng phép thuật gộp (Merge) để mang những thành tựu từ vũ trụ song song đó ráp ngược lại vào thực tại.
2. Thực chiến: Vòng đời của một tính năng (Feature Workflow)
Giả sử hệ thống xử lý giao dịch AFC tại Hasaki đang chạy rất ổn định trên nhánh main. Hôm nay, anh em được giao nhiệm vụ viết thêm một module Golang để chuẩn hóa dữ liệu địa chỉ đầu vào. Quy trình làm việc chuẩn xác bằng CLI sẽ diễn ra như sau:
Bước 1: Cập nhật thực tại
Trước khi tách nhánh, hãy chắc chắn nhánh main trên máy anh em đang là bản mới nhất:
git checkout main
git pull origin main
Bước 2: Phân thân (Tạo nhánh mới)
Tuyệt đối không code thẳng trên main. Hãy tạo ra một nhánh mới mang tên tính năng đó.
git checkout -b feature/normalize-address
Giải thích: Lệnh checkout -b là lệnh gộp thần thánh. Nó vừa tạo ra một nhánh mới có tên feature/normalize-address, vừa lập tức "nhảy" (switch) không gian làm việc của anh em sang nhánh đó luôn. (Lưu ý: Ở các bản Git đời mới, anh em có thể dùng lệnh git switch -c feature/normalize-address với chức năng y hệt nhưng cú pháp rành mạch hơn).
Để kiểm tra xem mình đang đứng ở vũ trụ nào, hãy gõ:
git branch
Nhánh nào có dấu * màu xanh đứng trước thì anh em đang ở nhánh đó.
Bước 3: Code và Đóng gói
Bây giờ, anh em thoải mái viết các hàm xử lý chuỗi JSON, test thoải mái. Khi hoàn thiện, thực hiện chu trình đóng gói quen thuộc:
git add .
git commit -m "feat: bổ sung logic chuẩn hóa địa chỉ"
Bước 4: Đẩy nhánh lên Remote
Lúc này, nhánh feature/normalize-address mới chỉ tồn tại trên máy tính của anh em. Để sếp và đồng nghiệp có thể xem được đoạn code Golang đó trên GitHub, anh em phải đẩy cả cái nhánh này lên mây:
git push -u origin feature/normalize-address
3. Hợp nhất các vũ trụ (Git Merge)
Sau khi đẩy code lên GitHub, quy trình chuẩn của các công ty là anh em sẽ tạo một Pull Request (PR) trên giao diện web để Leader vào review code. Nếu mọi thứ xanh mượt, code của anh em sẽ được gộp vào main.
Tuy nhiên, nếu anh em cần tự tay gộp nhánh ngay trên Terminal cục bộ của mình, quy trình sẽ là:
Đầu tiên, phải nhảy về lại nhánh gốc (nơi tiếp nhận code):
git checkout main
Sau đó, ra lệnh kéo toàn bộ sự thay đổi từ nhánh tính năng gộp vào main:
git merge feature/normalize-address
Nếu không có ai sửa trùng file với anh em, Git sẽ hiển thị thông báo Fast-forward (Gộp tua nhanh), và mọi dòng code chuẩn hóa địa chỉ đã chính thức hiện diện an toàn trên nhánh main.
4. Dọn dẹp chiến trường
Tính năng đã làm xong, code đã gộp vào main, cái nhánh feature lúc này đã hoàn thành sứ mệnh lịch sử và trở thành đồ thừa. Để danh sách nhánh không bị dài dằng dặc, anh em nên xóa nó đi:
git branch -d feature/normalize-address
(Tham số -d viết tắt của delete. Nếu anh em chưa gộp code mà đã đòi xóa, Git sẽ cảnh báo. Nếu vẫn muốn ép xóa bất chấp mất code, dùng chữ hoa -D).
Nắm vững được hệ thống Branching, anh em đã có thể làm việc nhóm mượt mà cùng hàng chục Kỹ sư khác mà không lo giẫm chân lên nhau. Đội CI/CD cũng sẽ rất nhàn hạ khi chỉ cần cấu hình Jenkins tự động kích hoạt tiến trình deploy mỗi khi có code mới được merge thành công vào nhánh main.
All rights reserved