मैं Git में कमिट करने से पहले स्टेज क्यों चाहूंगा?


102

मैं संस्करण नियंत्रण में नया हूं और मैं समझता हूं कि "कमिटिंग" जो आप काम कर रहे हैं उसके नए 'वर्तमान' संस्करण को अपडेट करते समय अनिवार्य रूप से एक बैकअप बना रहा है।

जो मुझे समझ में नहीं आता है वह व्यावहारिक दृष्टिकोण से है। क्या किसी चीज़ का मंचन केवल नाम में मौजूद है या यह एक उद्देश्य की पूर्ति करता है? जब आप प्रतिबद्ध होते हैं, तो यह सब कुछ वैसे भी करने के लिए जा रहा है, है ना?

संपादित करें: मुझे लगता है कि मैं शब्दावली को भ्रमित कर सकता हूं। क्या एक 'मंचित' फ़ाइल 'ट्रैक की गई' फ़ाइल के समान है?


6
नहीं। एक ट्रैक की गई फ़ाइल वह होती है जिसे रिपॉजिटरी (आमतौर पर पूर्व की ओर से) के लिए जाना जाता है। एक चरणबद्ध फ़ाइल वह है जिसे सूचकांक में जोड़ा गया है, जिसे बाद में प्रतिबद्ध करने के लिए उपयोग किया जाएगा।
मार्क पीटर्स

जवाबों:


82

जब आप कमिट करते हैं तो यह केवल इंडेक्स ("स्टेज्ड" फाइल्स) में बदलाव करने वाला है। इसके लिए कई उपयोग हैं, लेकिन सबसे स्पष्ट है कि आपके कामकाजी परिवर्तनों को छोटे, स्व-निहित टुकड़ों में तोड़ देना। शायद आपने किसी फ़ीचर को लागू करते समय बग को ठीक कर दिया था। आप git addबस उस फ़ाइल (या git add -pकिसी फ़ाइल का सिर्फ एक हिस्सा जोड़ने के लिए!) और उसके बाद सब कुछ करने से पहले उस बगफिक्स को कर सकते हैं। यदि आप उपयोग कर रहे हैं git commit -aतो आप addकमिट से ठीक पहले हर चीज के लिए मजबूर कर रहे हैं । -aयदि आप फ़ाइलों के मंचन का लाभ उठाना चाहते हैं, तो इसका उपयोग न करें ।

आप चरणबद्ध फ़ाइलों --cachedको कई कमांड के साथ एक मध्यवर्ती कामकाजी प्रतिलिपि के रूप में भी मान सकते हैं । उदाहरण के लिए, आपको git diff --cachedयह दिखाएगा कि मंच कैसे अलग है HEADताकि आप देख सकें कि आप अपने अन्य कामकाजी परिवर्तनों में मिश्रण के बिना क्या करने वाले हैं।


25
अन्य वास्तव में आम उपयोग तब होता है जब आपके कुछ बदलाव कभी भी प्रतिबद्ध नहीं होने चाहिए ; उदाहरण के लिए, आप अच्छे सामान को चरणबद्ध कर सकते हैं, उसे प्रतिबद्ध कर सकते हैं, फिर खराब सामान को उड़ा सकते हैं git reset --hard
कैस्केबेल

3
@BenJackson आपके उदाहरण में, चरण + कमिट और सेलेक्टिव कमिट में क्या अंतर है? मुझे कोई मतभेद नज़र नहीं आ रहा है।
यूजेनियो

9
मैं व्यक्तिगत रूप से, "मंचन की बात क्या है?" सवाल। सच कहूँ तो, यह सिर्फ अनावश्यक है। मैं पहले से ही एक स्थानीय शाखा का उपयोग कर रहा हूं, इसलिए निर्माण को तोड़ने का कोई जोखिम नहीं है। जब तक मैं अपने बदलावों से पूरी तरह संतुष्ट नहीं हो जाता, तब तक मैं एक प्रकाशन अनुरोध नहीं करूंगा। मैं पहले से ही अपने कमिट को तार्किक रूप से विभाजित कर सकता हूं। इंटरमीडिएट कदम के लिए बस कोई जरूरत नहीं है। जैसे, मैं इसका इस्तेमाल कभी नहीं करता।
mrplainswalker

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

1
@ kiwicomb123 आमतौर पर क्योंकि आपने उस बग को किसी और चीज़ पर काम करते हुए पाया था, और आप चाहते हैं कि वह अपने लॉग संदेश के साथ अपनी खुद की प्रतिबद्धताओं को ठीक कर दे और मर्ज / चेरी-पिक / रिबास के लचीलेपन को कहीं और ठीक कर दे।
बेन जैक्सन

26
  • स्टेजिंग एरिया कमिट करने के लिए कंट्रोल देता है। कोड में केवल एक तार्किक परिवर्तन करें, परिवर्तित फ़ाइलों को स्टेजिंग क्षेत्र में जोड़ें और अंत में यदि परिवर्तन खराब हैं, तो पिछली कमिटमेंट के लिए चेकआउट करें या फिर परिवर्तन करें। यह कार्य को छोटे कार्यों में विभाजित करने और छोटे कार्य करने की सुविधा देता है परिवर्तन। स्टेजिंग क्षेत्र के साथ छोटे कार्यों में ध्यान केंद्रित करना आसान है।
  • यह आपको ब्रेक लेने का प्रस्ताव भी देता है और यह भूल जाता है कि ब्रेक लेने से पहले आपने कितना काम किया है। मान लीजिए कि आपको एक तार्किक परिवर्तन करने के लिए तीन फ़ाइलों को बदलने की आवश्यकता है और आपने पहली फ़ाइल को बदल दिया है और जब तक आप अन्य परिवर्तन करना शुरू नहीं करते हैं तब तक एक लंबे ब्रेक की आवश्यकता होती है। इस समय आप कमिट नहीं कर सकते हैं और आप यह ट्रैक करना चाहते हैं कि आप किन फाइलों के साथ काम कर रहे हैं ताकि वापस आने के बाद आपको यह याद रखने की कोशिश करने की जरूरत नहीं है कि कितना काम किया गया है। इसलिए फ़ाइल को स्टेजिंग क्षेत्र में जोड़ें और यह आपके काम को बचाएगा। जब आप वापस आते हैं तो बस करते हैं git diff --stagedऔर जाँचते हैं कि आपने कौन सी फाइलें बदलीं और कहां और अन्य परिवर्तन करना शुरू करें।

13

मंचन का एक व्यावहारिक उद्देश्य फ़ाइल कमिट्स का तार्किक पृथक्करण है।

जैसा कि मंचन आपको फ़ाइलों / कार्यशील निर्देशिका में संपादन करना जारी रखने की अनुमति देता है, और जब आप तैयार होते हैं, तो भागों में कमिट करते हैं, आप तार्किक रूप से असंबंधित संपादन के लिए अलग-अलग चरणों का उपयोग कर सकते हैं।

मान लीजिए आप 4 फ़ाइलें fileA.html, fileB.html, fileC.htmlऔर fileD.html। आप सभी 4 फ़ाइलों में परिवर्तन करने और प्रतिबद्ध करने के लिए तैयार कर रहे हैं, लेकिन में आने वाले बदलाव fileA.htmlऔर fileB.htmlतार्किक संबंधित हैं (उदाहरण के लिए, दोनों फाइलों में ही नई सुविधा कार्यान्वयन), जबकि में परिवर्तन fileC.htmlऔर fileD.htmlअलग और तार्किक फ़ाइलें करने के लिए पिछले करने के लिए संबंधित नहीं हैं। आप पहले फ़ाइलों को चरणबद्ध कर सकते हैं fileA.htmlऔरfileB.html और उन के लिए प्रतिबद्ध।

git add fileA.html
git add fileB.html
git commit -m "Implemented new feature XYZ"

फिर अगले चरण में आप चरणबद्ध होकर शेष दो फाइलों में परिवर्तन करते हैं।

git add fileC.html
git add fileD.html
git commit -m "Implemented another feature EFG"

6
इस उदाहरण में, मुझे यकीन नहीं है कि मंचन वास्तव में आवश्यक है। सभी 4 फाइलों को संपादित करने के बाद, अगर मैं सिर्फ fileA.html और fileB.html को कमिट करना चाहता हूं, तो भी मैं इसे स्टैज किए बिना कर सकता हूं। कमांड: git commit -m "Implemented new feature XYZ" fileA.html fileB.html गिट ऐड कमांड की आवश्यकता के बिना ठीक काम करेगा। मैं तोड़फोड़ की दुनिया से आता हूं, जहां मंचन एक अवधारणा नहीं है, इसलिए, मैं मंचन की उपयोगिता के बारे में आश्वस्त नहीं हूं
पवन

5

गिट कमांड के उपयोग को समझना आसान है addऔर commitयदि आप एक लॉग फ़ाइल को गितुब पर अपने भंडार में बनाए रखने की कल्पना करते हैं। मेरे लिए एक विशिष्ट परियोजना की लॉग फ़ाइल इस तरह दिख सकती है:

---------------- Day 1 --------------------
Message: Complete Task A
Index of files changed: File1, File2

Message: Complete Task B
Index of files changed: File2, File3
-------------------------------------------

---------------- Day 2 --------------------
Message: Correct typos
Index of files changed: File3, File1
-------------------------------------------
...
...
...and so on

मैं आमतौर पर एक git pullअनुरोध के साथ अपना दिन शुरू करता हूं और इसे एक git pushअनुरोध के साथ समाप्त करता हूं । इसलिए एक दिन के रिकॉर्ड के अंदर सब कुछ उन दोनों के बीच होता है। प्रत्येक दिन के दौरान, एक या अधिक होते हैं तार्किक कार्य होते हैं जिन्हें मैं पूरा करता हूं जिन्हें कुछ फ़ाइलों को बदलने की आवश्यकता होती है। उस कार्य के दौरान संपादित की गई फ़ाइलें एक सूचकांक में सूचीबद्ध हैं।

इनमें से प्रत्येक उप कार्य (टास्क ए और टास्क बी यहां) व्यक्तिगत रूप से किए गए हैं। git addआदेश 'फ़ाइलें सूचकांक बदल गया' सूची में फ़ाइलों को कहते हैं। इस प्रक्रिया को स्टेजिंग भी कहा जाता है। git commitआदेश रिकार्ड / परिवर्तन और एक निर्धारित संदेश के साथ इसी सूचकांक सूची अंतिम रूप।

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

एक उदाहरण के रूप में, उस काल्पनिक लॉग फ़ाइल में दूसरी प्रविष्टि प्राप्त करने के लिए, मैंने किया होगा:

git pull
# Make changes to these files
git add File3 File4
# Verify changes, run tests etc..
git commit -m 'Correct typos'
git push

संक्षेप में, git addऔर git commitआप व्यवस्थित तार्किक उप-परिवर्तनों में मुख्य रिपॉजिटरी में एक बदलाव को समाप्त कर सकते हैं। जैसा कि अन्य उत्तरों और टिप्पणियों ने बताया है, उनके लिए कई और उपयोग हैं। हालांकि, यह सबसे आम उपयोगों में से एक है और एसआईवी जैसे अन्य लोकप्रिय लोगों के विपरीत एक मल्टी-स्टेज रिविजन कंट्रोल सिस्टम होने के पीछे एक ड्राइविंग सिद्धांत है।


2

स्टेजिंग क्षेत्र हमें अधिक लचीलेपन के साथ आने में मदद करता है। क्राफ्टिंग से मेरा मतलब है कि तार्किक इकाइयों में कमियों को तोड़ना। यदि आप एक रखरखाव योग्य सॉफ़्टवेयर चाहते हैं तो यह बहुत महत्वपूर्ण है। सबसे स्पष्ट तरीका आप इसे प्राप्त कर सकते हैं:

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

आप यहां और उदाहरण पा सकते हैं: इंडेक्स का उपयोग

और सबसे अच्छी बात यह है कि, लाभ इस वर्कफ़्लो की सूची के साथ नहीं रुकते हैं। यदि कोई अद्वितीय वर्कफ़्लो आता है, तो आप लगभग सुनिश्चित हो सकते हैं कि स्टेजिंग क्षेत्र आपकी मदद करेगा।


2

बेन जैक्सन के जवाब पर विस्तार करने के लिए , जो ठीक है, आइए मूल प्रश्न को करीब से देखें। ( प्रकार के प्रश्न क्यों परेशान करते हैं , इसके बारे में उनका उत्तर देखें ; यह जो चल रहा है उसके बारे में अधिक है ।)

मैं संस्करण नियंत्रण में नया हूं और मैं समझता हूं कि "कमिटिंग" जो आप काम कर रहे हैं उसके नए 'वर्तमान' संस्करण को अपडेट करते समय अनिवार्य रूप से एक बैकअप बना रहा है।

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

जो मुझे समझ में नहीं आता है वह व्यावहारिक दृष्टिकोण से है। क्या किसी चीज़ का मंचन केवल नाम में मौजूद है या यह एक उद्देश्य की पूर्ति करता है? जब आप प्रतिबद्ध होते हैं, तो यह सब कुछ वैसे भी करने के लिए जा रहा है, है ना?

हां और ना। यहाँ Git का डिज़ाइन कुछ अजीब है। वहाँ मौजूद संस्करण नियंत्रण प्रणाली है कि एक अलग मंचन की आवश्यकता नहीं है। उदाहरण के लिए, Mercurial, जो अन्यथा उपयोग के मामले में Git की तरह एक बहुत कुछ है, एक अलग कदम की आवश्यकता नहींhg add है, बहुत पहले वाले से परे जो एक नई फाइल पेश करता है। Mercurial के साथ, आप का उपयोग करते हैंhg कमांड का जो कुछ प्रतिबद्ध का चयन करता है, फिर आप अपना काम करते हैं, फिर आप दौड़ते हैं hg commit, और आप कर रहे हैं। गिट के साथ, आप का उपयोग करते हैं git checkout, 1 तो आप अपना काम करते हैं, फिर आप चलाते हैं git add, और फिर git commit। अतिरिक्त git addकदम क्यों ?

यहाँ राज़ है जो Git कॉल करता है, विभिन्न, सूचकांक या मंचन क्षेत्र , या कभी-कभी - शायद ही कभी इन दिनों- कैश । ये सभी एक ही चीज के नाम हैं।

संपादित करें: मुझे लगता है कि मैं शब्दावली को भ्रमित कर सकता हूं। क्या एक 'मंचित' फ़ाइल 'ट्रैक की गई' फ़ाइल के समान है?

नहीं, लेकिन ये संबंधित हैं। एक ट्रैक की गई फ़ाइल वह है जो Git के सूचकांक में मौजूद है। इंडेक्स को ठीक से समझने के लिए, कमिटिंग को समझने के साथ शुरुआत करना अच्छा है।


Git संस्करण 2.23 के बाद से, आप git switchइसके बजाय उपयोग कर सकते हैं git checkout। इस विशेष मामले के लिए, ये दोनों कमांड बिल्कुल एक ही काम करते हैं। नया आदेश मौजूद है क्योंकिgit checkout बहुत सारी चीजों के साथ अति-भरा हुआ है; वे दो अलग-अलग कमांडों में विभाजित हो गए, git switchऔर git restore, इसे आसान बनाने और Git का उपयोग करने के लिए सुरक्षित हो गए।


करता है

Git में, एक कमिट प्रत्येक का पूरा स्नैपशॉट बचाता है Git के बारे में जानने वाली फ़ाइल । (कौन सी फाइल के बारे में Git को पता है? हम अगले भाग में देखेंगे।) ये स्नैपशॉट एक विशेष, रीड-ओनली, Git-only, संपीड़ित और डी-डुप्लिकेट रूप में संग्रहीत किए जाते हैं, जो सामान्य रूप से केवल Git ही पढ़ सकते हैं । ( बस की तुलना में प्रत्येक प्रतिबद्ध में अधिक सामान है इस स्नैपशॉट की , लेकिन यह सब हम यहां कवर करेंगे।)

डी-डुप्लीकेशन अंतरिक्ष के साथ मदद करता है: हम आम तौर पर केवल कुछ फ़ाइलों को बदलते हैं, फिर एक नई प्रतिबद्धता बनाते हैं। तो सबसे एक में फ़ाइलों के लिए प्रतिबद्ध ज्यादातर पिछले में फ़ाइलों के लिए प्रतिबद्ध के रूप में ही कर रहे हैं। बस उन फ़ाइलों को सीधे उपयोग करके, Git बहुत सारी जगह बचाता है: यदि हमने केवल एक फ़ाइल को छुआ है, तो नई कमिट केवल एक नई प्रतिलिपि के लिए जगह लेती है। तब भी यह संकुचित होता है - कभी-कभी बहुत संकुचित होता है, हालांकि यह वास्तव में बाद में होता है- ताकि एक .gitनिर्देशिका वास्तव में उन फाइलों से छोटी हो सकती है, जो एक बार सामान्य रोजमर्रा की फ़ाइलों के लिए विस्तारित हो जाती हैं। डी-डुप्लीकेशन सुरक्षित है क्योंकि प्रतिबद्ध फाइलें हर समय जमी रहती हैं। कोई भी एक परिवर्तन नहीं कर सकता है, इसलिए यह सुरक्षित है कि यह एक-दूसरे की प्रतियों पर निर्भर हो।

क्योंकि संग्रहीत फ़ाइलें इस विशेष, जमे हुए-सभी-समय के लिए हैं, गिट-केवल प्रारूप, हालांकि, गिट को प्रत्येक फ़ाइल को एक साधारण रोजमर्रा की नकल में विस्तारित करना होगा । यह सामान्य प्रतिलिपि Git की प्रतिलिपि नहीं है: यह आपकी प्रतिलिपि है, जैसा कि आप करेंगे। जब आप इसे ऐसा करने के लिए कहेंगे, तो Git इन्हें लिखेगा, ताकि आपके पास काम करने के लिए आपकी प्रतियां हों। ये प्रयोग करने योग्य प्रतियां आपके काम करने वाले पेड़ या काम के पेड़ में हैं

इसका मतलब यह है कि जब आप कुछ विशेष प्रतिबद्ध की जांच करते हैं, तो प्रत्येक फ़ाइल की स्वचालित रूप से दो प्रतियां होती हैं :

  • Git के पास वर्तमान समय में जमे-के-लिए-सर्वकालिक, Git-ified प्रति है । आप इस प्रति को नहीं बदल सकते (हालाँकि आप निश्चित रूप से एक अलग प्रतिबद्ध का चयन कर सकते हैं, या एक नई प्रतिबद्धता बना सकते हैं)।

  • आपके पास, आपके कार्य-वृक्ष में, एक सामान्य-प्रारूप प्रति है। आप अपने कंप्यूटर पर किसी भी कमांड का उपयोग करके, इसके लिए कुछ भी कर सकते हैं।

अन्य संस्करण नियंत्रण प्रणाली (ऊपर उल्लिखित मर्कुरियल सहित) इन दो प्रतियों के साथ बंद हो जाती हैं। आप बस अपनी कार्य-वृक्ष की प्रति संशोधित करें, फिर प्रतिबद्ध करें। Git ... नहीं।

अनुक्रमणिका

इन दो प्रतियां के बीच में, Git एक संग्रहीत करता तीसरे प्रति 2 हर फ़ाइल की। यह तीसरी प्रतिलिपि जमे हुए प्रारूप में है , लेकिन प्रतिबद्ध में जमे हुए प्रतिलिपि के विपरीत, आप इसे बदल सकते हैं। इसे बदलने के लिए, आप उपयोग करते हैंgit add

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

जब आप चलाने git commit, Git अप पैकेज जो कुछ भी सूचकांक में है सही और फिर नया स्नैपशॉट के रूप में उपयोग करने के लिए। चूंकि यह पहले से ही जमे हुए प्रारूप में है, और प्री-डी-डुप्लिकेट किया गया है, इसलिए गिट को बहुत अधिक अतिरिक्त काम नहीं करना पड़ता है।

यह भी बताता है कि सभी फ़ाइलों के बारे में क्या हैं। एक ट्रैक न किए गए फ़ाइल एक फ़ाइल अपने काम-वृक्ष में है, लेकिन वह यह है कि नहीं है Git के सूचकांक में अभी । इससे कोई फर्क नहीं पड़ता कि यह इस राज्य में फ़ाइल को कैसे घायल करता है। हो सकता है कि आपने इसे अपने कंप्यूटर पर किसी अन्य जगह से अपने कार्य-वृक्ष में कॉपी किया हो। हो सकता है कि आपने इसे यहां नया बनाया हो। हो सकता है कि वहाँ था Git के सूचकांक में एक प्रति है, लेकिन आप के साथ है कि प्रतिलिपि हटा दिया git rm --cached। एक तरह से या किसी अन्य, आपके कार्य-वृक्ष में यहां एक प्रति है, लेकिन गिट के सूचकांक में कोई प्रति नहीं है। यदि आप एक नई कमिट करते हैं, तो वह फाइल नए कमिट में नहीं होगी

ध्यान दें कि git checkoutशुरू में आपके द्वारा किए गए चेक से Git के सूचकांक में भर जाता है। इसलिए सूचकांक कमिटमेंट से मेल खाता है। Git भी इसी स्रोत से आपके कार्य-वृक्ष में भरता है। तो, शुरू में, सभी तीन मैच। जब आप अपने कार्य-वृक्ष में फ़ाइलों को बदलते हैं और git addउन्हें, ठीक है, अब सूचकांक और आपके कार्य-वृक्ष मेल खाते हैं। फिर तुम दौड़ोgit commit और Git इंडेक्स से एक नया कमिट करता है, और अब तीनों फिर से मैच करते हैं।

क्योंकि Git इंडेक्स से नए कमिट करता है, हम चीजों को इस तरह से रख सकते हैं: Git का इंडेक्स आपके पास अगली प्रतिबद्ध योजना बनाता है। यह उस विस्तारित भूमिका को अनदेखा करता है जिसे गिट के सूचकांक एक विवादित विलय के दौरान लेते हैं, लेकिन हम इसे अभी भी वैसे ही अनदेखा करना चाहेंगे। :-)

यह सब वहाँ है - लेकिन यह अभी भी बहुत जटिल है! यह विशेष रूप से मुश्किल है क्योंकि Git के सूचकांक में वास्तव में देखने का कोई आसान तरीका नहीं है। 3 लेकिन वहाँ है एक Git आदेश है कि आपको बताता है क्या एक तरह से बहुत उपयोगी है में, हो रहा है, और कहा कि आदेश है git status


2 तकनीकी रूप से, यह वास्तव में एक प्रति नहीं है । इसके बजाय, यह Git-ified फ़ाइल, पूर्व-डी-डुप्लिकेट और सब कुछ का संदर्भ है। यहां सामान अधिक है, जैसे कि मोड, फ़ाइल का नाम, एक स्टेजिंग नंबर, और कुछ कैश डेटा जो Git को तेज बनाते हैं। लेकिन जब तक आप Git के कुछ निम्न-स्तरीय कमांडों के साथ काम नहीं कर लेते - git ls-files --stageऔर git update-indexविशेष रूप से- आप इसे कॉपी के रूप में सोच सकते हैं।

3git ls-files --stage आदेश आप नाम और Git के सूचकांक में हर फ़ाइल के मंचन की संख्या दिखाएगा, लेकिन आम तौर पर यह बहुत ही उपयोगी वैसे भी नहीं है।


git status

git statusआदेश वास्तव में दो अलग-अलग चलाकर काम करता है git diffआप के लिए आदेश (और भी इस तरह के कह रहा है जो शाखा पर आप हैं, के रूप में, कुछ अन्य उपयोगी सामान कर रही है)।

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

दूसरा git diffआपके वर्क-ट्री में Git के इंडेक्स की सभी फाइलों की फाइलों से तुलना करता है। जो फाइलें समान हैं , उनके लिए Git कुछ भी नहीं कहता है। अलग - अलग फ़ाइलों के लिए , Git आपको बताएगा कि यह फ़ाइल प्रतिबद्ध के लिए मंचित नहीं है । पहले अंतर के विपरीत, इस विशेष सूची में वे फाइलें शामिल नहीं हैं जो बिलकुल नई हैं: यदि फाइल untrackedआपके कार्य-वृक्ष में मौजूद है, लेकिन Git के सूचकांक में नहीं है, तो Git इसे केवल अनट्रैक की गई फ़ाइलों की सूची में शामिल करता है4

अंत में, एक सूची में इन अनटैक की गई फ़ाइलों को जमा करने से, उन फ़ाइलों के नामों की भी git statusघोषणा होगी , लेकिन एक विशेष अपवाद है: यदि किसी फ़ाइल का नाम किसी फ़ाइल में सूचीबद्ध है , जो इस अंतिम सूची को दबा देता है। ध्यान दें कि एक ट्रैक की गई फ़ाइल को सूचीबद्ध करना - जो कि Git के सूचकांक में है - का यहाँ कोई प्रभाव नहीं है : फ़ाइल सूचकांक में है, इसलिए इसकी तुलना की जाती है, और प्रतिबद्ध हो जाती है, भले ही यह सूचीबद्ध हो । अनदेखा फ़ाइल केवल "अनट्रैक फ़ाइल" शिकायतों को दबा देती है। 5.gitignore.gitignore.gitignore


4git status - लघु संस्करण का उपयोग करते समय git status -s- अनट्रैक की गई फाइलें अलग-अलग नहीं होती हैं, लेकिन सिद्धांत समान होता है। फाइलों को इस तरह git statusसंकलित करने से भी कभी-कभी निर्देशिका नाम, केवल मुद्रित करके अनटैक की गई फ़ाइलों के नामों के एक समूह को संक्षेप में प्रस्तुत करने की सुविधा मिलती है । पूरी सूची प्राप्त करने के लिए, का उपयोग करें git status -uallया git status -u

5 एक फ़ाइल लिस्टिंग भी एन सामूहिक रूप से करता है कई फ़ाइल जोड़ने जैसे कार्य git add .या git add *ट्रैक न किए गए फ़ाइल पर छोड़ दें। यह हिस्सा थोड़ा और अधिक जटिल हो जाता है, क्योंकि आप git add --forceएक फ़ाइल को जोड़ने के लिए उपयोग कर सकते हैं जो सामान्य रूप से छोड़ दिया जाएगा। कुछ अन्य सामान्य-मामूली विशेष मामले हैं, जिनमें से सभी इसमें जोड़े जाते हैं: फ़ाइल .gitignoreको अधिक उचित .git-do-not-complain-about-these-untracked-files-and-do-not-auto-add-themरूप से कहा जा सकता है या कुछ समान रूप से अनिच्छुक हो सकता है । लेकिन यह बहुत हास्यास्पद है, इसलिए .gitignoreयह है।


git add -u, git commit -aआदि

यहाँ के बारे में जानने के लिए कई आसान शॉर्टकट हैं:

  • git add .वर्तमान निर्देशिका और किसी भी उप-निर्देशिका में सभी अद्यतन की गई फ़ाइलों को जोड़ देगा । यह सम्मान करता है .gitignore, इसलिए यदि वर्तमान में अनट्रैक की गई फ़ाइल के बारे में शिकायत नहीं की जाती है git status, तो यह स्वतः-जोड़ा नहीं जाएगा।

  • git add -uआपके कार्य-वृक्ष में कहीं भी सभी अद्यतित फ़ाइलों को स्वतः जोड़ देगा । 6 यह केवल प्रभावित करता है ट्रैक की गई फ़ाइलों को । ध्यान दें कि अगर आपने वर्क-ट्री कॉपी को हटा दिया है, तो यह इंडेक्स कॉपी को भी हटा देगा ( git addक्या यह इसके हिस्से के रूप में काम के पेड़ की चीज़ से मेल खाता है)।

  • git add -Agit add .आपके कार्य-वृक्ष के शीर्ष स्तर से चलने जैसा है (लेकिन फुटनोट 6 देखें)।

इनके अलावा, आप चला सकते हैं git commit -a, जो चलने और फिर लगभग 7 के बराबर है । यही है, यह आपको वही व्यवहार देता है जो मर्क्यूरियल में सुविधाजनक है।git add -ugit commit

मैं आम तौर पर के खिलाफ सलाह देता हूं git commit -a पैटर्न के हूं: मुझे लगता है कि यह git statusअक्सर उपयोग करने के लिए बेहतर है , आउटपुट पर बारीकी से देखें , और यदि स्थिति वह नहीं है जो आप की अपेक्षा करते हैं, तो समझें कि ऐसा क्यों है। का उपयोग करना git commit -a, गलती से किसी फ़ाइल को संशोधित करना और एक बदलाव करना आसान है जिसे आपने करने का इरादा नहीं किया है। लेकिन यह ज्यादातर स्वाद / राय का मामला है।


6 यदि आपका Git संस्करण Git 2.0 से पहले आता है, तो यहां सावधान रहें: git add -uकेवल वर्तमान निर्देशिका और उप-निर्देशिकाओं पर काम करता है, इसलिए आपको अपने कार्य-वृक्ष के शीर्ष स्तर पर चढ़ना होगा। git add -Aविकल्प ने वही समस्या है।

7 मैं कहता हूँ कि मोटे तौर पर समतुल्य है क्योंकि git commit -aवास्तव में एक अतिरिक्त सूचकांक बनाकर काम करता है, और प्रतिबद्ध करने के लिए उस अन्य सूचकांक का उपयोग करता है। यदि कमिट काम करता है , तो आपको करने के समान प्रभाव मिलता हैgit add -u && git commit । यदि कमिट काम नहीं करता है - यदि आप Git बनाते हैं तो कमिटमेंट को कई तरीकों से कर सकते हैं जो आप कर सकते हैं - फिर कोई भी फाइल git add-ed बाद में नहीं होती है, क्योंकि Git अस्थायी अतिरिक्त इंडेक्स को फेंक देता है और मुख्य इंडेक्स का उपयोग करने के लिए वापस चला जाता है ।

यदि आप git commit --onlyयहां उपयोग करते हैं तो अतिरिक्त जटिलताएं हैं। इस मामले में, Git एक तीसरा सूचकांक बनाता है , और चीजें बहुत मुश्किल हो जाती हैं, खासकर यदि आप पूर्व-प्रतिबद्ध हुक का उपयोग करते हैं। अलग git addसंचालन का उपयोग करने का यह एक और कारण है ।


1

मैं @Ben जैक्सन और @Tapashee तबस्सुम उर्मी द्वारा उल्लिखित के रूप में कमिट करने के लिए स्टेज का उपयोग करने के बिंदु को देखता हूं और कभी-कभी मैं उस उद्देश्य के लिए इसका उपयोग करता हूं, लेकिन मैं मुख्य रूप से इसका उपयोग अपने कमिट को बड़ा करने के लिए करता हूं! यहाँ मेरी बात है:

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

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

मैं इसे करने के लिए अन्य तरीके देखता हूं (git इतिहास को सरल बनाना) जो आप अपनी पसंद के आधार पर उपयोग कर सकते हैं:

  1. git का संशोधन (जो आपकी अंतिम प्रतिबद्ध को बदलता है) जो आप इस विशिष्ट उद्देश्य के लिए चाहते हैं, ऐसा कुछ नहीं है (मैं इसे ज्यादातर बुरा करने और फिर इसे ठीक करने के रूप में देखता हूं)
  2. git rebase, जो एक बाद की बात है और आपके और अन्य लोगों के लिए गंभीर समस्या पैदा कर सकता है जो आपके भंडार का उपयोग करते हैं।
  3. एक अस्थायी शाखा बनाना, मर्ज करना और फिर बाद में उसे हटा देना (जो एक अच्छा विकल्प भी है, इसके लिए अधिक चरणों की आवश्यकता होती है लेकिन आपका अधिक नियंत्रण देता है)

0

यह एक चेकबॉक्स की तरह है जो यह चुनने की क्षमता प्रदान करता है कि किस फाइल को कमिट करना है।

उदाहरण के लिए, अगर मैंने संपादित किया है fileA.txtऔर fileB.txt। लेकिन मैं fileA.txtकेवल बदलाव करना चाहता हूं । क्योंकि मैं अभी समाप्त नहीं हुआ हूंfileB.txt

मैं बस उपयोग कर सकता हूं git add fileA.txtऔर उपयोग कर सकता हूं git commit -m "changed fileA.txt"और काम करना जारी रख fileB.txtसकता हूं और खत्म करने के बाद मैं fileB.txtआसानी से प्रतिबद्ध हो सकता हूं

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