- Tính năng mới của GitHub cho phép chia các thay đổi mã nguồn lớn thành những PR nhỏ, dễ review để quản lý theo trình tự
- Mỗi PR được review độc lập, và toàn bộ stack có thể được merge chỉ với một cú nhấp chuột
- Hỗ trợ tạo stack, điều hướng, rebase, merge qua GitHub UI và CLI
gh stack, đồng thời trực quan hóa cấu trúc phân cấp bằng stack map
- Thông qua tích hợp AI coding agent, có thể tự động chia diff lớn thành các đơn vị stack hoặc phát triển theo quy trình dựa trên stack
- Mục tiêu là giảm độ phức tạp và rủi ro xung đột của các PR lớn, đồng thời tăng hiệu quả review và tốc độ phát triển của nhóm
Tính năng chính
-
Quản lý PR dạng stack
- Tổ chức nhiều PR thành stack có thứ tự, trong đó mỗi PR dựa trên nhánh của PR ngay bên dưới
- Hình thành cấu trúc chuỗi cuối cùng dẫn tới nhánh main
- GitHub nhận diện toàn bộ stack và hiển thị stack map trong UI, giúp reviewer dễ dàng điều hướng qua từng tầng
- Quy tắc bảo vệ nhánh được áp dụng cho nhánh đích cuối cùng, và kiểm thử CI được chạy cho mọi PR trong stack
-
Quản lý stack được đơn giản hóa
- Trong GitHub UI, có thể di chuyển giữa các PR trong stack, kiểm tra trạng thái của từng tầng và chạy cascading rebase cho toàn bộ stack
- Có thể merge toàn bộ stack hoặc chỉ merge một phần chỉ với một cú nhấp chuột
- Sau khi merge, các PR còn lại sẽ tự động được rebase, trong đó PR chưa merge thấp nhất sẽ được điều chỉnh để nhắm tới nhánh cơ sở
-
Hỗ trợ CLI mạnh mẽ
- Qua CLI
gh stack, có thể thực hiện tạo stack, rebase, push nhánh, tạo PR, di chuyển giữa các tầng ngay trong terminal
- Ví dụ lệnh CLI
gh extension install github/gh-stack : cài đặt extension
gh stack alias : thiết lập lệnh tắt
gs init <branch> : tạo nhánh đầu tiên
gs add <branch> : thêm tầng mới
gs push : push tất cả nhánh
gs submit : tạo PR cho toàn bộ stack
-
Tích hợp AI Agent
- Với lệnh
npx skills add github/gh-stack, có thể giúp AI coding agent học cách thực hiện tác vụ liên quan đến stack
- Có thể tự động tách diff lớn thành các đơn vị stack, hoặc phát triển theo phương thức dựa trên stack ngay từ đầu
Vì sao cần PR dạng stack
- PR lớn gây ra độ khó review cao hơn, chậm merge và tăng rủi ro xung đột
- Reviewer dễ mất ngữ cảnh, chất lượng phản hồi giảm và tốc độ chung của cả nhóm bị chậm lại
- Stacked PRs giải quyết điều này bằng cách chia thành chuỗi PR nhỏ, tập trung
- Mỗi PR có thể được review độc lập, trong khi toàn bộ thay đổi được tích lũy tuần tự
Bắt đầu
1 bình luận
Ý kiến trên Hacker News
Thứ tôi cần không phải là "stacked PR" mà là UI để quản lý từng commit riêng lẻ
Git vốn đã có khái niệm commit rồi, nên tôi không hiểu vì sao lại phải chồng thêm một tầng trừu tượng gọi là “stacked PR” lên trên
Nó giúp dễ tiếp tục làm việc mới trên phần việc còn chưa được merge, và cho phép reviewer review độc lập theo từng phần nhỏ đối với thay đổi lớn
Điều này đặc biệt hữu ích trong monorepo quy mô lớn hoặc môi trường doanh nghiệp
Lặp đi lặp lại squash, rebase, force push giống như tự chĩa súng vào chân mình
Chỉ với
git merge --no-ff,git log --first-parent,git bisect --first-parentcũng đủ đạt được hiệu quả tương tựNó được công khai trong tài liệu interactive smartlog và cũng có extension cho VSCode
Hơi tiếc là nó lại không được dùng rộng rãi hơn
Commit được dùng như quá trình tiến hóa để hoàn thiện PR đó
Sau khi dùng Phabricator và Mercurial rồi quay lại GitHub, tôi có cảm giác như trở về thời kỳ đồ đá
Thật vui khi thấy jujutsu hay tính năng lần này tái hiện lại luồng stacked diff
Nó không chỉ hữu ích với monorepo mà còn giúp review nhỏ và nhanh trong quá trình phát triển tính năng dài hạn
Mercurial lúc nào cũng nói “nhanh hơn git”, nhưng thực tế thì chậm hoặc hay lỗi
Git xấu xí nhưng nhanh và đáng tin cậy
Khi review thay đổi lớn (ví dụ: cập nhật dependency vendor), trải nghiệm review file của GitHub khá tệ
Cuối cùng cũng ra rồi!
Mô hình “PR=branch” của GitHub trước giờ thật khó hiểu
stacked commit kiểu Phabricator/Gerrit hợp với cách tôi suy nghĩ hơn
Giờ chắc phải cài CLI rồi
Branch chỉ là cắm một lá cờ vào commit, và việc giữ lại nhiều điểm chỉ có ý nghĩa khi phần trước đó có thể được merge độc lập
Tôi tò mò không biết họ đã giải quyết vấn đề UX của Squash & Merge hiện tại chưa
Tôi đang xếp thủ công theo kiểu main <- PR A <- PR B <- PR C,
và khi PR A được merge trước thì PR B trở thành địa ngục xung đột
UI GitHub tự động đổi target branch về main rồi gây ra xung đột kỳ quặc
Tôi chỉ cần một công cụ “cứ thế mà chạy ổn”
Hy vọng
gh stack syncsẽ xử lý bằngrebase --ontogit rebase --ontoVí dụ: PR1(main<-A,B), PR2(main<-A,B,C,D), PR3(main<-A,B,C,D,E,F)
Nếu PR1,2 được squash merge thì main sẽ là S1(A+B), S2(C+D)
Sau đó
git rebase --onto S2 D branch3sẽ sắp xếp lại mà không bị xung độtCó thể giải quyết bằng
git rebase --update-refs --onto origin/main A CGH CLI sẽ tự động hóa quy trình này
Nhưng rốt cuộc giải pháp vẫn chỉ là rebase thủ công để sắp xếp lại các commit
Khi phát triển một mình thì stacked PR gần như không cần thiết, nhưng thói quen chia nhỏ theo đơn vị nhỏ vẫn rất quan trọng
Vì các công cụ AI (ví dụ: Claude Code) thường tạo ra diff lớn trong một lần,
nên sẽ rất thú vị nếu agent có thể tự chia công việc thành các đơn vị logic
git-spice cũng đáng để thử
Nó tương thích với GitLab v.v., và tôi dùng hoàn toàn git-spice thay cho các lệnh git hiện có
Việc GitHub cuối cùng cũng đưa tính năng stack vào UI là rất tuyệt
Nó tương tự
glab stackcủa GitLabTuy vậy quá trình merge có vẻ sẽ hơi gượng — nếu merge phần phía dưới của stack thì phần còn lại sẽ bị rebase và CI sẽ chạy lại
Khi muốn chỉ merge hai patch phía dưới trong ba patch, bạn sẽ phải chờ test cho từng cái
Sau đó stack phía trên sẽ được rebase và CI có thể chạy lại
Chúng tôi dự định sẽ bổ sung phần này rõ hơn trong tài liệu
Tôi không thực sự hiểu sự cần thiết của stacked PR
Trong git vốn đã có thể review và áp dụng từng bộ patch riêng lẻ
Mô hình PR ngược lại còn gom tất cả thành một khối
Stacked PR trông như một tầng trừu tượng khác để lách qua vấn đề đó
Các commit bên trong chỉ là lịch sử phát triển, và khi merge thì squash chúng thành một
Làm vậy trong lúc phát triển thì có thể commit thoải mái, còn khi merge thì chỉ giữ lại thay đổi sạch sẽ
Cách GitHub triển khai tạo cảm giác hơi chắp vá
Nói cách khác, đó là cấu trúc xếp chồng công việc theo từng bước thành các đơn vị có thể review được
Đã có một startup tên Graphite tập trung vào stacked PR từ trước
Tôi đã dùng Graphite, nên rất vui khi GitHub cũng triển khai thứ tương tự
Tôi thích stacked PR, nhưng cách GitHub triển khai lần này lại cho cảm giác khá kỳ lạ
Chỉ cần để mỗi branch trỏ tới branch cha của nó là đủ
Thứ cần hơn CLI là hỗ trợ UI
Sẽ tốt nếu CLI tự động hóa quy trình này
Lý do đặt chuỗi branch là để diff chỉ hiển thị các thay đổi của branch đó
Chỉ là thiếu UI và trực quan hóa mà thôi