Làm chủ Stacked PRs với git-machete: Đừng để Git Rebase làm khó bạn

Git tutorial - IT technology blog
Git tutorial - IT technology blog

Nỗi ám ảnh mang tên “Stacked Pull Requests”

Làm việc trong các dự án lớn với quy trình CI/CD khắt khe, chắc hẳn bạn đã từng rơi vào cảnh “kẹp thịt” giữa một chuỗi Pull Request (Stacked PRs). Bạn đang code Feature A, nhưng Feature B lại cần code của A để chạy, rồi Feature C lại phải đợi B.

Mọi thứ vẫn êm đẹp cho đến khi Reviewer yêu cầu sửa logic ở Feature A. Lúc này, cơn ác mộng rebase bắt đầu. Bạn sửa A, sau đó hì hục rebase B lên A, rồi lại tiếp tục kéo C lên B. Chỉ cần một phút lơ là với lệnh git rebase --onto, toàn bộ lịch sử commit của bạn sẽ rối thành một mớ bòng bong.

Mình từng mất cả buổi sáng chỉ để gỡ rối một chuỗi 5 nhánh phụ thuộc. Thậm chí, vì quá mệt mỏi, mình đã lỡ tay git push --force đè lên code của đồng nghiệp. Để không còn những pha “thót tim” như vậy, mình đã tìm đến git-machete.

Tại sao cách quản lý nhánh truyền thống lại dễ “gãy”?

Hãy nhìn vào hai cách tiếp cận phổ biến nhất để thấy sự khác biệt về hiệu suất.

1. Rebase thủ công (Cách khổ sai)

Đây là cách mặc định: bạn dùng lệnh git rebase cho từng nhánh một.

  • Nhược điểm: Tốn trung bình 10-15 phút cho một chuỗi 3 nhánh nếu có conflict. Bạn rất dễ nhầm lẫn gốc (base) của các nhánh khi số lượng tăng lên.

2. Dùng git-machete (Cách thông minh)

Công cụ này tạo ra một lớp quản lý phía trên Git, định nghĩa cây phụ thuộc qua một file cấu hình tại .git/machete.

  • Ưu điểm: Chỉ mất 1 lệnh để cập nhật toàn bộ chuỗi. Bạn có cái nhìn toàn cảnh về repo mà không cần ghi nhớ trong đầu.

Khả năng “quan sát” – Vũ khí tối thượng của git-machete

Điểm ăn tiền nhất của tool này là lệnh git machete status. Thay vì mông lung không biết nhánh nào đã cũ, bạn sẽ thấy một sơ đồ cây hiển thị rõ ràng: nhánh nào đang đồng bộ (màu xanh), nhánh nào bị lệch (màu đỏ), và nhánh nào đã merge (màu xám).

Nó giúp bạn tự tin hơn khi dùng --force-with-lease. Bạn luôn biết chính xác mình đang đứng ở đâu trong chuỗi phụ thuộc, thay vì đoán mò rồi cầu nguyện mỗi khi push.

Cài đặt trong 30 giây

Tool này viết bằng Python nên việc cài đặt cực kỳ đơn giản trên mọi hệ điều hành.

# Cho macOS
brew install git-machete

# Cho Ubuntu/Linux hoặc Windows (qua pip)
pip install git-machete

Sau khi cài xong, hãy di chuyển vào repo của bạn và chạy lệnh sau để tool tự “học” cấu trúc nhánh:

git machete discover

Các thao tác thực tế giúp bạn rảnh tay

1. Kiểm tra “sức khỏe” của chuỗi nhánh

Lệnh này nên là thói quen mỗi sáng khi bạn bắt đầu làm việc:

git machete status

Nếu thấy nhánh hiện màu đỏ, đó là tín hiệu bạn cần cập nhật code từ nhánh cha.

2. Tự động Rebase hàng loạt

Giả sử nhánh master vừa có update lớn. Bạn muốn toàn bộ chuỗi feature-1 -> feature-2 -> feature-3 cũng được cập nhật theo? Chỉ cần gõ:

git machete update

Tool sẽ duyệt qua từng nhánh và thực hiện rebase giúp bạn. Nếu có conflict, nó sẽ dừng lại để bạn xử lý rồi tiếp tục hành trình.

3. Dọn dẹp sau khi Merge (Slide-out)

Khi nhánh feature-1 đã được merge vào master, bạn cần nối feature-2 trực tiếp vào master. Đừng làm thủ công, hãy dùng:

git machete slide-out feature-1

Tình huống thực tế: Xử lý logic thay đổi đột ngột

Hãy tưởng tượng sơ đồ của bạn: master -> fix-auth -> add-logging.

Team Leader yêu cầu bạn đổi tên một hàm quan trọng trong fix-auth. Ngay sau khi bạn sửa, nhánh add-logging sẽ bị “lệch gốc” ngay lập tức. Thay vì loay hoay tính toán xem rebase từ commit nào, bạn chỉ cần gõ git machete status để thấy vùng đỏ, sau đó git machete update là xong. Mọi thứ lại vào guồng quay mà không tốn một giọt mồ hôi.

Lưu ý để sử dụng hiệu quả

  • Tin tưởng nhưng có kiểm soát: Luôn xem status trước khi update để đảm bảo cây branch đúng ý bạn.
  • Đừng quên file cấu hình: Nếu bạn tạo nhánh mới thủ công, hãy chạy git machete discover hoặc sửa file .git/machete để tool cập nhật sơ đồ.
  • Kết hợp với Alias: Mình thường đặt alias gm = git machete để gõ lệnh nhanh hơn.

Nếu bạn đang ngán ngẩm cảnh gỡ rối conflict mỗi khi làm Stacked PRs, hãy thử git-machete ngay. Đây không chỉ là một tool, mà là cách để bạn bảo vệ sự tập trung và “sức khỏe tâm thần” khi làm việc với Git.

Share: