GitHub Stacked PRs
(github.github.com/gh-stack)- बड़े code changes को छोटे, review किए जा सकने वाले PR units में विभाजित करके क्रमवार प्रबंधित करने देने वाला GitHub का नया फीचर
- हर PR का स्वतंत्र रूप से review किया जाता है, और पूरी stack को एक क्लिक में merge किया जा सकता है
- GitHub UI और
gh stackCLI के ज़रिए stack बनाना, नेविगेट करना, rebase करना, और merge करना समर्थित है, और stack map से hierarchy को विज़ुअलाइज़ किया जाता है - AI coding agent integration के माध्यम से बड़े diff को अपने-आप stack units में बांटा जा सकता है या stack-आधारित development किया जा सकता है
- इसका उद्देश्य बड़े PRs की complexity और conflict risk को कम करना, और review efficiency तथा team development speed को बढ़ाना है
मुख्य फीचर्स
-
Stack-आधारित PR management
- कई PRs को क्रमबद्ध stack के रूप में व्यवस्थित किया जाता है, जहाँ हर PR अपने ठीक नीचे वाले PR की branch पर आधारित होता है
- इससे अंततः main branch तक पहुँचने वाली chain structure बनती है
- GitHub पूरी stack को पहचानकर UI में stack map दिखाता है, ताकि reviewer हर layer को आसानी से देख सके
- Branch protection rules अंतिम target branch पर लागू होते हैं, और CI tests stack के सभी PRs पर चलाए जाते हैं
-
सरल stack management
- GitHub UI में stack के भीतर PRs के बीच जाना, हर layer की स्थिति देखना, और पूरी stack पर cascading rebase चलाना संभव है
- एक क्लिक में पूरी stack को merge किया जा सकता है, या उसका कुछ हिस्सा ही merge किया जा सकता है
- merge के बाद बचे हुए PRs अपने-आप rebase हो जाते हैं, जिससे सबसे नीचे का unmerged PR base branch के अनुसार समायोजित हो जाता है
-
मज़बूत CLI support
gh stackCLI के जरिए stack बनाना, rebase करना, branch push करना, PR बनाना, और layers के बीच जाना terminal से किया जा सकता है- CLI command examples
gh extension install github/gh-stack: extension install करेंgh stack alias: shortcut commands सेट करेंgs init <branch>: पहली branch बनाएंgs add <branch>: नई layer जोड़ेंgs push: सभी branches push करेंgs submit: पूरी stack के PRs बनाएं
-
AI Agent integration
npx skills add github/gh-stackcommand से AI coding agent को stack tasks करने के लिए सिखाया जा सकता है- बड़े diff को अपने-आप stack units में बांटा जा सकता है, या शुरुआत से stack-आधारित development किया जा सकता है
Stack-आधारित PRs की ज़रूरत
- बड़े PRs से review की कठिनाई बढ़ती है, merge में देरी होती है, और conflict risk बढ़ता है
- reviewer context खो सकते हैं, feedback की गुणवत्ता गिरती है, और पूरी team की गति धीमी हो जाती है
- Stacked PRs इसे हल करने के लिए changes को छोटी और focused PR chain में बाँटते हैं
- हर PR का स्वतंत्र review किया जा सकता है, और पूरे changes क्रमवार जुड़ते जाते हैं
शुरुआत करें
- जल्दी शुरू करने के लिए Quick Start guide या Overview docs देखें
2 टिप्पणियां
Hacker News की राय
मुझे "stacked PR" नहीं, बल्कि single commit management के लिए UI चाहिए
Git में पहले से commit का concept है, तो समझ नहीं आता कि उसके ऊपर फिर "stacked PR" जैसा abstraction क्यों रखा जा रहा है
इससे अभी merge न हुए काम के ऊपर नया काम आगे बढ़ाना आसान हो जाता है, और reviewer बड़े बदलावों को छोटी इकाइयों में स्वतंत्र review कर सकते हैं
बड़े monorepo या enterprise environment में यह खास तौर पर उपयोगी था
बार-बार squash, rebase, force push करना अपने ही पैर पर कुल्हाड़ी मारने जैसा लगता है
git merge --no-ff,git log --first-parent,git bisect --first-parentसे भी काफी हद तक वही असर मिल सकता हैयह interactive smartlog दस्तावेज़ में public है और इसका VSCode extension भी है
अफसोस है कि यह उम्मीद के मुताबिक व्यापक रूप से इस्तेमाल नहीं हो पाया
commits का उपयोग उस PR को पूरा करने की evolving process के रूप में किया जाए
Phabricator और Mercurial इस्तेमाल करने के बाद GitHub पर लौटना पाषाण युग में वापस जाने जैसा लगता है
stacked diff flow को फिर से लागू करने वाले jujutsu या इस नई feature को देखकर अच्छा लगा
यह सिर्फ monorepo ही नहीं, लंबे समय तक चलने वाले feature development में भी review को छोटा और तेज़ बनाता है
Mercurial हमेशा कहता था कि वह "git से तेज़ है", लेकिन व्यवहार में वह धीमा था या टूट जाता था
Git बदसूरत है, लेकिन तेज़ और भरोसेमंद है
बड़े बदलावों (जैसे vendor dependency update) की review करते समय GitHub का file review experience खास अच्छा नहीं है
आखिरकार आ गया!
GitHub का "PR=branch" मॉडल मुझे कभी समझ नहीं आया
Phabricator/Gerrit-style stacked commit मेरे सोचने के तरीके से ज़्यादा मेल खाता है
अब लगता है CLI install करना पड़ेगा
branch तो बस commit पर झंडा लगाने जैसा है, और कई points छोड़ने का मतलब तभी बनता है जब पहले वाले हिस्सों को स्वतंत्र रूप से merge किया जा सके
जिज्ञासा है कि क्या इससे मौजूदा Squash & Merge UX problem हल हुई है
मैं manually main <- PR A <- PR B <- PR C की तरह stack बनाता हूँ,
PR A पहले merge हो जाए तो PR B conflict के नरक में फँस जाता है
GitHub UI target branch को अपने-आप main में बदल देता है और अजीब conflicts पैदा हो जाते हैं
बस ऐसा tool चाहिए जो "बस ठीक से काम करे"
उम्मीद है
gh stack syncइसेrebase --ontoसे संभाल लेगाgit rebase --ontoसे ही handle होता हैउदाहरण: PR1(main<-A,B), PR2(main<-A,B,C,D), PR3(main<-A,B,C,D,E,F)
अगर PR1,2 squash merge हो जाएँ, तो main में S1(A+B), S2(C+D) होगा
उसके बाद
git rebase --onto S2 D branch3से बिना conflict के चीज़ें व्यवस्थित हो जाती हैंgit rebase --update-refs --onto origin/main A Cसे इसे हल किया जा सकता हैGH CLI इस प्रक्रिया को automate कर देता है
लेकिन समाधान आखिरकार manual rebase करके commits को ठीक करना ही है
अकेले development करते समय stacked PR की ज़रूरत कम पड़ती है, लेकिन छोटे units में बाँटने की आदत फिर भी महत्वपूर्ण है
AI tools (जैसे Claude Code) एक बार में बड़ा diff बना देते हैं,
इसलिए अगर agent खुद काम को logical units में बाँट सके तो वह दिलचस्प होगा
git-spice भी देखने लायक है
यह GitLab आदि के साथ compatible है, और मैं मौजूदा git commands की जगह पूरी तरह git-spice इस्तेमाल करता हूँ
यह अच्छा है कि GitHub ने आखिरकार UI में stack feature जोड़ दिया
यह GitLab के
glab stackजैसा हैलेकिन merge process थोड़ा awkward लगती है — stack के नीचे वाले हिस्से को merge करने पर बाकी का rebase होगा और CI फिर से चलेगा
अगर तीन patches में से नीचे के दो ही merge करने हों, तो हर एक के लिए test का इंतज़ार करना पड़ेगा
उसके बाद ऊपर का stack rebase होगा और CI फिर से चल सकती है
इस हिस्से को docs में और स्पष्ट रूप से जोड़ने की योजना है
मुझे stacked PR की ज़रूरत ठीक से समझ नहीं आती
git में मूल रूप से patch sets को अलग-अलग review और apply किया जा सकता है
PR model उल्टा इसे एक ही बड़े पैकेज में बाँध देता है
stacked PR उस समस्या को bypass करने के लिए एक और abstraction जैसा लगता है
अंदर के commits सिर्फ development history होते हैं, और merge के समय उन्हें squash करके एक में मिला दिया जाता है
इससे development के दौरान commits स्वतंत्र रूप से जमा किए जा सकते हैं, और merge के समय सिर्फ साफ बदलाव बचता है
GitHub की implementation थोड़ी जबरन चिपकाई गई feature जैसी लगती है
यानी यह काम को reviewable units में चरणबद्ध तरीके से stack करने की संरचना है
Graphite नाम का startup पहले से stacked PR पर फोकस कर रहा है
मैं Graphite इस्तेमाल करता रहा हूँ, इसलिए GitHub को ऐसा कुछ बनाते देखना अच्छा लगा
मुझे stacked PR पसंद हैं, लेकिन GitHub की यह implementation थोड़ी अजीब लगती है
बस इतना काफी होना चाहिए कि हर branch अपने parent को point करे
CLI से ज़्यादा UI support की ज़रूरत है
अगर CLI इस प्रक्रिया को automate कर दे, तो अच्छा होगा
branch chain रखने की वजह यह है कि diff सिर्फ उसी branch के बदलाव दिखाए
बस UI और visualization की कमी थी