GitHub Stacked PRs
(github.github.com/gh-stack)- GitHub’un, büyük kod değişikliklerini küçük ve incelenebilir PR birimlerine bölerek sıralı şekilde yönetmeyi sağlayan yeni özelliği
- Her PR bağımsız olarak incelenir ve tüm stack tek tıkla birleştirilebilir
- GitHub arayüzü ve
gh stackCLI üzerinden stack oluşturma, gezinme, rebase etme, birleştirme desteklenir; stack map ile hiyerarşik yapı görselleştirilir - Yapay zeka kodlama ajanı entegrasyonu sayesinde büyük diff’ler otomatik olarak stack birimlerine ayrılabilir veya stack tabanlı geliştirme yapılabilir
- Amaç, büyük PR’lerin karmaşıklığını ve çakışma riskini azaltırken inceleme verimliliğini ve ekip geliştirme hızını artırmaktır
Başlıca özellikler
-
Stack tipi PR yönetimi
- Birden çok PR, sıralı bir stack yapısı halinde düzenlenir ve her PR doğrudan altındaki PR’ın branch’ini temel alır
- Sonunda ana branch’e ulaşan bir zincir yapısı oluşur
- GitHub tüm stack’i algılar ve arayüzde stack map gösterir; böylece inceleme yapanlar her katmanda kolayca gezinebilir
- Branch koruma kuralları son hedef branch’e uygulanır ve CI testleri stack içindeki tüm PR’ler için çalıştırılır
-
Basitleştirilmiş stack yönetimi
- GitHub arayüzünde stack içindeki PR’ler arasında geçiş yapılabilir, her katmanın durumu görülebilir ve tüm stack için zincirleme rebase (cascading rebase) çalıştırılabilir
- Tek tıkla tüm stack veya yalnızca bir kısmı birleştirilebilir
- Birleştirme sonrası kalan PR’ler otomatik olarak rebase edilir; böylece en alttaki henüz birleştirilmemiş PR, varsayılan branch’i hedefleyecek şekilde ayarlanır
-
Güçlü CLI desteği
gh stackCLI ile stack oluşturma, rebase etme, branch push etme, PR oluşturma, katmanlar arasında geçiş işlemleri terminalden yapılabilir- CLI komut örnekleri
gh extension install github/gh-stack: eklentiyi kurargh stack alias: kısayol komutlarını ayarlargs init <branch>: ilk branch’i oluştururgs add <branch>: yeni katman eklergs push: tüm branch’leri push edergs submit: tüm stack için PR oluşturur
-
Yapay zeka ajanı entegrasyonu
npx skills add github/gh-stackkomutuyla yapay zeka kodlama ajanı stack işlemleri yapacak şekilde eğitilebilir- Büyük diff’ler otomatik olarak stack birimlerine ayrılabilir veya baştan itibaren stack tabanlı geliştirme yapılabilir
Stack tipi PR’lere neden ihtiyaç var?
- Büyük PR’ler inceleme zorluğunun artmasına, birleştirmenin gecikmesine ve çakışma riskine yol açar
- İncelemeyi yapan kişiler bağlamı kaybedebilir, geri bildirim kalitesi düşebilir ve tüm ekibin hızı yavaşlayabilir
- Stacked PRs bunu çözmek için değişiklikleri küçük ve odaklı bir PR zincirine böler
- Her PR bağımsız olarak incelenebilir ve tüm değişiklikler sıralı biçimde birikir
Başlarken
- Hızlıca başlamak için Quick Start kılavuzuna veya Overview dokümanına bakın
1 yorum
Hacker News görüşleri
Benim ihtiyacım olan şey "stacked PR" değil, tekil commit yönetimi için bir UI
Git zaten commit kavramına sahip; bunun üstüne neden bir de “stacked PR” diye bir soyutlama ekleniyor, anlamıyorum
Henüz merge edilmemiş işlerin üstünde yeni işler yapmayı kolaylaştırıyor ve büyük değişiklikleri inceleyen kişilerin bunları küçük parçalara ayırıp bağımsız incelemesine olanak tanıyor
Özellikle büyük monorepo'larda veya kurumsal ortamlarda faydalıydı
Tekrar tekrar squash, rebase ve force push yapmak kendi ayağına sıkmak gibi geliyor
git merge --no-ff,git log --first-parent,git bisect --first-parentile de yeterince benzer etki elde edilebilirinteractive smartlog dokümanı olarak açıklandı ve bir VSCode uzantısı da var
Buna rağmen çok yaygınlaşmamış olması üzücü
Commit'leri ise o PR'ı tamamlamaya giden evrimsel süreç olarak kullanmak
Phabricator ve Mercurial kullandıktan sonra GitHub'a dönmek taş devrine dönmek gibi hissettiriyor
Stacked diff akışını yeniden sunan jujutsu veya bu yeni özellik sevindirici
Sadece monorepo'larda değil, uzun soluklu feature geliştirmede de incelemeleri küçük ve hızlı tutmayı sağlıyor
Mercurial hep “git'ten daha hızlı” derdi ama pratikte ya daha yavaştı ya da bozuluyordu
Git çirkin ama hızlı ve güvenilir
Büyük değişiklikleri incelerken (ör. vendor dependency güncellemeleri) GitHub'ın dosya inceleme deneyimi iyi değil
Sonunda geldi!
GitHub'ın “PR=branch” modeli bana hiç mantıklı gelmiyordu
Phabricator/Gerrit tarzı stacked commit benim düşünme biçimime daha uygun
Artık CLI'ı kurmam gerekecek
Branch, sadece commit'e bir bayrak dikmek gibi; birden fazla noktayı korumak ancak önceki parçalar bağımsız merge edilebiliyorsa anlamlı
Mevcut durumda Squash & Merge UX sorununu çözüp çözmediklerini merak ediyorum
Ben manuel olarak main <- PR A <- PR B <- PR C şeklinde yığıyorum,
PR A önce merge edilirse PR B tam bir conflict cehennemine dönüyor
GitHub UI hedef branch'i otomatik olarak main'e çeviriyor ve garip conflict'ler çıkıyor
Bana sadece “işi düzgün yapan” bir araç lazım
gh stack syncbunurebase --ontoile çözebilmeligit rebase --ontoile yapılıyorÖrnek: PR1(main<-A,B), PR2(main<-A,B,C,D), PR3(main<-A,B,C,D,E,F)
PR1 ve PR2 squash merge edilirse main artık S1(A+B), S2(C+D) olur
Sonrasında
git rebase --onto S2 D branch3ile conflict yaşamadan düzenlenebilirgit rebase --update-refs --onto origin/main A Cile çözülebilirGH CLI bu süreci otomatikleştiriyor
Ama çözüm eninde sonunda commit'leri elle rebase ederek düzenlemekten geçiyor
Tek başına geliştirirken stacked PR'a neredeyse hiç ihtiyaç olmuyor ama küçük parçalara ayırma alışkanlığı yine de önemli
AI araçları (ör. Claude Code) tek seferde büyük diff'ler ürettiği için,
ajanların işi kendi kendine mantıksal birimlere bölmesi ilginç olabilir
git-spice'a da bakmaya değer
GitLab vb. ile uyumlu ve ben normal git komutları yerine tamamen git-spice kullanıyorum
GitHub'ın sonunda UI'a stack özelliği eklemesi güzel
GitLab'ın
glab stacközelliğine benziyorYalnız merge süreci biraz tuhaf olabilir — stack'in alt kısmını merge edince geri kalanı rebase olur ve CI yeniden çalışır
Üç patch'ten alttaki ikisini merge etmek istediğinde, her biri için test beklemen gerekir
Sonrasında üstteki stack rebase ediliyor ve CI yeniden tetiklenebiliyor
Dokümana bu kısmı daha açık yazmayı planlıyoruz
Ben stacked PR ihtiyacını pek anlamıyorum
Git'te zaten patch set'leri ayrı ayrı inceleyip uygulayabilirsin
PR modeli ise bunu tek bir paket hâline getiriyor
Stacked PR da bu sorunu aşmak için eklenmiş başka bir soyutlama gibi duruyor
İç commit'ler sadece geliştirme geçmişi; merge edilirken hepsi squash ile tek bir şeye dönüştürülüyordu
Böylece geliştirme sırasında özgürce commit biriktirip merge anında temiz bir değişiklik bırakabiliyorsun
GitHub'ın uygulaması biraz sonradan eklenmiş bir özellik gibi hissettiriyor
Yani işi incelemeye uygun birimler hâlinde aşamalı olarak yığma yapısı sunuyor
Graphite adlı bir startup zaten stacked PR'lara odaklanıyor
Ben Graphite kullanıyordum; GitHub'ın da benzer bir şey yapması sevindirici
Stacked PR'ları seviyorum ama GitHub'ın bu uygulaması bana garip bir yaklaşım gibi geldi
Bence her branch'in parent'ını göstermesi yeterli olurdu
CLI'dan çok UI desteğine ihtiyaç var
CLI bu süreci otomatikleştirirse iyi olur
Branch zinciri kullanılmasının nedeni, diff'in yalnızca o branch'teki değişiklikleri göstermesi
Sadece UI ve görselleştirme eksikti