git - गिट में फ़ाइल का केवल एक हिस्सा प्रतिबद्ध करें




git-commit (15)

जब मैं गिट में किसी फ़ाइल में परिवर्तन करता हूं, तो मैं केवल कुछ बदलाव कैसे कर सकता हूं?

उदाहरण के लिए, मैं फाइल में 30 लाइनों में से केवल 15 लाइनों को कैसे बदल सकता हूं?


Emacs के लिए भी gitsum


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

$ git stash -u
$ git difftool -d -t meld stash
$ git commit -a -m "some message"
$ git stash pop

स्टैश विधि का उपयोग करने से आपको परीक्षण करने का मौका मिलता है, अगर आपका कोड अभी भी काम करता है, तो इसे प्रतिबद्ध करने से पहले।


आप git add --interactive या git add -p < file > उपयोग कर सकते हैं, और फिर git commit ( git commit -a ); git-add मैनपेज में इंटरेक्टिव मोड देखें, या बस निर्देशों का पालन करें।

आधुनिक गिट ने भी git commit --interactive (और git commit --patch , जो इंटरैक्टिव प्रतिबद्धता में पैच विकल्प के लिए शॉर्टकट है)।

यदि आप इसे जीयूआई से करना पसंद करते हैं, तो आप git-gui उपयोग कर सकते हैं। आप बस उन हिस्सों को चिह्नित कर सकते हैं जिन्हें आप प्रतिबद्ध में शामिल करना चाहते हैं। मुझे व्यक्तिगत रूप से git add -i का उपयोग करने से आसान लगता है। अन्य गिट जीयूआई, जैसे कि क्यूजीआईटी या गिटएक्स, में भी यह कार्यक्षमता हो सकती है।


क्या आप Emacs का उपयोग करना चाहिए, Magit पर एक नज़र Magit , जो emacs के लिए एक गिट इंटरफ़ेस प्रदान करता है। यह स्टेजिंग शिकारी (फाइलों के कुछ हिस्सों) का समर्थन करता है।


पिछले उत्तर में जोड़ना, यदि आप कमांड लाइन का उपयोग करना पसंद करते हैं, तो git add -e myfile दर्ज करने से आप लाइन को लाइन से चुनने का विकल्प देते हैं जो आप प्रतिबद्ध करना चाहते हैं क्योंकि यह कमांड अंतर के साथ एक संपादक खोल देगा, जैसे:

जैसा कि आप लाइनों के साथ शुरू कर सकते हैं जो + साथ शुरू होते हैं, जो लाइनें शुरू होती हैं - हटाए जाते हैं। इसलिए:

  • एक जोड़े को चरणबद्ध करने के लिए बस उस रेखा को हटा दें।
  • एक विलोपन को चरणबद्ध करने के लिए बस जगह के साथ प्रतिस्थापित करें

यह git add -h इस तरह फाइलें जोड़ने के बारे में कहता है (फ़ाइलों को पैच करना):

जोड़ा गया सामग्री जोड़ा गया सामग्री "+" से शुरू होने वाली रेखाओं द्वारा दर्शायी जाती है। आप उन्हें हटाकर किसी भी अतिरिक्त लाइनों को स्टेजिंग रोक सकते हैं।

हटाई गई सामग्री: हटाई गई सामग्री को "-" से शुरू होने वाली रेखाओं द्वारा दर्शाया जाता है। आप "-" को "स्पेस" में परिवर्तित करके अपने निष्कासन को चरणबद्ध करने से रोक सकते हैं।

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

सावधानी: फ़ाइल की सामग्री को न बदलें, ऐसा करने के लिए यह एक अच्छी जगह नहीं है। बस हटाए गए या जोड़े गए लाइनों के ऑपरेटरों को बदलें।


मेरा मानना ​​है कि git add -e myfile सबसे आसान तरीका है (कम से कम मेरी वरीयता) क्योंकि यह केवल एक टेक्स्ट एडिटर खोलता है और आपको यह चुनने देता है कि आप किस लाइन को मंच करना चाहते हैं और आप कौन सी लाइन नहीं करते हैं। संपादन आदेशों के बारे में:

जोड़ा गया सामग्री:

जोड़ा गया सामग्री "+" से शुरू होने वाली रेखाओं द्वारा दर्शायी जाती है। आप उन्हें हटाकर किसी भी अतिरिक्त लाइनों को स्टेजिंग रोक सकते हैं।

हटाई गई सामग्री:

हटाई गई सामग्री को "-" से शुरू होने वाली रेखाओं द्वारा दर्शाया जाता है। आप "-" को "स्पेस" में परिवर्तित करके अपने निष्कासन को चरणबद्ध करने से रोक सकते हैं।

संशोधित सामग्री:

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

git add बारे में हर विवरण git --help add पर उपलब्ध git --help add


यदि आप विम का उपयोग कर रहे हैं, तो आप fugitive नामक उत्कृष्ट प्लगइन को आजमा सकते हैं।

आप कार्यशील प्रतिलिपि और इंडेक्स के बीच फ़ाइल के अंतर को देख सकते हैं :Gdiff , और उसके बाद क्लासिक vim diff कमांड जैसे dp का उपयोग कर इंडेक्स में लाइन या :Gdiff जोड़ें। इंडेक्स में संशोधन सहेजें और इसके साथ प्रतिबद्ध करें :Gcommit , और आप कर चुके हैं।

यहां बहुत अच्छी प्रारंभिक स्क्रीनकास्ट (एएसपी भाग 2 देखें )।


यदि यह Windows प्लेटफ़ॉर्म पर है, तो मेरी राय में git gui unstaged फ़ाइल से कुछ पंक्तियों को unstaged / commit करने का सबसे अच्छा टूल है

1. हंक वार:

  • unstagged Changes अनुभाग से फ़ाइल का चयन करें
  • कोड के राक क्लिक करें जिसे चरणबद्ध करने की आवश्यकता है
  • Stage Hunk for commit चयन करें

2. लाइन वार:

  • unstagged Changes अनुभाग से फ़ाइल का चयन करें
  • लाइन / लाइन का मंचन का चयन करें
  • Stage Lines for commit चयन करें

3. यदि आप दो पंक्तियों को छोड़कर पूरी फ़ाइल को चरणबद्ध करना चाहते हैं:

  • unstagged Changes अनुभाग से फ़ाइल का चयन करें
  • Ctrl+T (Stage file to commit)
  • चयनित फ़ाइल अब Staged Changes अनुभाग में ले जाती है
  • लाइन / लाइन का मंचन का चयन करें
  • UnStage Lines for commit चयन करें

शो के ऊपर एक उत्तर के रूप में, आप git add --patch filename.txt उपयोग कर सकते हैं

या शॉर्ट-फॉर्म git add -p filename.txt

... लेकिन पहले से ही आपके पास रिपोजिटरी में फ़ाइलों के लिए, एस प्रतिबद्धता कमांड पर सीधे पैच फ्लैग का उपयोग करके बहुत बेहतर है (यदि आप हाल ही में गिट के पर्याप्त संस्करण का उपयोग कर रहे हैं): git commit --patch filename.txt

... या, फिर, शॉर्ट-फॉर्म git commit -p filename.txt

... और फिर प्रतिबद्धता में शामिल करने के लिए लाइनों को चुनने के लिए, निर्दिष्ट कुंजी, (y / n आदि) का उपयोग करना।


एटम उपयोगकर्ताओं के लिए, पैकेज github में git gui की शैली में इंटरैक्टिव स्टेजिंग शामिल है। शॉर्टकट के लिए पैकेज के documentation

एटम का उपयोग करने से ऐसी थीम के साथ काम करने की अनुमति मिलती है जिसमें अंधेरे पृष्ठभूमि होती है (डिफ़ॉल्ट रूप से, git gui की एक सफेद पृष्ठभूमि होती है)।


vim-gitgutter प्लगइन vim संपादक का उपयोग किए बिना vim-gitgutter मंच कर सकते हैं

:GitGutterStageHunk

इसके अलावा, यह कुछ आधुनिक आईडीई में एक अलग संकेत कॉलम जैसी अन्य शानदार सुविधाएं प्रदान करता है

अगर हंक का केवल एक हिस्सा fugitive मंचन किया जाना चाहिए

:Gdiff

दृश्य श्रेणी चयन को तब अनुमति देता है :'<,'>diffput या :'<,'>diffget अलग-अलग लाइन परिवर्तनों को चरण / वापस करने के लिए भिन्न होता है।


git-meld-index - वेबसाइट से उद्धरण:

गिट-मैल्ड-इंडेक्स मेल्ड - या किसी अन्य गिट डिफॉल्टोल (केडीएफ 3, फैल्यूज इत्यादि) चलाता है - जिससे आप गिट इंडेक्स (जिसे गिट स्टेजिंग क्षेत्र के नाम से भी जाना जाता है) में इंटरैक्टिव रूप से बदलाव करने की अनुमति मिलती है।

यह गिट ऐड-पी की कार्यक्षमता के समान है, और गिट एड - इंटरैक्टिव। कुछ मामलों में गिल्ड एड-पी की तुलना में मेल्ड का उपयोग करना आसान / तेज़ है। ऐसा इसलिए है क्योंकि मेल्ड आपको उदाहरण देता है, उदाहरण के लिए:

  • अधिक संदर्भ देखें
  • इंट्रा-लाइन diffs देखें
  • हाथ से संपादित करें और 'लाइव' diff अपडेट देखें (प्रत्येक कीप्रेस के बाद अपडेट किया गया)
  • आप जिस बदलाव को छोड़ना चाहते हैं, उसे 'एन' कहने के बिना किसी बदलाव के लिए नेविगेट करें

प्रयोग

एक गिट भंडार में, चलाएं:

git meld-index

आप meld (या आपके कॉन्फ़िगर किए गए गिट difftool) के साथ पॉप अप देखेंगे:

बाएं : आपके काम करने वाले पेड़ से कॉपी की गई अस्थायी निर्देशिका महाद्वीप फ़ाइलें

दाएं : सूचकांक की सामग्री के साथ अस्थायी निर्देशिका। इसमें ऐसी फ़ाइलें भी शामिल हैं जो अभी तक इंडेक्स में नहीं हैं लेकिन कामकाजी प्रति में संशोधित या अनचाहे हैं - इस मामले में आप HEAD से फ़ाइल सामग्री देखेंगे।

खुश होने तक इंडेक्स (दाएं हाथ की ओर) संपादित करें। आवश्यकता होने पर बचाने के लिए याद रखें।

जब आप पूरा कर लेंगे, तो मिलकर बंद करें, और गिट-मैल्ड-इंडेक्स आपके द्वारा संपादित किए गए मेल्ड के दाईं ओर अस्थायी निर्देशिका की सामग्री से मेल खाने के लिए इंडेक्स को अपडेट करेगा।


git add -p filename.x बाहर निकाला, लेकिन एक मैक पर, मुझे gitx ( http://gitx.frim.nl/ या https://github.com/pieter/gitx ) मिला जो वास्तव में करने के लिए बहुत आसान था लाइनें मैं चाहता था।


गिट एक्सटेंशन का उपयोग करने वालों के लिए:

कमिट विंडो में, उस फ़ाइल का चयन करें जिसे आप आंशिक रूप से प्रतिबद्ध करना चाहते हैं, फिर उस पाठ का चयन करें जिसे आप दाएं फलक में करना चाहते हैं, फिर चयन पर राइट-क्लिक करें और संदर्भ मेनू से 'स्टेज चयनित लाइनें' चुनें।


आप git add --patch <filename> (या संक्षिप्त के लिए -p ) का उपयोग कर सकते हैं, और गिट आपके फ़ाइल को git add --patch <filename> शुरू हो जाएगा जो समझ में आता है "शिकारी" (फ़ाइल के भाग)। इसके बाद यह आपको इस प्रश्न के साथ संकेत देगा:

Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]?

यहां प्रत्येक विकल्प का विवरण दिया गया है:

  • y अगले चरण के लिए इस हंक मंच
  • n अगली प्रतिबद्धता के लिए इस हंक को मंचित न करें
  • क्यू छोड़ो; इस हंक या शेष बचे हुए किसी भी शिकारी को न लें
  • एक फ़ाइल इस हंक और फ़ाइल में बाद में सभी शिकारी
  • डी इस हंक या फ़ाइल में बाद में किसी भी शिकारी को मंचित न करें
  • जी जाने के लिए एक हंक का चयन करें
  • / दिए गए रेगेक्स से मेल खाते हुए एक हंक के लिए खोजें
  • जे इस हंक को निराश छोड़ दें, अगले अनिश्चित हंक देखें
  • जे इस हंक को निराश छोड़ दें, अगले हंक देखें
  • k इस हंसी को निराश छोड़ दें, पिछली अनिश्चित हंक देखें
  • के इस अव्यवस्था को छोड़कर, पिछली हंक देखें
  • वर्तमान शिकारी छोटे शिकारी में विभाजित है
  • वर्तमान हंक को मैन्युअल रूप से संपादित करें
  • ? मुद्रित हंक सहायता

अगर फ़ाइल अभी तक भंडार में नहीं है, तो आप पहले git add -N <filename> । इसके बाद आप git add -p <filename> साथ जा सकते हैं।

बाद में, आप इसका उपयोग कर सकते हैं:
git diff --staged लिए चरणबद्ध है कि आपने सही परिवर्तन किए हैं
git reset -p गलती से जोड़ा शिकारी unstage करने के लिए
जब आप प्रतिबद्ध संदेश संपादित करते हैं तो अपनी प्रतिबद्धता को देखने के लिए git commit -v

नोट यह git format-patch कमांड से बहुत अलग है, जिसका उद्देश्य एक .patch फ़ाइलों में डेटा को पार्स करना है।

भविष्य के लिए संदर्भ: https://git-scm.com/book/en/v2/Git-Tools-Interactive-Staging





git-commit