गिट शाखा, कांटा, भ्रूण, मर्ज, रिबेस और क्लोन के बीच अंतर क्या हैं?


502

मैं एक शाखा, कांटा और गिट में एक क्लोन के बीच अंतर को समझना चाहता हूं?

इसी तरह, इसका क्या मतलब है जब मैं एक के git fetchरूप में एक विरोध करता हूंgit pull ?

इसके अलावा, की rebaseतुलना में क्या मतलब हैmerge ?

मैं अपने आप को एक साथ स्क्वैश कैसे कर सकता हूं?

उनका उपयोग कैसे किया जाता है, उनका उपयोग क्यों किया जाता है और वे क्या प्रतिनिधित्व करते हैं?

GitHub में कैसे आकृति है?


19
क्या आप माइकल डुरंट का उत्तर होने के लिए स्वीकृत उत्तर को बदल सकते हैं?
siride

11
वह निश्चित रूप से कर सकता है , लेकिन यह उसकी पसंद होना चाहिए, और स्पष्ट रूप से यहां पहुंचने वाले अधिकांश लोग (मेरे जैसे) कुछ और संक्षिप्त चाहते हैं, बिल्कुल उसी तरह जैसे वह उत्तर जिसे उसने चुना था, जो इस समय अपने आप से एक था =)
user1271772

जवाबों:


366

एक क्लोन बस एक रिपॉजिटरी की एक प्रति है। सतह पर, इसका परिणाम इसके बराबर हैsvn checkout , जहां आप कुछ अन्य रिपॉजिटरी से स्रोत कोड डाउनलोड करते हैं। Git जैसे Subversion और DVCS जैसे केंद्रीकृत VCS के बीच अंतर यह है कि Git में, जब आप क्लोन करते हैं, तो आप वास्तव में पूरे स्रोत रिपॉजिटरी की नकल कर रहे हैं, जिसमें सभी इतिहास और शाखाएं शामिल हैं। अब आपके पास अपनी मशीन पर एक नया रिपॉजिटरी है और आपके द्वारा किए गए किसी भी काम को उस रिपॉजिटरी में जाना है। जब तक आप उन अन्य रिपॉजिटरी (या मूल एक) को धक्का नहीं देते हैं या जब तक कोई व्यक्ति आपकी रिपॉजिटरी से कमिट नहीं करता है, जब तक यह सार्वजनिक रूप से सुलभ न हो, तब तक किसी को कोई बदलाव नहीं दिखेगा।

एक शाखा कुछ है जो एक भंडार के भीतर है। वैचारिक रूप से, यह विकास के एक सूत्र का प्रतिनिधित्व करता है। आपके पास आमतौर पर एक मास्टर शाखा होती है, लेकिन आपके पास एक शाखा भी हो सकती है, जहाँ आप कुछ फीचर xyz पर काम कर रहे हैं, और दूसरा बग फिक्स करने के लिए। जब आप एक शाखा की जाँच कर चुके होते हैं, तो आपके द्वारा किया गया कोई भी कमेंट उस शाखा पर बना रहेगा और अन्य शाखाओं के साथ तब तक साझा नहीं किया जाएगा जब तक कि आप उन्हें शाखा में विलय नहीं कर देते हैं या उन्हें विचाराधीन नहीं रखते हैं। बेशक, यह थोड़ा अजीब लगता है जब यह शाखाओं की बात आती है जब तक आप अंतर्निहित मॉडल को नहीं देखते कि शाखाएं कैसे लागू की जाती हैं। इसे स्वयं समझाने के बजाय (मैंने पहले ही बहुत कुछ कह दिया है, मेथिंक), मैं "कंप्यूटर साइंस" से लिंक करूँगा कि कैसे Git मॉडल ब्रांच और कमिट, Git वेबसाइट से लिया गया है:

http://eagain.net/articles/git-for-computer-scientists/

एक कांटा वास्तव में एक Git अवधारणा नहीं है, यह एक राजनीतिक / सामाजिक विचार है। यही है, अगर कुछ लोग जिस तरह से किसी परियोजना से गुजर रहे हैं, उससे खुश नहीं हैं, तो वे स्रोत कोड ले सकते हैं और उस पर काम कर सकते हैं जो मूल डेवलपर्स से अलग है। यह एक कांटा माना जाएगा। Git आसान बनाता है क्योंकि सभी के पास पहले से ही स्रोत कोड की अपनी "मास्टर" प्रति है, इसलिए यह मूल परियोजना डेवलपर्स के साथ संबंधों को काटने के रूप में सरल है और आपको एक साझा भंडार से इतिहास के निर्यात की आवश्यकता नहीं है जैसे कि आपको SVN के साथ करना पड़ सकता है। ।

EDIT: चूंकि मुझे "कांटा" की आधुनिक परिभाषा के बारे में पता नहीं था, जैसे कि GitHub जैसी साइटों द्वारा उपयोग किया जाता है, कृपया टिप्पणियों पर एक नज़र डालें और अधिक जानकारी के लिए मेरा नीचे दिए गए माइकल ड्यूरेंट के जवाब पर भी ध्यान दें ।


125
एक कांटा जरूरी नहीं है कि डेवलपर मुख्य रेपो से खुश नहीं है। आमतौर पर, इसका मतलब है कि किसी अन्य डेवलपर ने पढ़ा है, लेकिन लिखना नहीं है, उस रेपो तक पहुंच है। डेवलपर रेपो को कांटा कर सकता है, बदलाव कर सकता है लेकिन चूंकि वह मुख्य रेपो को नहीं लिख सकता है इसलिए उसे एक पैच के रूप में अपने परिवर्तनों को प्रस्तुत करना होगा। तो, लेखन पहुंच प्रदान किए बिना सहयोग को प्रोत्साहित करने के लिए फोर्किंग भी एक साधन है।
brycemcd

5
मुझे लगता है कि यह सच है। मैंने केवल "कांटा" देखा है जो किसी प्रोजेक्ट के नए, संभावित प्रतिस्पर्धी संस्करण बनाने के संदर्भ में उपयोग किया जाता है।
सिराइड

32
आप कह सकते हैं कि एक कांटा एक शाखा है जिसे ऊपर की ओर मर्ज किए जाने की उम्मीद नहीं है
मस्कॉन

6
गिट हब का उपयोग "कांटा" के रूप में कांटा है। यह एक नया भंडार है, जो गितुब पर संग्रहीत है, मूल से अलग है। हालांकि, जीथब भी पुल अनुरोधों को लागू करने के लिए बहुत सरल बनाता है। मूल अनुरोधों को मूल रिपॉजिटरी के मालिक को मूल रूप से रेपो के अपने कांटे से परिवर्तनों को "खींचने" के लिए कहें। इस तरह, हर कोई स्रोत नियंत्रण का उपयोग कर सकता है और उनके सहित सभी परिवर्तनों का इतिहास है, लेकिन सभी को मूल रेपो तक लिखने की आवश्यकता नहीं है।
mklauber

4
मैंने अपना जवाब अपडेट किया है लोगों को बताने के लिए कि माइकल डुरंट के जवाब को जीथब के मॉडल पर अधिक देखें।

531

Git

इस जवाब में GitHub शामिल है क्योंकि कई लोगों ने उस बारे में भी पूछा है।

स्थानीय रिपोजिटरी

Git (स्थानीय रूप से) की एक निर्देशिका है (.git ) है, जिसे आप अपनी फ़ाइलों के लिए प्रतिबद्ध करते हैं और यह आपकी 'स्थानीय रिपॉजिटरी' है। यह एसवीएन जैसी प्रणालियों से अलग है जहां आप दूरस्थ रिपॉजिटरी में तुरंत जोड़ते और प्रतिबद्ध करते हैं।

Git एक फ़ाइल के प्रत्येक संस्करण को संग्रहीत करता है जो पूरी फ़ाइल को सहेजकर बदलता है। यह इस संबंध में SVN से भी अलग है क्योंकि आप डेल्टा परिवर्तनों के माध्यम से इसे 'पुनः बनाए' बिना किसी भी व्यक्तिगत संस्करण पर जा सकते हैं।

Git सभी फाइलों को 'लॉक' नहीं करता है और इस तरह एडिट के लिए 'एक्सक्लूसिव लॉक' की कार्यक्षमता से बचता है (पुराने सिस्टम जैसे pvcs दिमाग में आते हैं), इसलिए सभी फाइल्स को हमेशा ऑफ-लाइन रहते हुए भी एडिट किया जा सकता है। यह वास्तव में विलय (या एक ही फ़ाइल के भीतर!) फाइल को एक अद्भुत काम करता है, जो कि GitHub जैसे दूरस्थ रिपॉजिटरी में खींचने या लाने के दौरान एक साथ होता है। केवल आपको मैन्युअल परिवर्तन करने की आवश्यकता है (वास्तव में एक फ़ाइल को संपादित करना) यदि दो बदलावों में कोड की एक ही पंक्ति (यों) शामिल होती है।


शाखाओं

शाखाएँ आपको मुख्य कोड ('मास्टर' शाखा) को संरक्षित करने, कॉपी (नई शाखा) बनाने और फिर इस नई शाखा में काम करने की अनुमति देती हैं। यदि कार्य में कुछ समय लगता है या मास्टर को बहुत अपडेट मिलते हैं, तो ब्रांच को मर्ज या रिबासिंग (अक्सर बेहतर इतिहास के लिए पसंद किया जाता है और संघर्षों को हल करने में आसान) के लिए मास्टर ब्रांच के खिलाफ किया जाना चाहिए। जब आप काम पूरा कर लेते हैं, तो आप मास्टर रिपॉजिटरी में वापस शाखा में किए गए परिवर्तनों को मर्ज कर देते हैं। कई संगठन प्रत्येक कार्य के लिए शाखाओं का उपयोग करते हैं चाहे वह एक सुविधा, बग या कोर आइटम हो। अन्य संगठन केवल बड़े बदलाव के लिए शाखाओं का उपयोग करते हैं जैसे कि संस्करण उन्नयन।

कांटा: एक शाखा के साथ आप शाखा को नियंत्रित और प्रबंधित करते हैं, जबकि एक कांटा के साथ कोई अन्य व्यक्ति कोड को वापस स्वीकार करने को नियंत्रित करता है।

मोटे तौर पर, शाखाओं को करने के दो मुख्य दृष्टिकोण हैं। पहला यह है कि मास्टर ब्रांच में ज्यादातर बदलाव होते रहें, केवल बड़े और लंबे समय तक चलने वाली चीजों के लिए शाखाओं का उपयोग करना, जैसे कि आप विभिन्न जरूरतों के लिए दो ब्रांच उपलब्ध कराना चाहते हैं। दूसरा, जिससे आप मूल रूप से हर सुविधा के अनुरोध, बग फिक्स या कोर के लिए एक शाखा बनाते हैं और फिर मैन्युअल रूप से निर्णय लेते हैं कि वास्तव में उन शाखाओं को मुख्य मास्टर शाखा में कैसे मिलाएं। यद्यपि यह थकाऊ लगता है, यह एक सामान्य दृष्टिकोण है और वह है जो मैं वर्तमान में उपयोग करता हूं और सिफारिश करता हूं क्योंकि यह मास्टर शाखा क्लीनर रखता है और यह मास्टर है जिसे हम उत्पादन को बढ़ावा देते हैं, इसलिए हम केवल पूर्ण, परीक्षण किए गए कोड, रिबासिंग के माध्यम से और चाहते हैं शाखाओं का विलय।

'करने के लिए' में एक शाखा लाने के लिए मानक तरीका है merge। इतिहास को साफ़ करने के लिए शाखाएँ "विद्रोह" भी हो सकती हैं। यह वर्तमान स्थिति को प्रभावित नहीं करता है और एक 'क्लीनर' इतिहास देने के लिए किया जाता है।

मूल रूप से, विचार यह है कि आप एक निश्चित बिंदु (आमतौर पर मास्टर से) पर आधारित हैं। जब से आप शाखबद्ध हुए हैं, तब से 'गुरु' स्वयं उस शाखा बिंदु से आगे बढ़ गया है। यह 'क्लीनर' होगा (मुद्दों को हल करना आसान होगा और इतिहास को समझना आसान होगा) यदि आपने किसी शाखा में किए गए सभी परिवर्तनों को मास्टर की वर्तमान स्थिति के खिलाफ खेला है तो इसके सभी नवीनतम बदलाव होंगे। तो, प्रक्रिया है: परिवर्तन सहेजें; 'नया' मास्टर प्राप्त करें, और फिर पुन: लागू करें (यह रिबास भाग है) फिर से उस के खिलाफ परिवर्तन। यह जान लें कि मर्ज की तरह ही रिबास, संघर्ष का परिणाम हो सकता है जिसे आपको मैन्युअल रूप से हल करना होगा (यानी संपादित करें और ठीक करें)।

नोट करने के लिए एक दिशानिर्देश:
केवल यदि शाखा स्थानीय है और आपने इसे अभी तक रिमोट पर नहीं धकेला है तो रिबेट करें!
यह मुख्य रूप से है क्योंकि रिबासिंग उस इतिहास को बदल सकता है जो अन्य लोग देखते हैं जिसमें अपने स्वयं के शामिल हो सकते हैं।

ट्रैकिंग शाखाएँ

ये वे शाखाएँ हैं जिन्हें नाम दिया गया है origin/branch_name(जैसा कि सिर्फ विरोध किया जाता है branch_name)। जब आप दूरस्थ रिपॉजिटरी से कोड को / पर धकेल रहे हैं और खींच रहे हैं तो यह वास्तव में वह तंत्र है जिसके माध्यम से ऐसा होता है। उदाहरण के लिए, जब आप git pushएक शाखा को बुलाते हैं building_groups, तो आपकी शाखा पहले origin/building_groupsऔर उसके बाद दूरस्थ रिपॉजिटरी में जाती है। इसी तरह, यदि आप एक करते हैं, तो git fetch building_groupsपुनर्प्राप्त की गई फ़ाइल को आपकी origin/building_groupsशाखा में रखा गया है । फिर आप इस शाखा को अपनी स्थानीय प्रति में मिलाना चुन सकते हैं। हमारा अभ्यास हमेशा एक git fetchऔर एक मैनुअल मर्ज करने की बजाय सिर्फ एक है git pull(जो एक चरण में उपरोक्त दोनों करता है)।

नई शाखाएँ लाना।

नई शाखाएँ प्राप्त करना: एक क्लोन के प्रारंभिक बिंदु पर आपके पास सभी शाखाएँ होंगी। हालाँकि, यदि अन्य डेवलपर्स शाखाएँ जोड़ते हैं और उन्हें दूरस्थ में धकेल देते हैं, तो उन शाखाओं और उनके नामों के बारे में 'पता' करने का एक तरीका होना चाहिए ताकि वे स्थानीय स्तर पर उन्हें खींच सकें। यह एक ऐसा तरीका है git fetchजिसके माध्यम से सभी नई और बदली हुई शाखाओं को ट्रैकिंग शाखाओं (जैसे, origin/) का उपयोग करके स्थानीय रूप से रिपॉजिटरी में प्राप्त किया जाएगा । एक बार fetchएड, कोई git branch --remoteट्रैकिंग शाखाओं को सूचीबद्ध करने और git checkout [branch]वास्तव में किसी दिए गए पर स्विच करने के लिए कर सकता है।

विलय

विलय करना विभिन्न शाखाओं से या एक ही शाखा के विभिन्न संस्करणों से कोड परिवर्तन की प्रक्रिया है (उदाहरण के लिए जब एक स्थानीय शाखा और रिमोट सिंक से बाहर हैं)। यदि किसी ने शाखा में काम विकसित किया है और काम पूरा हो गया है, तैयार और परीक्षण किया गया है, तो उसे masterशाखा में विलय किया जा सकता है । यह तब शाखा में जाने के git checkout masterलिए किया जाता है । मर्ज सभी अलग-अलग फ़ाइलों और यहां तक ​​कि अलग-अलग फ़ाइलों को एक साथ फ़ाइलों में लाएगा । इसका मतलब है कि यह वास्तव में सभी परिवर्तनों को मर्ज करने के लिए फ़ाइलों के अंदर कोड को बदल देगा।mastergit merge your_branch

ऐसा करके जब checkoutसे masterयह भी एक ऐसा करने के लिए अनुशंसा की जाती है git pull origin masterदूरदराज के गुरु के बहुत नवीनतम संस्करण प्राप्त करने के लिए अपने स्थानीय गुरु में विलय कर दिया। यदि दूरस्थ मास्टर बदल गया है, अर्थात moved forward, आपको वह जानकारी दिखाई देगी जो उस दौरान दिखाई देती है git pull। यदि ऐसा है (मास्टर बदला हुआ) तो आपको सलाह दी जाती है git checkout your_branchऔर फिर rebaseइसे मास्टर करने के लिए ताकि आपके परिवर्तनों को वास्तव में 'नए' मास्टर के शीर्ष पर 'पुनःप्ले' किया जा सके। फिर आप अगले पैराग्राफ में दिखाए गए अनुसार मास्टर अप-टू-डेट प्राप्त करना जारी रखेंगे।

यदि कोई टकराव नहीं हैं, तो मास्टर में नए बदलाव जोड़े जाएंगे। यदि संघर्ष होते हैं, तो इसका मतलब है कि समान फ़ाइलों में कोड की समान लाइनों के आसपास परिवर्तन होते हैं जो स्वचालित रूप से विलय नहीं कर सकते। इस मामले git merge new_branchमें रिपोर्ट करेगा कि हल करने के लिए संघर्ष (ओं) हैं। आप फ़ाइलों को संपादित करके (जो उन दोनों में परिवर्तन होंगे) आप उन्हें हल करते हैं, आप जो बदलाव चाहते हैं उनका चयन करते हुए, आप जो बदलाव नहीं चाहते हैं उनकी पंक्तियों को हटाकर और फिर फ़ाइल को सहेज कर रख सकते हैं। परिवर्तनों को चिह्नित किया जाता है जैसे विभाजक ========और <<<<<<<<

एक बार जब आप कोई विरोध आप एक बार फिर से समाधान कर लिया है git addऔर git commitउन परिवर्तनों को मर्ज जारी रखने के लिए (आप आपका मार्गदर्शन करने के लिए इस प्रक्रिया के दौरान Git से प्रतिक्रिया मिल जाएगा)।

जब प्रक्रिया अच्छी तरह से काम नहीं करती है तो आप पाएंगे कि git merge --abortचीजों को रीसेट करना बहुत आसान है।

इंटरएक्टिव रिबासिंग और स्क्वैशिंग / रीऑर्डरिंग / रिमूविंग कमिट्स

यदि आपने बहुत से छोटे चरणों में काम किया है, उदाहरण के लिए, आप हर दिन 'वर्क-इन-प्रोग्रेस' के रूप में कोड बनाते हैं, तो आप उन कई छोटे-छोटे कामों को 'स्क्वैश' करना चाहते हैं। यह विशेष रूप से उपयोगी हो सकता है जब आप सहकर्मियों के साथ कोड समीक्षा करना चाहते हैं। आप अपने द्वारा किए गए सभी 'चरणों' को फिर से खेलना नहीं चाहते (कमिट के माध्यम से), आप केवल यह कहना चाहते हैं कि इस कार्य के लिए मेरे सभी परिवर्तनों का एक प्रभाव में अंतिम प्रभाव (विस्‍तार) है।

यह करने के लिए कि क्या यह करने के लिए कि क्या एक ही फ़ाइल या फ़ाइलों को एक से अधिक बार (उस मामले में स्क्वैश करने के लिए बेहतर है) के विरुद्ध है या नहीं, का मूल्यांकन करने के लिए महत्वपूर्ण कारक। यह इंटरेक्टिव रिबासिंग टूल के साथ किया जाता है। यह उपकरण आपको स्क्वैश करने, कमिट्स हटाने, संदेशों को पुन: प्रकाशित करने आदि की अनुमति देता है। उदाहरण के लिए, git rebase -i HEAD~10( नोट: यह एक ~नहीं है- ) निम्नलिखित को लाता है:

Git में इंटरएक्टिव रिबासिंग

हालांकि सावधान रहें और इस उपकरण का उपयोग करें 'अदरक'। एक बार में एक स्क्वैश / डिलीट / रीऑर्डर करें, उस कमिट से बाहर निकलें और सेव करें, फिर टूल को रीटर करें। यदि कमिट्स सन्निहित नहीं हैं, तो आप उन्हें पुनः व्यवस्थित कर सकते हैं (और फिर आवश्यकतानुसार स्क्वैश कर सकते हैं)। आप वास्तव में यहां भी कमिट्स हटा सकते हैं, लेकिन आपको वास्तव में यह सुनिश्चित करने की आवश्यकता है कि जब आप ऐसा करते हैं तो आप क्या कर रहे हैं!

फोर्क्स

गिट रिपॉजिटरी में सहयोग के लिए दो मुख्य दृष्टिकोण हैं। सबसे पहले, ऊपर विस्तृत, सीधे शाखाओं के माध्यम से होता है जिसे लोग खींचते हैं और / से धक्का देते हैं। इन सहयोगियों के पास दूरस्थ रिपॉजिटरी के साथ पंजीकृत एसएसएच कुंजी है। यह उन्हें सीधे उस भंडार में धकेल देगा। नकारात्मक पक्ष यह है कि आपको उपयोगकर्ताओं की सूची को बनाए रखना होगा। अन्य दृष्टिकोण - फोर्किंग - किसी को भी रिपॉजिटरी को 'कांटा' करने की अनुमति देता है, जो मूल रूप से अपने स्वयं के गिट रिपॉजिटरी खाते में एक स्थानीय प्रतिलिपि बनाता है। वे तब परिवर्तन कर सकते हैं और जब एक 'पुल अनुरोध' भेजते हैं (वास्तव में यह उनसे अधिक 'पुश' और वास्तविक रिपॉजिटरी मेंटेनर के लिए एक 'पुल' अनुरोध) स्वीकार किए जाते हैं।

यह दूसरी विधि, कांटे का उपयोग करते हुए, किसी को भंडार के लिए उपयोगकर्ताओं की सूची को बनाए रखने की आवश्यकता नहीं होती है।


GitHub

GitHub (एक रिमोट रिपॉजिटरी) एक दूरस्थ स्रोत है जिसे आप सामान्य रूप से उन प्रतिबद्ध परिवर्तनों को धक्का देते हैं और खींचते हैं यदि आपके पास ऐसा रिपॉजिटरी है (या जोड़ा जाता है), तो स्थानीय और रिमोट वास्तव में काफी अलग हैं। दूरस्थ रिपॉजिटरी के बारे में सोचने का एक और तरीका यह है कि यह एक .gitनिर्देशिका संरचना है जो दूरस्थ सर्वर पर रहती है।

जब आप 'fork' - GitHub वेब ब्राउज़र GUI में आप इस बटन पर क्लिक कर सकते हैं कांटा बटन की छवि- आप अपने GitHub खाते में कोड की एक प्रति ('क्लोन') बनाएँ । आप इसे करते समय पहली बार थोड़ा सूक्ष्म हो सकते हैं, इसलिए सुनिश्चित करें कि आप देखते हैं कि किसका भंडार कोड के नीचे सूचीबद्ध है - या तो मूल स्वामी या 'से कांटा' और आप, जैसे, इस तरह:

काँटेदार भंडार के नाम की छवि

एक बार जब आपके पास स्थानीय प्रति हो जाती है, तो आप अपनी इच्छानुसार परिवर्तन कर सकते हैं (स्थानीय मशीन से खींचकर और धक्का देकर)। जब आप संपन्न हो जाते हैं, तब आप मूल रिपॉजिटरी मालिक / व्यवस्थापक को एक 'पुल अनुरोध' प्रस्तुत करते हैं (फैंसी लगता है लेकिन वास्तव में आप बस इस पर क्लिक करते हैं पुल अनुरोध बटन की छवि:) और वे इसे 'पुल' करते हैं।

एक साथ कोड पर काम करने वाली टीम के लिए अधिक सामान्य है रिपॉजिटरी को 'क्लोन' करना (रिपॉजिटरी की मुख्य स्क्रीन पर 'कॉपी' आइकन पर क्लिक करना)। फिर, स्थानीय रूप से टाइप करें git cloneऔर पेस्ट करें। यह आपको स्थानीय रूप से सेट करेगा और आप GitHub स्थान पर (साझा) पुश और पुश भी कर सकते हैं।

क्लोन

जैसा कि GitHub पर अनुभाग में दिखाया गया है, एक क्लोन एक रिपॉजिटरी की एक प्रति है। जब आपके पास एक दूरस्थ रिपॉजिटरी होती है तो आप git cloneउसके URL के खिलाफ कमांड जारी करते हैं और आप रिपॉजिटरी की एक स्थानीय प्रति या क्लोन के साथ समाप्त हो जाते हैं। इस क्लोन में सब कुछ है , फाइल, मास्टर ब्रांच, अन्य ब्रांच, सभी मौजूदा कमेटी, पूरा शेबंग। यह क्लोन है कि आप अपने जोड़ते हैं और इसके खिलाफ काम करते हैं और फिर दूरस्थ रिपॉजिटरी ही है जो आप उन कमिटों को धक्का देते हैं। यह स्थानीय / दूरस्थ अवधारणा है जो Git (और मर्क्यूरियल के समान सिस्टम) को DVCS ( डिस्ट्रीब्यूटेड वर्जन कंट्रोल सिस्टम) के रूप में अधिक परंपरागत CVS (कोड वर्जन सिस्टम) जैसे SVN, PVCS, CVS इत्यादि के विपरीत बनाती है। आप दूरस्थ रिपॉजिटरी के लिए सीधे प्रतिबद्ध हैं।

दृश्य

मुख्य अवधारणाओं का दृश्य
http://marklodato.github.com/visual-git-guide/index-en.html और http://ndpsoftware.com/git-cheatsheet.html#loc=index पर देखा जा सकता है

यदि आप चाहते हैं कि परिवर्तन कैसे काम कर रहे हैं, तो आप दृश्य उपकरण gitg( gitxmacOS के लिए) को GUI के साथ हरा नहीं सकते हैं, जिसे मैं 'सबवे मैप' (esp। लंदन अंडरग्राउंड) कहता हूं, जो दिखाने के लिए महान है कि क्या किया। कैसे चीजें बदलती हैं, विचलन और विलय, आदि।

आप अपने परिवर्तनों को जोड़ने, प्रतिबद्ध करने और प्रबंधित करने के लिए भी इसका उपयोग कर सकते हैं!

Gitg / gitx इंटरफ़ेस की छवि

हालांकि gitg / gitx काफी न्यूनतम है, GUI टूल की संख्या का विस्तार जारी है। कई मैक उपयोगकर्ता भाई के कांटे का उपयोग gitx के लिए करते हैं और लिनक्स के लिए, एक बढ़िया विकल्प स्मार्ट-गिट है जो एक सहज ज्ञान युक्त शक्ति प्रदान करता है:

स्मार्ट-गिट GUI की छवि

ध्यान दें कि GUI टूल के साथ भी, आप संभवतः कमांड लाइन पर बहुत सारी कमांड करेंगे।

इसके लिए, मेरी ~/.bash_aliasesफ़ाइल में निम्नलिखित उपनाम हैं (जो ~/.bashrcप्रत्येक टर्मिनल सत्र के लिए मेरी फ़ाइल से कहा जाता है ):

# git
alias g='git status'
alias gcob='git checkout -b '
alias gcom='git checkout master'
alias gd='git diff'
alias gf='git fetch'
alias gfrm='git fetch; git reset --hard origin/master'
alias gg='git grep '
alias gits='alias | grep "^alias g.*git.*$"'
alias gl='git log'
alias gl1='git log --oneline'
alias glf='git log --name-status'
alias glp='git log -p'
alias gpull='git pull '
alias gpush='git push '

और मेरी ~/.gitconfigफ़ाइल में निम्नलिखित "गिट एलियाज़" हैं - ये क्यों हैं?
ताकि शाखा पूरा हो (TAB कुंजी के साथ) काम करे!

तो ये हैं:

[alias]
  co = checkout
  cob = checkout -b

उदाहरण उपयोग: git co [branch]<- शाखाओं के लिए टैब पूरा होने पर काम करेगा।

जीयूआई लर्निंग टूल

आप कुछ आधार अवधारणाओं को सीखने में उपयोगी https://learngitbranching.js.org/ पा सकते हैं । स्क्रीन शॉट: वीडियो: https://youtu.be/23JqqcLPss0यहाँ छवि विवरण दर्ज करें

अंत में, 7 प्रमुख जीवन रक्षक!

  1. आप परिवर्तन करते हैं, उन्हें जोड़ते हैं और उन्हें कमिट करते हैं (लेकिन धक्का नहीं देते हैं) और फिर ओह! आपको एहसास है कि आप मास्टर हैं!

    git reset [filename(s)]
    git checkout -b [name_for_a_new_branch]
    git add [file(s)]
    git commit -m "A useful message"
    
    Voila!  You've moved that 'master' commit to its own branch !
  2. आप स्थानीय शाखा में काम करते समय कुछ फ़ाइलों को गड़बड़ कर देते हैं और बस अंतिम बार आपके पास जो करना था, उसमें वापस जाना चाहते हैं git pull:

    git reset --hard origin/master  # You will need to be comfortable doing this!
  3. आप स्थानीय रूप से परिवर्तन करना शुरू करते हैं, आप आधा दर्जन फाइलें संपादित करते हैं और फिर, ओह बकवास, आप अभी भी मास्टर (या किसी अन्य) शाखा में हैं:

    git checkout -b new_branch_name  # just create a new branch
    git add .                      # add the changes files
    git commit -m"your message"    # and commit them
  4. आप अपनी वर्तमान शाखा में एक विशेष फ़ाइल को गड़बड़ कर देते हैं और मूल रूप से उस फ़ाइल को 'रीसेट' करना चाहते हैं (परिवर्तन खो देते हैं) कि यह आखिरी बार कैसे था जिसे आपने दूरस्थ भंडार से खींचा था:

    git checkout your/directories/filename

    यह वास्तव में फ़ाइल को रीसेट करता है (जैसे कई Git कमांड्स इसे अच्छी तरह से नाम नहीं दिया गया है कि यह यहाँ क्या कर रहा है)।

  5. आप स्थानीय रूप से कुछ बदलाव करते हैं, आप यह सुनिश्चित करना चाहते हैं कि आप उन्हें खोते नहीं हैं जब आप एक git resetया करते हैं rebase: मैं अक्सर पूरे प्रोजेक्ट की मैनुअल कॉपी ( cp -r ../my_project ~/) करता हूं, जब मुझे यकीन नहीं होता कि मैं गिट में गड़बड़ कर सकता हूं या महत्वपूर्ण खो सकता हूं परिवर्तन।

  6. आप रिबास कर रहे हैं लेकिन चीजें गड़बड़ हो जाती हैं:

    git rebase --abort # To abandon interactive rebase and merge issues
  7. अपनी प्रिट में अपनी Git शाखा जोड़ें PS1( https://unix.stackexchange.com/a/127800/10043 ), उदाहरण के लिए

    शीघ्र की छवि

    शाखा है selenium_rspec_conversion


1
2/20/12 मर्ज बनाम रिबेस पर जानकारी जोड़ी गई
माइकल

1
इसे और अधिक पूर्ण बनाने के लिए क्लोन पर 6/16/12 जोड़ा गया खंड।
माइकल डुरंट

4
इतना पाठ !! मैं अपने साधारण तोड़फोड़ :-)
जॉनी

6
है ना? एक तोड़फोड़ उपयोगकर्ता भी तोड़फोड़ का उपयोग करने पर एक किताब लिख सकता है। यह मेरी राय है कि तोड़फोड़ कम कार्यक्षमता वाली एक पुरानी तकनीक है। मैं व्यक्तिगत रूप से उपयोग करने के लिए बहुत आसान git पाता हूं। ymmv
माइकल ड्यूरेंट

3
वाह, मिचल! एसओ ज्ञान बांटने के बारे में है। महान काम के लिए धन्यवाद, निश्चित रूप से +1
मिचेल

143

यहाँ ओलिवर स्टील की छवि है कि यह सब एक साथ कैसे फिट होता है:

यहाँ छवि विवरण दर्ज करें


6
इस छवि को "गिट क्लोन" जोड़ने के लिए अद्यतन किया जा सकता है जो मुझे यकीन है कि ज्यादातर लोग किसी भी मामले में परिचित हैं।
कंटैंगो

3
@ ग्रेविटास, मैं वास्तव में इस ग्राफिक से प्यार करता हूं, लेकिन यह मुझे नहीं बताता है कि फाइलें कब लिखी जा रही हैं और कब उनका विलय किया जा रहा है। क्या आप मुझे बता सकते हैं कि इन आदेशों में से कौन सा है? शायद ओवरराइटिंग शीर्ष पर है और ड्राइव के नीचे मर्जिंग कमांड है? धन्यवाद।
२०:५० पर zylstra

मैं जो समझता हूं, उससे आप जो भी पूछते हैं, उससे एक पुल से जीआईटी पुल नीचे गिर जाएगा (इसलिए, जो भी ट्रंक आप पूछ रहे हैं) और तुरंत उस शाखा में विलय कर दें जब आप अनुरोध करते हैं। पुल एक उच्च-स्तरीय अनुरोध है जो 'फ़िंच' चलाता है, फिर डिफ़ॉल्ट रूप से 'मर्ज', या '-सेबेज़' के साथ रिबेज़। आप इसके बिना कर सकते हैं, यह सिर्फ एक सुविधा है।
कंटैंगो

इस चित्र में वास्तव में git क्लोन कहां जाएगा? इसके अलावा git मर्ज? मैं बहुत नया हूँ, लेकिन मुझे यह तस्वीर पसंद है।
मिशैल 13

2
मैं देखूंगा कि क्या मैं आरेख का एक अद्यतन संस्करण कर सकता हूं।
कॉन्टैंगो

8

कांटा बनाम। क्लोन - दो शब्द जो दोनों की नकल करते हैं

कृपया इस आरेख को देखें। (मूल रूप से http://www.dataschool.io/content/images/2014/Mar/github1.png से )।

.-------------------------.     1. Fork     .-------------------------.
| Your GitHub repo        | <-------------- | Joe's GitHub repo       |
| github.com/you/coolgame |                 | github.com/joe/coolgame |
| ----------------------- | 7. Pull Request | ----------------------- |
| master -> c224ff7       | --------------> | master -> c224ff7 (c)   |
| anidea -> 884faa1 (a)   |                 | anidea -> 884faa1 (b)   |
'-------------------------'                 '-------------------------'
    |                 ^
    | 2. Clone        |
    |                 |
    |                 |
    |                 |
    |                 |
    |                 | 6. Push (anidea => origin/anidea)
    v                 |
.-------------------------.
| Your computer           |  3. Create branch 'anidea'
| $HOME/coolgame          |
| ----------------------- |  4. Update a file
| master -> c224ff7       |
| anidea -> 884faa1       |  5. Commit (to 'anidea')
'-------------------------'

(a) - after you have pushed it
(b) - after Joe has accepted it
(c) - eventually Joe might merge 'anidea' (make 'master -> 884faa1')

कांटा

  • अपने दूरस्थ रेपो (बादल) की एक प्रति जो इसे जो के लिए लिंक करती है
  • एक प्रतिलिपि आप तब अपने स्थानीय रेपो और F *% $ - से क्लोन कर सकते हैं
  • जब आप कर रहे हैं तो आप अपने रिमोट को वापस धकेल सकते हैं
  • फिर आप जो से पूछ सकते हैं कि क्या वह पुल-अनुरोध पर क्लिक करके अपने प्रोजेक्ट में इसका उपयोग करना चाहता है

क्लोन

  • अपने स्थानीय रेपो (हार्डड्राइव) की एक प्रति

ध्यान दें कि वास्तविक डीवीसीएस लाभ यह है कि आपको ऐसा करने के लिए जोओ के रेपो के लिए किसी विशिष्ट एक्सेस अनुमति की आवश्यकता नहीं है । यदि जो आपको अधिक बार योगदान देने के लिए तैयार करता है, तो वह आपको अभिगम अधिकारों को धक्का दे सकता है: वे आपको anideaउसके रेपो पर धकेल सकते हैं और आपके कांटे को अद्यतित रखने के काम को बचा सकते हैं। OTOH यदि आप जो के साथ समझौते तक पहुंचने का प्रबंधन नहीं करेंगे, तो आप बस अपने कांटे का विकास और उपयोग कर सकते हैं (और देखें कि क्या आप उसे बाद में अपना मन बदल सकते हैं)।
एलोइस महदाल

6

बस दूसरों को जोड़ने के लिए, जाली के लिए विशिष्ट एक नोट।

यह महसूस करना अच्छा है कि तकनीकी रूप से, रेपो को क्लोन करना और रेपो को फोर्क करना एक ही बात है। करना:

git clone $some_other_repo

और आप अपने आप को पीठ पर टैप कर सकते हैं --- आपने अभी कुछ अन्य रेपो को फोर्क किया है।

Git, एक VCS के रूप में, वास्तव में क्लोनिंग फ़ोर्किंग के बारे में है । इसके अलावा "सिर्फ ब्राउज़ कर" इस तरह के cgit रूप में दूरदराज के यूआई का उपयोग कर, वहाँ बहुत कम Git रेपो कि शामिल नहीं करता है के साथ क्या करना है forking कुछ बिंदु पर रेपो क्लोनिंग।

तथापि,

  • जब कोई कहता है कि मैंने रेपो एक्स को फोर्क किया है , तो उनका मतलब है कि उन्होंने रेपो का एक क्लोन बनाया है, जिसका उद्देश्य दूसरों के लिए इसे उजागर करना है, उदाहरण के लिए कुछ प्रयोग दिखाने के लिए, या विभिन्न एक्सेस कंट्रोल मैकेनिज्म लागू करने के लिए (जैसे। लोगों को बिना अनुमति के)। Github पहुंच लेकिन सहयोग करने के लिए कंपनी के आंतरिक खाते के साथ)।

    तथ्य यह है कि: रेपो सबसे अधिक संभवत: अन्य कमांड के साथ बनाया गया है git clone, कि यह शायद किसी सर्वर पर कहीं किसी के लैपटॉप के विपरीत होस्ट किया गया है, और सबसे शायद थोड़ा अलग प्रारूप है (यह एक "नंगे रेपो" है, यानी बिना काम के पेड़)। सभी सिर्फ तकनीकी विवरण हैं।

    तथ्य यह है कि यह सबसे अधिक शाखाओं, टैग या कमिट्स के अलग-अलग सेट होंगे, शायद सबसे अधिक यही कारण है कि उन्होंने इसे पहले स्थान पर किया।

    (जब आप "कांटा" पर क्लिक करते हैं तो गितुब क्या करता है, बस जोड़ा चीनी के साथ क्लोनिंग है: यह आपके लिए रेपो क्लोन करता है, इसे आपके खाते में डाल देता है, "कहीं से कांटा" रिकॉर्ड करता है, रिमोट "अपस्ट्रीम" जोड़ता है, और सबसे महत्वपूर्ण बात अच्छा एनीमेशन निभाता है।)

  • जब कोई कहता है कि मैंने रेपो एक्स पर क्लोन किया है , तो उनका मतलब है कि उन्होंने अपने लैपटॉप या डेस्कटॉप पर स्थानीय स्तर पर रेपो का एक क्लोन बनाया है, जो इसे इरादे से अध्ययन करते हैं, इसके साथ खेलते हैं, इसमें योगदान करते हैं या इसमें स्रोत कोड से कुछ बनाते हैं।

गिट की सुंदरता यह है कि यह यह सब पूरी तरह से एक साथ फिट बनाता है: ये सभी रिपॉज ब्लॉक कमेंट चेन के आम हिस्से को साझा करते हैं ताकि यह सुरक्षित रूप से संभव हो (नीचे नोट देखें) इन सभी रिपोज के बीच आगे और पीछे के बदलाव को मिलाते हैं जैसा कि आप फिट देखते हैं।


नोट: "सुरक्षित रूप से" जब तक आप श्रृंखला के आम हिस्से को फिर से नहीं लिखते हैं, और जब तक परिवर्तन परस्पर विरोधी नहीं होते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.