Git ब्रांच: अंतर्ज्ञान और वास्तविकता
(jvns.ca)- बहुत से लोगों को लगता है कि Git branch जिस तरह काम करती है, वह सहज नहीं है
- यह Git branch के बारे में सामान्य सहज मॉडल और Git के अंदर branch वास्तव में कैसे दर्शाई जाती है, इनके बीच के अंतर को समझाता है
- यह दिखाता है कि सहज मॉडल और Git के वास्तविक काम करने के तरीके के बीच वास्तव में बहुत करीबी संबंध है
- यह सहज मॉडल की सीमाओं और यह क्यों समस्याएँ पैदा कर सकता है, इस पर चर्चा करता है
सहज ब्रांच मॉडल
- बहुत से लोग branch को 'सेब के पेड़ की शाखा' जैसी उपमा से समझते हैं।
- Git में branch के लिए 'parent' जैसी कोई अवधारणा नहीं होती, इसलिए इसे
mainसे निकली हुई चीज़ मानना पूरी तरह सही नहीं है।
Git में branch पूरा history होती है
- Git में branch सिर्फ अलग हुई commits का समूह नहीं है, बल्कि उसमें उससे पहले की पूरी history शामिल होती है।
- उदाहरण repository के माध्यम से यह दिखाया गया है कि
mainऔरmybranchदोनों में 4 commits हैं।
branch commit ID के रूप में संग्रहीत होती है
- Git के अंदर branch एक छोटी text file के रूप में संग्रहीत होती है, जिसमें commit ID होती है।
- हर branch की सबसे नई commit उस file में दर्ज होती है।
- commits के बीच parent-child संबंध branch स्तर पर नहीं होने के कारण, Git branches के बीच के संबंध को नहीं जानता।
लोगों का अंतर्ज्ञान आम तौर पर इतना गलत नहीं होता
- लोगों के Git संबंधी अंतर्ज्ञान को 'गलत' कहना कुछ हद तक मूर्खतापूर्ण है।
- 'गलत' मॉडल भी वास्तव में उपयोगी हो सकता है।
rebase 'सहज' branch अवधारणा का उपयोग करता है
- rebase केवल 'सहज' branch की commits को
mainपर फिर से लागू करता है। - rebase का परिणाम सहज मॉडल से मेल खाता है।
merge भी 'सहज' branch अवधारणा का उपयोग करता है
- merge commits को कॉपी नहीं करता, लेकिन उसे साझा base commit की ज़रूरत होती है।
- merge base सहज मॉडल के आधार पर वह commit ढूँढता है जहाँ branch अलग हुई थी।
GitHub pull request भी सहज विचार का उपयोग करता है
- GitHub में जब
mybranchकोmainमें merge करने के लिए pull request बनाया जाता है, तो वह केवल सहज branch की commits दिखाता है।
अंतर्ज्ञान अच्छा है, लेकिन इसकी सीमाएँ हैं
- सहज branch की परिभाषा वास्तविक Git कार्यप्रणाली से अच्छी तरह मेल खाती है, लेकिन Git
mainऔर उससे अलग हुई branch को अलग तरह से पहचान नहीं पाता।
trunk और अलग हुई branches
- लोग
mainऔरmybranchको अलग तरह से देखते हैं, और इसका असर Git इस्तेमाल करने के तरीके पर पड़ता है। - Git यह भेद नहीं करता कि कोई branch दूसरी branch से 'निकली' हुई है या नहीं।
Git rebase को 'उल्टी दिशा' में भी कर सकता है
- Git यह नहीं बताता कि कौन-सी branch किस branch से निकली है, इसलिए कब और किस branch को rebase करना है, यह उपयोगकर्ता को खुद जानना पड़ता है।
git rebase mainऔर उल्टी दिशा वाला rebasegit rebase mybranchदोनों संभव हैं। merge के साथ भी यही बात लागू होती है
Git branches के बीच hierarchy का न होना कुछ अजीब है
mainbranch के विशेष न होने की बात इसलिए आती है क्योंकि Git branches के बीच संबंधों को पहचान नहीं पाता।- branches के बीच संबंध तो होते हैं, लेकिन Git को उनके बारे में कुछ पता नहीं होता
Git branch UI भी अजीब है
- जब आप केवल 'अलग हुई' commits देखना चाहते हैं, तो
git logऔरgit diffका उपयोग करने का तरीका अलग होता है।
GitHub में default branch विशेष होती है
- GitHub में एक 'default branch' होती है, जिसकी एक विशेष भूमिका होती है।
GN⁺ की राय
इस लेख की सबसे महत्वपूर्ण बात यह है कि Git branch को लेकर लोगों की सहज समझ और Git के वास्तविक काम करने के तरीके के बीच के अंतर को समझा जाए। यह लेख शुरुआती software engineers को Git branch की अवधारणा को बेहतर समझने और उसे अधिक प्रभावी ढंग से उपयोग करने में मदद करेगा। Git branch के सहज मॉडल का वास्तविक काम से कैसे मेल बैठता है, और Git branches के बीच संबंधों को कैसे नहीं संभालता, यह समझना रोचक और उपयोगी है।
1 टिप्पणियां
Hacker News राय
git reset --hardऔरgit stashका इस्तेमाल करके changes और branch pointers को manipulate करता हूँ, और मेरे दोस्त यह देखकर अक्सर नाराज़ हो जाते हैं। गलत merge को undo करने के लिएgit reset --hard <merge से पहले का आख़िरी commit>का इस्तेमाल करता हूँ, और local branch के छोटे changes को main branch पर लागू करने के लिए पहलेgit stashकरता हूँ, फिर main branch पर checkout करकेgit stash applyचलाता हूँ।git addऔरgit commitका इस्तेमाल जानने वालों के लिए एक dynamic tutorial है। यह tutorial branches को visualize करता है और पढ़ते समय समझने में मदद करता है।git merge my-branchcurrent branch में my-branch को merge करता है, औरgit rebase my-branchcurrent branch को my-branch के ऊपर rebase करता है।mainसे संबंधित है, तो यह और सुविधाजनक होगा।git range-diffइस्तेमाल करते समय भी base को ध्यान में रखना पड़ता है। यह toolmain..previousऔरmain..currentजैसी दो ranges की तुलना करता है।