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




git-commit (19)

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

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

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

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

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


Emacs के लिए भी gitsum


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

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

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

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

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

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

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

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


गिट गुई इस कार्यक्षमता को diff व्यू के तहत प्रदान करता है। बस जिस पंक्ति में आप रुचि रखते हैं उस पर राइट क्लिक करें और आपको "आइटम को प्रतिबद्ध करने के लिए इस पंक्ति को चरणबद्ध करना" देखना चाहिए।


मैं दृढ़ता से SourceTree से SourceTree का उपयोग करने की सलाह SourceTree । (यह मुफ़्त है।) यह यह मामूली बनाता है। आप कोड के व्यक्तिगत शिकारी या कोड की व्यक्तिगत पंक्तियों को तेज़ी से और आसानी से मंचित कर सकते हैं।


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

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


यह ध्यान देने योग्य है कि एक नई फ़ाइल के लिए git add --patch का उपयोग करने के लिए आपको पहली बार git add --intent-to-add साथ इंडेक्स में फ़ाइल जोड़ने की आवश्यकता है:

git add -N file
git add -p file

आप 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 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 की एक सफेद पृष्ठभूमि होती है)।


TortoiseGit के साथ:

फ़ाइल पर राइट क्लिक करें और Context Menu → Restore after commit । यह फाइल की प्रतिलिपि बनायेगा जैसा कि यह है। फिर आप फ़ाइल को संपादित कर सकते हैं, उदाहरण के लिए TortoiseGitMerge में और उन सभी परिवर्तनों को पूर्ववत करें जिन्हें आप प्रतिबद्ध नहीं करना चाहते हैं। उन परिवर्तनों को सहेजने के बाद आप फ़ाइल को प्रतिबद्ध कर सकते हैं।


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

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

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

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

प्रयोग

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

git meld-index

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

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

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

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

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


Intellij IDEA (और मुझे लगता है कि श्रृंखला के सभी अन्य उत्पादों) v2018.1 के बाद से आंशिक प्रतिबद्धताओं के लिए समर्थन में बनाया गया है


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


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 branch newbranch । यदि आप किसी मौजूदा शाखा में काम करना चाहते हैं तो आपको git reset --hard HEAD~3 निष्पादित करने से पहले मौजूदा शाखा में अपने परिवर्तनों को मर्ज करना होगा - git reset --hard HEAD~3 (नीचे मौजूदा शाखा में जाना देखें)। यदि आप पहले अपने बदलावों को मर्ज नहीं करते हैं, तो वे खो जाएंगे।

जब तक अन्य परिस्थितियां शामिल न हों, तब तक इसे आसानी से ब्रांचिंग और रोलिंग करके किया जा सकता है।

# Note: Any changes not committed will be lost.
git branch newbranch      # Create a new branch, saving the desired commits
git reset --hard HEAD~3   # Move master back by 3 commits (GONE from master)
git checkout newbranch    # Go to the new branch that still has the desired commits

लेकिन यह सुनिश्चित करें कि कितने लोग वापस जाने के लिए प्रतिबद्ध हैं। वैकल्पिक रूप से, आप HEAD~3 बजाय, केवल प्रतिबद्ध (या मूल / मास्टर जैसे संदर्भ) के हैश को मास्टर (/ वर्तमान) शाखा पर "वापस लौटना" चाहते हैं, उदाहरण के लिए:

git reset --hard a1b2c3d4

* 1 आप मास्टर शाखा से केवल "हारने" की काम करेंगे, लेकिन चिंता न करें, आप नए ब्रांच में काम करेंगे!

चेतावनी: गिट संस्करण 2.0 और उसके बाद, यदि आप बाद में मूल ( master ) शाखा पर नई शाखा को git rebase करते हैं, तो आपको ले जाने के दौरान रिबेज के दौरान एक स्पष्ट --no-fork-point विकल्प की आवश्यकता हो सकती है। branch.autosetuprebase always सेट होने से यह अधिक संभावना बन जाती है। विवरण के लिए जॉन मेलर का जवाब देखें।

मौजूदा शाखा में जा रहे हैं

यदि आप अपनी प्रतिबद्धताओं को मौजूदा शाखा में ले जाना चाहते हैं, तो यह इस तरह दिखेगा:

git checkout existingbranch
git merge master
git checkout master
git reset --hard HEAD~3 # Go back 3 commits. You *will* lose uncommitted work.
git checkout existingbranch




git git-commit