कहें कि मैंने अपनी कार्यशील निर्देशिका में परिवर्तन नहीं किए हैं। मैं बिना कमिटमेंट बनाए उन लोगों से एक पैच कैसे बना सकता हूं?
कहें कि मैंने अपनी कार्यशील निर्देशिका में परिवर्तन नहीं किए हैं। मैं बिना कमिटमेंट बनाए उन लोगों से एक पैच कैसे बना सकता हूं?
जवाबों:
git diff
अस्थिर परिवर्तनों के लिए। git diff --cached
मंचन परिवर्तनों के लिए।
git format-patch
इसमें बाइनरी डिफरेंसेस और कुछ मेटा जानकारी भी शामिल है। वास्तव में यह एक पैच बनाने के लिए सबसे अच्छा शर्त होगा, लेकिन यह केवल स्रोतों / परिवर्तनों में जाँच के लिए काम करता है, है ना?
git diff --relative
यदि आपने अभी तक परिवर्तन नहीं किए हैं, तो:
git diff > mypatch.patch
लेकिन कभी-कभी ऐसा होता है कि आपके द्वारा किया जा रहा सामान का वह हिस्सा नई फ़ाइलें होती हैं जो अनट्रैक की जाती हैं और आपके git diff
आउटपुट में नहीं होंगी । इसलिए, पैच करने का एक तरीका यह है कि एक नई कमिट ( git add
प्रत्येक फ़ाइल, या सिर्फ git add .
) के लिए सब कुछ स्टेज किया जाए , लेकिन कमिट न करें, और फिर:
git diff --cached > mypatch.patch
यदि आप बाइनरी फ़ाइलों को पैच में जोड़ना चाहते हैं तो 'बाइनरी' विकल्प जोड़ें (जैसे एमपी 3 फ़ाइलें):
git diff --cached --binary > mypatch.patch
आप बाद में पैच लागू कर सकते हैं:
git apply mypatch.patch
नोट: आप इसके --staged
पर्याय के रूप में भी उपयोग कर सकते हैं --cached
।
git diff --no-color
। अन्यथा, यह एन्कोडिंग समस्या की तरह दिखता है।
git diff
और git apply
पाठ फ़ाइलों के लिए काम करेगा, लेकिन बाइनरी फ़ाइलों के लिए काम नहीं करेगा।
आप आसानी से एक पूर्ण बाइनरी पैच बना सकते हैं, लेकिन आपको एक अस्थायी प्रतिबद्ध बनाना होगा। एक बार जब आप अपना अस्थायी कमिट बना लेते हैं, तो आप पैच बना सकते हैं:
git format-patch <options...>
पैच बनाने के बाद, यह कमांड चलाएँ:
git reset --mixed <SHA of commit *before* your working-changes commit(s)>
यह आपकी अस्थायी प्रतिबद्धताओं को वापस करेगा। अंतिम परिणाम आपकी कामकाजी प्रति (जानबूझकर) को उन परिवर्तनों के साथ गंदा छोड़ देता है जो आपके पास मूल रूप से थे।
प्राप्त किए गए पक्ष पर, आप एक ही चाल का उपयोग कर सकते हैं, जो प्रतिबद्ध इतिहास के बिना, कार्य की प्रतिलिपि में परिवर्तन लागू कर सकते हैं। बस पैच लागू करें (एस), और git reset --mixed <SHA of commit *before* the patches>
।
ध्यान दें कि काम करने के लिए इस पूरे विकल्प के लिए आपको अच्छी तरह से समन्वयित होना पड़ सकता है। मैंने पैच लगाने के दौरान कुछ त्रुटियां देखी हैं जब उन्हें बनाने वाला व्यक्ति उतने परिवर्तन नहीं खींच पाया जितना कि मेरे पास था। शायद इसे काम करने के तरीके हैं, लेकिन मैंने इसमें बहुत दूर नहीं देखा है।
यहां बताया गया है कि Tortoise Git में समान पैच कैसे बनाए जाएं (ऐसा नहीं है कि मैं उस टूल का उपयोग करने की सलाह देता हूं):
Tortoise Git
>> पर क्लिक करेंCreate Patch Serial
Since
: FETCH_HEAD
अगर आप अच्छी तरह से सिंक किए गए हैं काम करेंगे)Tortise Git
>> पर क्लिक करेंShow Log
reset "<branch>" to this...
Mixed
विकल्प चुनेंऔर उन्हें कैसे लागू करें:
Tortoise Git
>> पर क्लिक करेंApply Patch Serial
Tortise Git
>> पर क्लिक करेंShow Log
reset "<branch>" to this...
Mixed
विकल्प चुनेंसंशोधित और नई फ़ाइलों के साथ एक पैच बनाने के लिए (मंचन) आप चला सकते हैं:
git diff HEAD > file_name.patch
git diff --cached > mypatch.patch
काम नहीं कर रहा है।
file_name.patch
द्वारा उपयोग किया जा सकता है patch
? क्या वे एक दूसरे के साथ संगत हैं?
मुझे पसंद है:
git format-patch HEAD~<N>
जहां <N>
पैच के रूप में सहेजने के लिए अंतिम की संख्या है।
डीओसी में कमांड का उपयोग करने के तरीके का विवरण है
UPD
यहाँ आप पा सकते हैं कि उन्हें कैसे लागू किया जाए।
यूपीडी उन लोगों के लिए जिन्हें format-patch
ऐड उपनाम का विचार नहीं मिला :
git config --global alias.make-patch '!bash -c "cd ${GIT_PREFIX};git add .;git commit -m ''uncommited''; git format-patch HEAD~1; git reset HEAD~1"'
फिर अपने प्रोजेक्ट रिपॉजिटरी रन के किसी भी निर्देशिका में:
git make-patch
यह कमांड 0001-uncommited.patch
आपके वर्तमान डायरेक्टरी में बनेगी। पैच में वे सभी परिवर्तन और अनटैक की गई फाइलें होंगी जो अगले कमांड पर दिखाई देती हैं:
git status .
हम फ़ाइलों को भी निर्दिष्ट कर सकते हैं, केवल सापेक्ष परिवर्तनों वाली फ़ाइलों को शामिल करने के लिए, विशेष रूप से जब वे कई निर्देशिकाओं का विस्तार करते हैं
git diff ~/path1/file1.ext ~/path2/file2.ext...fileN.ext > ~/whatever_path/whatever_name.patch
मैंने पाया कि यह उत्तर या टिप्पणियों में निर्दिष्ट नहीं है, जो सभी प्रासंगिक और सही हैं, इसलिए इसे जोड़ने के लिए चुना गया। निहितार्थ की तुलना में स्पष्ट है!