भ्रमित करने वाली Git शब्दावली
(jvns.ca)- Git को लंबे समय तक इस्तेमाल करने के बाद भी इसमें शब्दों की पुनरावृत्ति और दोबारा उपयोग बहुत है, इसलिए सिर्फ commands याद कर लेने से असल behavior का अनुमान लगाना मुश्किल होता है
HEAD,heads, detached HEAD,ours/theirs,../...जैसे एक ही शब्द और symbols context के हिसाब से अलग अर्थ ले लेते हैंindex,staged,cachedसभी.git/indexसे जुड़े हैं, लेकिनreset,revert,restoreमिलते-जुलते नामों के बावजूद commit history, working tree और branch pointer पर अलग-अलग असर डालते हैंmainका remote को track करना औरorigin/mainजैसी remote-tracking branch अलग चीजें हैं, औरcheckoutएक ही command में branch switch और file restore दोनों को समेटे हुए है- Git को समझने के लिए अलग-अलग commands से ज्यादा branch, reference, commit, index और remote tracking state के साथ काम करने वाले internal model को देखना जरूरी है
HEAD, branch और detached HEAD
- Git में heads branches को दर्शाते हैं, और internally branches
.git/refs/headsdirectory में stored होती हैं- आधिकारिक Git glossary branch को उसके ऊपर मौजूद सभी commits और head को सबसे recent commit के रूप में अलग करती है, लेकिन इन्हें उसी target को देखने के दो तरीकों के रूप में समझा जा सकता है
HEADcurrent branch को point करता है और.git/HEADमें stored होता है- “
headbranch है, औरHEADcurrent branch है” जैसा वाक्य ही Git terminology के confusion को अच्छी तरह दिखाता है
- “
- detached HEAD state वह स्थिति है जिसमें
HEADकिसी branch के बजाय सीधे commit ID को point करता है- tag को checkout करने पर, क्योंकि tag branch नहीं होता, detached HEAD state हो सकती है
- इस state में
git pullकाम नहीं करता, औरgit pushभी किसी खास तरीके के बिना काम नहीं करता git commit,git merge,git rebase,git cherry-pickसंभव हैं, लेकिन नए commits किसी branch से जुड़े नहीं रहते, इसलिए उन्हें ढूंढना मुश्किल हो सकता है- नई branch बनाकर या existing branch पर switch करके detached HEAD state से बाहर निकला जा सकता है
merge और rebase में बदलते ours और theirs
- conflict resolution में
git checkout --ours file.txt“ours” वाली file चुनता है, लेकिन merge और rebase के reference point अलग होते हैं - merge में current branch
oursहोती है, और merge होकर आने वाली branchtheirsहोती है- उदाहरण:
git checkout merge-into-oursके बादgit merge from-theirsचलाने पर current branchoursबनती है
- उदाहरण:
- rebase में current branch
theirsहोती है, और rebase target branchoursहोती है- उदाहरण:
git checkout theirsके बादgit rebase oursचलाने पर target branchoursबनती है
- उदाहरण:
- यह फर्क इस बात से जुड़ा है कि
git rebase maininternally current branch के commits कोmainbranch की copy में बार-बार merge करने के तरीके से काम करता है- संबंधित उदाहरण
git rebaseकोgit mergeसे implement करने वाली shell script में है
- संबंधित उदाहरण
- ourstheirs
oursऔरtheirsशब्दों को संक्षेप में समझाता है- VSCode के “current change” और “incoming change” भी इसी तरह confuse कर सकते हैं
remote status messages और fast-forward
Your branch is up to date with 'origin/main'का मतलब यह नहीं कि currentmainremote की latest state में है- इसका मतलब है कि last
git fetchयाgit pullके समय केorigin/mainऔर local branch समान हैं - अगर last fetch 5 दिन पहले हुआ था, तो यह “5 दिन पहले के हिसाब से” up to date है
- इसका मतलब है कि last
- Git reflog में recent fetch time की जानकारी store करता है, लेकिन status message में “last fetch के आधार पर” समय नहीं दिखाया जाता
can be fast-forwardedका मतलब है कि remote branch local branch से आगे है, और local में अलग commits नहीं हैं, इसलिए सिर्फ pointer को आगे ले जाया जा सकता है- उदाहरण: अगर
mainA-B-Cहै औरorigin/mainA-B-C-D-Eहै, तोgit pullके बाद दोनोंA-B-C-D-Eहो जाएंगे - इस case में merge conflict की संभावना नहीं होती
- उदाहरण: अगर
- fast-forward संभव न होने का मतलब है कि दोनों branches अलग-अलग दिशाओं में बढ़ चुकी हैं
- उदाहरण: अगर
mainमेंXcommit है जोorigin/mainमें नहीं है, औरorigin/mainमेंD,Eहैं जोmainमें नहीं हैं, तो fast-forward संभव नहीं है - तब Git दिखाता है कि दोनों branches diverged state में हैं और दोनों के पास अलग-अलग commit counts हैं
- उदाहरण: अगर
commit चयन syntax: ^, ~, .., ...
HEAD^औरHEAD~दोनों 1 commit पहले को point करते हैंHEAD^^^,HEAD~~~,HEAD~3सभी 3 commits पहले को point करते हैं
- merge commit जैसे कई parents वाले commit में
HEAD^2,HEAD^3का अर्थ अलग हो जाता हैHEAD^पहला parent हैHEAD^2दूसरा parent हैHEAD^3तीसरा parent हैHEAD~3parent के parent के parent को दर्शाता है, इसलिए यहHEAD^3से अलग है
git log main..testऔरgit log main...testभी अलग तरह से काम करते हैंmain..testकेवलtestमें मौजूद commits दिखाता हैtest..mainकेवलmainमें मौजूद commits दिखाता हैmain...testदोनों तरफ ही मौजूद commits को साथ दिखाता है
git diffमें..और...कोgit logसे अलग तरह से interpret किया जाता हैgit diff test..maintestside के changes औरmainside के changes दोनों को शामिल करके compare करता हैgit diff test...maincommon ancestor औरmainside के end को compare करके एक तरफ का diff ही दिखाता है
- dots notation की उलझन pain in dots में भी और discuss की गई है
reference, refspec, tree-ish
- Git में reference कई अर्थों में इस्तेमाल होता है
main,v0.2जैसी branches और tags- current branch को point करने वाला
HEAD HEAD^^^जैसी expressions जिन्हें commit ID के रूप में interpret किया जाता है
- Git documentation
HEAD^^^जैसी expressions को सख्ती से “revision parameters” कहती है, लेकिन रोजमर्रा में इन्हें reference की तरह handle किया जा सकता है - symbolic reference का मतलब ऐसा reference है जो किसी दूसरे reference को point करता है, जैसे
HEADHEADGit के core commands के behavior पर बड़ा असर डालने वाला central concept है
.git/configकी remote settings में refspec होता है- उदाहरण:
+refs/heads/main:refs/remotes/origin/main - default
git cloneयाgit remote addजो values बनाते हैं, अक्सर उन्हें ही इस्तेमाल किया जाता है
- उदाहरण:
tree-ishउन targets को दर्शाता है जोgit checkout THING .मेंTHINGहो सकते हैं- commit ID
main,HEAD^^,v0.3.2जैसे commit referencesmain:./docsजैसी commit के अंदर की subdirectory- practical तौर पर कई बार इसे “commit या commit reference” समझना काफी होता है
index, staged, cached
index,staged,cachedसभी.git/indexसे जुड़े हैं.git/indexवह file है जोgit addसे changes को stage करते समय इस्तेमाल होती है
- एक ही target को दर्शाने वाले शब्द कई commands में बिखरे हुए हैं
git diff --cachedgit rm --cachedgit diff --staged.git/index
- हालांकि
--indexऔर--cachedflags का मतलब हमेशा एक जैसा नहीं होता- Git lead maintainer Junio Hamano का लेख detailed differences समझाता है
- performance कारणों से index untracked files को भी list करता है, लेकिन आम तौर पर staging area को untracked files शामिल करने वाला नहीं माना जाता
reset, revert, restore
reset,revert,restoreमिलते-जुलते शब्द हैं, लेकिन Git में इनके असर के targets अलग हैंgit revert COMMITcurrent branch मेंCOMMITके उलटे operation वाला नया commit बनाता है- अगर
COMMITने 3 lines जोड़ी थीं, तो नया commit वे 3 lines हटाता है
- अगर
git reset --hard COMMITcurrent branch को जबरनCOMMITके समय की state में वापस ले जाता है- यह
COMMITके बाद के नए changes मिटाने वाला बहुत risky operation है
- यह
git restore --source=COMMIT PATHPATHकी files कोCOMMITके समय वाली state में लौटाता है- यह दूसरी files या commit history को नहीं बदलता
git reset --hardऔरgit restore .अकेले इस्तेमाल करने पर आम तौर पर मिलते-जुलते काम करते हैं, लेकिनgit reset --hard COMMITऔरgit restore --source COMMIT .पूरी तरह अलग तरह से काम करते हैं
track, remote-tracking branch, untracked files
- Git track शब्द को तीन तरीकों से इस्तेमाल करता है
git statusकाUntracked files:उन files को दर्शाता है जिन्हें Git manage नहीं करता और जो commit में शामिल नहीं हैंorigin/mainजैसी remote-tracking branch एक local reference है जिसमें lastgit pullयाgit fetchके समय remoteoriginकेmainद्वारा point की गई commit ID होती है- “branch foo set up to track remote branch bar from origin” की तरह local branch को remote branch track करने के लिए configure किया जा सकता है
- यह कहना कि
mainremote को track करने वाली branch है और यह कहना किorigin/mainremote-tracking branch है, दोनों अलग बातें हैं mainअसली branch है, इसलिए इस पर commits बनाए और merge किए जा सकते हैं.git/configमें remotemainको track करने के लिए configure होने परgit pullऔरgit pushआसानी से इस्तेमाल किए जा सकते हैं
origin/main“remote-tracking branch” नाम होने के बावजूद normal branch नहीं है- इस पर सीधे commit नहीं किया जा सकता
- यह केवल
git pullयाgit fetchसे remote की latestmainstate लाते समय update होती है
checkout, reflog, merge/rebase/cherry-pick
git checkoutएक ही command में दो अलग काम रखता हैgit checkout BRANCHbranch switch करता हैgit checkout file.txtfile.txtके unstaged changes discard करता है
- इस confusion को कम करने के लिए Git ने functionality को
git switchऔरgit restoreमें बांटा, लेकिन पुरानाcheckoutअभी भी इस्तेमाल किया जा सकता है reflogreference log है, यानी reference ने past में किसे point किया था इसका record- reference एक broad term है जिसमें branch, tag और
HEADशामिल हैं - reflog बहुत खराब Git situations से निकलने में मदद कर सकता है, जैसे गलती से important branch delete हो जाना
- reference एक broad term है जिसमें branch, tag और
- merge, rebase, cherry-pick commits को combine करने के अलग-अलग तरीके हैं
- merge दो branches को जोड़ने वाला एक नया commit बनाता है
- rebase current branch के commits को target branch के ऊपर एक-एक करके copy करता है
- cherry-pick rebase जैसा है, लेकिन syntax अलग है और यह commits को current branch में copy करता है
git rebase --onto main otherbranch mybranchका इस्तेमालmybranchके कुछ commits हीmainके ऊपर ले जाने के लिए किया जा सकता है- example structure में जब केवल
F,Gकोmainपर rebase करना हो, तो इसका इस्तेमाल किया जा सकता है - इसमें तीन branch names आते हैं, इसलिए syntax याद रखना मुश्किल है
- example structure में जब केवल
commit और बाकी भ्रमित करने वाले शब्द
commitGit में verb और noun दोनों के रूप में इस्तेमाल होता है- verb: “बार-बार commit करो”
- noun:
mainका सबसे recent commit
- Git commit को तीन तरीकों से देखा जा सकता है
- सभी files की current state का snapshot
- parent commit के साथ diff
- पिछले सभी commits की history
- अलग-अलग commands commit को अलग तरह से handle करती हैं
git showcommit को diff की तरह handle करता हैgit logcommit को history की तरह handle करता हैgit restorecommit को snapshot की तरह handle करता है
blob,tree,origin,upstream,downstream,fetchऔरpullका संबंध,stash,worktree,subtree,submoduleभी भ्रमित करने वाली Git terminology में शामिल हैं- GitHub terminology में “pull request”, “squash and merge”, “rebase and merge” भ्रमित करने वाले examples माने जाते हैं
बार-बार लौटने वाले confusion के तीन axes
- खास तौर पर confusing Git terminology को तीन बातों में समेटा जा सकता है
headbranch है, औरHEADcurrent branch है- “remote tracking branch” और “branch that tracks a remote” अलग चीजें हैं
index,staged,cachedसभी एक ही target को point करते हैं
- 2012 का the most confusing git terminology भी बताता है कि Git terminology CVS और Subversion terminology से कैसे जुड़ती है
- Git terminology का confusion कुछ special features तक सीमित नहीं है, बल्कि core functionality में बार-बार दिखता है
- खासकर branches पर चर्चा करते समय “tracking” कई तरीकों से इस्तेमाल होता है, इसलिए पहली बार देखने पर फर्क पहचानना मुश्किल होता है
- कुछ explanations में Git के rare corners शामिल हैं, इसलिए गलती होने की संभावना का caveat बचा हुआ है
1 टिप्पणियां
Hacker News की राय
branch नाम,
HEAD, tag—ये सब pointer हैं।HEADउस commit की ओर इशारा करता है जिसे आप अभी देख रहे हैं, औरmy-featureजैसा branch नाम उस branch के सबसे नए commit की ओर इशारा करता है। अगरmainपर रहते हुएgit checkout -b my-featureकरें, तोmain,my-feature, औरHEADसभीmainके सबसे नए commit की ओर इशारा करेंगेmy-branchपर हर बार commit करने परHEADऔरmy-branchनए commit की ओर इशारा करने के लिए आगे बढ़ते हैं। detached HEAD का मतलब है किHEADजिस commit की ओर इशारा कर रहा है, उस commit की ओर कोई branch इशारा नहीं कर रही। tag और branch में फर्क यह है कि tag किसी खास commit की ओर इशारा करता है और हिलता नहींएक और चीज़ जो उलझाती थी, वह यह थी कि कई commands असंगत लगती हैं क्योंकि Git default arguments मानकर चलता है।
git checkout file.txtवही है जोgit checkout HEAD -- file.txt, और जब आपmy-branchपर हों तोgit rebase mainवही है जोgit rebase main my-branch। हालांकि बाद वाला रूप किसी दूसरी branch से भी चलाया जा सकता हैआखिर में, जब सब गड़बड़ा जाए, तो किसी भी अजीब हालत से बाहर निकलने में मदद करने वाली command
git reflogहै। यह वे सभी commits दिखाती है जिनकी ओरHEADने इशारा किया था। फिर भी अच्छा है कि Git इस उलझन को मान रहा है और कम चौंकाने वाले, ज्यादा सरल interface वाली commands बना रहा हैreflogपड़ाएक और बात जो Git इस्तेमाल करने वाले कई लोग अक्सर याद नहीं रखते: fetch किए गए remote के branch या tag refs भी सभी refs ही होते हैं, इसलिए जहाँ भी ref नाम इस्तेमाल किया जा सकता है, वहाँ इन्हें reference किया जा सकता है
उदाहरण के लिए, अगर आप कहना चाहें, “इस branch में जो भी हो फर्क नहीं पड़ता; fast-forward नहीं, merge नहीं, rebase नहीं; बस local branch को remote की सामग्री से overwrite कर दो,” तो ऐसे करें:
git checkout foo,git reset --hard origin/fooHEADpointer सीधे commit की ओर इशारा नहीं करता; आम तौर पर वहmy-branchजैसे branch pointer की ओर इशारा करता है, और वह branch pointer commit की ओर इशारा करता है। detached HEAD स्थिति इसका अपवाद हैmy-branchपर commit करते समयHEADऔरmy-branchदोनों नए commit पर नहीं जाते;HEADलगातारmy-branchpointer की ओर इशारा करता रहता है और सिर्फmy-branchनए commit की ओर इशारा करने के लिए आगे बढ़ता है। बेशक, अगरHEADका पीछा करते हुएmy-branchसे होकर commit तक जाएँ, तो आप नए commit तक पहुँचेंगेdetached HEAD वह स्थिति है जिसमें
HEAD, branch pointer के बजाय सीधे commit की ओर इशारा करता है। detached HEAD स्थिति में भीHEADऔर branch pointer दोनों सबसे नए commit की ओर इशारा कर सकते हैं।git log --decorateदेखने पर सामान्य(HEAD -> my-branch)के बजाय सबसे नए commit पर(HEAD, my-branch)जैसा दिखता हैदूसरी ओर annotated tags message, timestamp, SHA आदि रख सकते हैं। ये proper Git objects होते हैं और commit objects की तरह काफी व्यवहार करते हैं, लेकिन आम तौर पर फिर भी किसी दूसरे Git object, अक्सर commit, को reference करते हैं
git rev-parse HEADचलाकर उस string को किसी सुरक्षित जगह copy कर लेना भी अच्छा हैइससे यह भरोसा रहता है कि आपने आखिरी सही मानी गई स्थिति को ठीक-ठीक mark कर लिया है। आम तौर पर chaos में कुछ कदम अंदर के किसी point पर नहीं, बल्कि आखिरी सही स्थिति पर वापस जाया जा सकता है। बेशक, यह मानकर कि आपने
git gcयाgit filter-branchजैसी चीज़ें लापरवाही से नहीं चलाईंमज़ाक जैसा लगता है, लेकिन पूरी तरह मज़ाक नहीं: Git इस्तेमाल करने के लिए सचमुच computer science degree चाहिए, यह कहना गलत नहीं है। मैं सहमत हूँ कि Git के default arguments बहुत inconsistent user experience बनाते हैं
git checkout .,git reset --hard/soft,git cleanup—ये सब बेहद मिलते-जुलते दिखते हैं, लेकिन असल में बहुत अलग हैं। फिर भी Perforce या SVN की तुलना में मुझे अब भी Git पसंद है। पहले मुझे Mercurial थोड़ा ज़्यादा पसंद था, लेकिन पता नहीं आज भी ऐसा होगा या नहींgit reflogराजा है और सच दिखाता हैमुझे याद है मैंने Linus Torvalds का लिखा कुछ पढ़ा था कि उन्हें यह देखकर हैरानी हुई कि लोग उसके ऊपर कोई ज्यादा friendly layer डाले बिना सीधे Git इस्तेमाल करने लगे। अगर industry आत्म-मंथन कर पाती, तो वह मानती कि Git चुनना गलती थी और किसी दूसरे version control system पर चली जाती। ऐसे tool पर इतना समय बर्बाद न करें जिसका काम बस text store करना है
बेशक यह बेहतर हो सकता है। फिर भी Git को मिलने वाली नफरत हमेशा हैरान करती है। Git शानदार tool है, और non-developers के लिए बनाए गए Word या Google Docs जैसे tools से बहुत आगे है
शायद इसलिए कि मैं इतना उम्रदराज़ हूँ कि Subversion के king होने का दौर याद है
हर हफ्ते मैं colleagues को Git की वजह से उलझते देखता हूँ, online मदद माँगते posts देखता हूँ, और यहाँ की तरह ऐसे posts भी देखता हूँ जो उन चीज़ों को फिर समझाने की कोशिश करते हैं जिन्हें simple होना चाहिए
coding के दौरान SVN, TFVC, Perforce आदि में अपनी बनाई गड़बड़ी को undo करने में लोगों को घंटों बर्बाद करते हुए मुझे याद नहीं
tools ज़िंदगी आसान बनाने के लिए होते हैं। अगर वे ऐसा नहीं कर पाते, तो उन पर समय लगाना worth नहीं है
काश अभी भी ऐसी विविधता होती। Git monoculture का मतलब यह भी है कि जो भी Git को replace करना चाहता है, उसे पहले Git को फिर से implement करना पड़ेगा। इसलिए हम ASCII या Scroll Lock key की तरह Git से लगभग हमेशा के लिए बंध जाते हैं
मुख्य चिंता यह है कि GitHub इतना अच्छा है कि जब तक GitHub Git को text management engine से अलग नहीं करता और दूसरे engines की अनुमति नहीं देता, हम Git से बंधे रहेंगे
https://trolololo.xyz/github
https://news.ycombinator.com/item?id=38098109
ये leaky abstraction जैसे शब्द हैं
cacheकहा था, और वह सबसे computer-science वाला शब्द थाबाद में लगता है Junio ने इसे distributed version control system के लिए ज़्यादा specific
indexमें बदल दिया, और अधिकतर users इसे staging area कहते थे। अब इस शब्द का विकास Git UI और internals में fossil की तरह बचा हुआ हैpullकर देता हूँorigin/masterका मतलब origin पर मौजूद master नहीं है, बल्कि वह commit है जिस पर आख़िरी बार ज्ञातorigin/masterpoint कर रहा था। यह valuefetchकरने पर update होती है, औरpullअपने-आपfetchकरता हैls -l .git/refs/remotes/origin/masterदेखने पर पता चलेगा किorigin/masterमेरे system में बस एक file है। यह कब बदली, वह भी देखा जा सकता है। यह जादू की तरह update नहीं होतीजब आप
git fetch originकरते हैं और बदलाव होते हैं, तो timestamp और contents बदल जाते हैं।cat .git/refs/remotes/origin/masterसे इसे देख सकते हैंGit की बुनियाद बहुत सरल है, इतनी कि core data structures और कुछ operations एक दिन में implement किए जा सकते हैं। यह जानना सचमुच क़ीमती है। पता नहीं कैसे Git ने काफ़ी सरल core के ऊपर बेहद जटिल user interface बना दिया
masterbranch हटा देता हूँ। आम तौर परmasterपर push नहीं कर सकता, या वैसे भीmasterपर सीधे काम नहीं करना चाहता। तो local में बदलाव-योग्यmasterbranch रखने की कोई वजह नहीं हैइसलिए केवल
origin/masterupdate करना होता है, और उसके लिएfetchकाफ़ी हैgit fetch && git pull3 साल बाद retire होकर इस टूटे-फूटे कचरे से हाथ धो लेने के दिन का इंतज़ार कर रहा हूँ
git statusoutput parse करता है, और--porcelainflag लगाने से सच में मदद मिली। यह ज़्यादा concise और programmatically parse करने में आसान output देता हैयह जानने की curiosity हुई कि कितनी commands में ज़्यादा machine-readable output होता है, और इसी से git-scm के “Git Internals - Plumbing and Porcelain” page तक पहुँच गया। संक्षेप में, Git शुरुआत से ही एक polished version control system के बजाय version control संभालने वाले tools के set की तरह लिखा गया था
शुरुआत से Git इस्तेमाल करने वाले कई लोगों ने इन्हीं low-level commands से version control tasks सीखे, और उन workflows को दूसरों तक भी फैलाया। यही plumbing layer है। बाद में Git ने एक ज़्यादा refined layer बनाई और उसे porcelain कहा
अभी मुझे पूरी तरह नहीं पता कि कौन-सी command किस layer में आती है, लेकिन इससे हाल के वर्षों में recommend किए जाने वाले नए workflows को समझने में मदद मिली है। अपना workflow बदलते समय भी बेहतर judgment कर पाता हूँ
https://git-scm.com/book/en/v2/Git-Internals-Plumbing-and-Po...
अफ़सोस, इसे तेज़ बनाने के लिए उस UI को hardcode कर दिया गया, लेकिन improve नहीं किया गया
पीछे मुड़कर देखूँ तो शुरुआत करते समय यह बेहद confusing रहा होगा, लेकिन शायद cool दिखने के लिए मैंने ऐसा जताया कि नहीं है
https://news.ycombinator.com/item?id=28143078
“Your branch is up to date with ‘origin/main’” असल में थोड़ा misleading है। इसे ऐसे समझा जा सकता है कि
mainbranch latest है, लेकिन असल में ऐसा नहीं हैहालांकि यहां बहुत ज़्यादा “technically speaking” जोड़ने की ज़रूरत नहीं है। क्या Two Generals Problem लागू नहीं होता? अगर सच में बहुत बारीकी से देखें, तो इसी पल यह “latest” है या नहीं, पता नहीं लगाया जा सकता।
statusसे पहलेfetchकरने पर भी यही बात हैतो फिर reasonable expectation क्या होनी चाहिए? बस इतना कि मेरे computer के object database में मौजूद ref, पिछली बार check करने पर दूर कहीं मौजूद दूसरे object database के ref के बराबर था
एक simple
statuscall networkfetchनहीं कर सकती, न ही हर बार उस tool के basic principles याद दिला सकती है जिसे आप इस्तेमाल कर रहे हैं। निजी तौर पर मेरा यही मानना है। लेकिन हैरानी की बात है कि StackOverflow answer के कई comments को लगता है कि ये दोनों चीज़ें ज़रूरी हैं“is up to date with the origin’s main as of your last fetch 5 days ago” जैसा wording थोड़ा ज़्यादा reasonable है। क्योंकि यह सिर्फ़ यह बताता है कि आख़िरी बार
fetchकिए कितना समय हो गया है[1] https://stackoverflow.com/questions/27828404/why-does-git-st...
एक और बात: मुझे लगता था कि
ORIG_HEAD,FETCH_HEADकी तरह “origin के head” से जुड़ा है। लेकिन ऐसा नहीं था। यह “pseudoref” rebase जैसे अधिक complex rewrite से पहले save point के तौर पर इस्तेमाल होता लगता है, और reflog आने से पहले implement किया गया था। शायद इसका मतलब “original head” है“Your branch is up to date with ‘origin/main’” technically सही है, लेकिन up to date expression को casually पढ़ने पर यह दो बातें imply करता है।
main,origin/mainजैसा है, औरorigin/mainभी latest है—यानी command के दौरान update हुआ है या automatically latest रखा जाता है और हाल की sync सफल रही हैयह कोई machine-readable signal नहीं है जिसे CPU के एक cycle तक true होना चाहिए, बल्कि user को दिखने वाला status message है। Network theory तक जाए बिना भी ऐसी interpretation reasonable है
“Up to date” का मतलब space के बजाय time में catch up करना ज़्यादा लगता है। Local branch position “यह branch किसे point कर रही है” वाले space जैसी है, और remote ref state “मैंने remote ref को आख़िरी बार कब update किया” वाले time जैसी है। बेशक यह बहुत subjective है और दोनों अर्थ दोनों तरफ़ हो सकते हैं
बेहतर wording “Your branch matches origin/main”, “Your branch’s head is the same as origin/main”, “Your branch is pointing to the same commit as origin/main” जैसी हो सकती है। यह clarity और verbosity के बीच compromise है। इसमें लेखक के सुझाव की तरह “remote ref last updated 5 days ago” को parentheses में भी जोड़ा जा सकता है
statuscall का networkfetchकरना परेशान करने वाला है। मेरे हिसाब से network operations explicit होने चाहिए, implicit नहीं। जब मैंgit statusचलाता हूं, तो मुझे file system में मौजूद अपने repository की स्थिति जाननी होती हैअगर मुझे जानना है कि किसी दूसरे remote पर क्या हो रहा है, तो मैं खुद
fetchकरके compare कर सकता हूंstatuscommand शुरू किए जाने के समय के आधार पर latest जानकारी मिले। जानकारी terminal में print होने के दौरान race condition हो सकती है, लेकिन वह बहुत छोटी time window हैआम तौर पर इसका मतलब है कि आप
fetchचाहते हैं। Two Generals Problem सिर्फ़ remote side पर लागू होती है। अगर remote को यह confirmation नहीं मिलता कि client ने data receive कर लिया है, तो वह कुछ समय तक retransmit करता रह सकता है। वह client की problem नहीं हैअगर client को server से data नहीं मिलता, तो सही behavior शायद रुकना और timeout के बाद error print करना होगा; मौजूदा
fetchशायद ऐसा ही करता हैयह tool अक्सर share किया जाता है और यहां भी अच्छी तरह फिट बैठता है। यह Git के internal model और कई commands के effects को visualize करता है
https://learngitbranching.js.org/
इस tool को 10 मिनट इस्तेमाल करके मैंने जितना सीखा, वह उससे पहले के करीब 10 साल के Git experience से ज़्यादा था। Strongly recommend करता हूं
“pull” वह action है जिसमें remote changes को local repository में merge किया जाता है। User असल में जो request करता है, वह यह है कि server उसके remote changes को किसी branch में merge करे। GitLab का “merge request” सही expression है
मैंने देखा है कि किसी ने
fetchकिया और commits गायब हो गए। Repository समय में पीछे चली गई थी, इसलिए वे छिप गए थे। Git ऐसी details कोstatusमें छिपा देता है, और अगर आपgit-promptयाpowerline-shellइस्तेमाल नहीं करते, तो आप अंधेरे में काम कर रहे हैंgit-request-pull(1)में बचा हुआ original idea यह था कि हम सबके अपने-अपने Git repositories kernel.org/git या redhat.com/git जैसी जगहों पर हों, और हम email से एक-दूसरे से अलग servers, organizations, domains में मौजूद repositories से pull करने का अनुरोध करेंGitHub ने Git के
request-pullcommand से inspiration लिया, लेकिन उसे एक GitHub repository से दूसरे GitHub repository में merge करने के रूप में reinterpret कियाकम से कम मैंने हमेशा इसे ऐसे ही पढ़ा है
सार यह है कि यह server से की गई request नहीं, बल्कि किसी दूसरे व्यक्ति से की गई request है। जिस change से आप project में contribute करना चाहते हैं उसे देखने के लिए, आप सामने वाले से अपनी branch pull करने का अनुरोध करते हैं
[0] https://git-scm.com/book/en/v2/Distributed-Git-Contributing-...