वर्तमान कार्य निर्देशिका में परिवर्तन से एक गिट पैच बनाएँ


878

कहें कि मैंने अपनी कार्यशील निर्देशिका में परिवर्तन नहीं किए हैं। मैं बिना कमिटमेंट बनाए उन लोगों से एक पैच कैसे बना सकता हूं?


29
स्वीकृत उत्तर को संभवतः बदल दिया जाना चाहिए, दूसरा उत्तर दिया जाना लगभग चार गुना अधिक लोकप्रिय है।
टिम ओगिल्वी

5
@ टिममोइवी सहमत हो गए। ओपी को करना चाहिए। दूसरा उत्तर कहीं अधिक लोकप्रिय है और अधिक जानकारी देता है
जॉन डेमेट्रियो

1
मुझे लगता है कि यह उल्लेख करने के लायक है कि आपको शीर्षक में असम्बद्ध परिवर्तनों से पैच की आवश्यकता है।
2i3r

जवाबों:


401

git diffअस्थिर परिवर्तनों के लिए। git diff --cachedमंचन परिवर्तनों के लिए।


12
yup, git diff, git apply का विलोम है
Spike Gronim

33
git format-patchइसमें बाइनरी डिफरेंसेस और कुछ मेटा जानकारी भी शामिल है। वास्तव में यह एक पैच बनाने के लिए सबसे अच्छा शर्त होगा, लेकिन यह केवल स्रोतों / परिवर्तनों में जाँच के लिए काम करता है, है ना?
एरिक

20
कभी-कभी वर्तमान निर्देशिका के सापेक्ष पैच बनाने के लिए यह उपयोगी हो सकता है। इसे प्राप्त करने के लिए, प्रयोग करेंgit diff --relative
ejboy

30
git diff> a.patch इसे फाइल में लिखने के लिए
qasimzee

139
टाल बॉर्डर पर व्यंग्यात्मक, नीचे दिया गया उत्तर अधिक सहायक है।
एयर

1864

यदि आपने अभी तक परिवर्तन नहीं किए हैं, तो:

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


127
उदाहरण के लिए बहुत बहुत धन्यवाद। जैसा कि स्वीकार किए गए जवाब के विपरीत आप कमांड दिखाते हैं कि यह कैसे करना है और सिर्फ बात नहीं करना है। मेरे लिए बहुत उपयोगी और निर्दोष काम :)
nuala

4
मैंने ठीक वैसा ही किया और मुझे "घातक: गैर-मान्यता प्राप्त इनपुट" मिल गया, जो लागू होने पर लागू होता है। किसी भी विचार से यह क्या हो सकता है और इसे कैसे ठीक किया जाए?
विटाली

6
यदि आप इसे एक पाठ संपादक के साथ खोलते हैं तो @Vitaly: क्या आपका पैच पठनीय है? यह किसी भी अजीब अक्षर से साफ नहीं होना चाहिए, उदाहरण के लिए यदि color.diff सेटिंग सेट है तो आपके पैच में कुछ 'रंग वर्ण' होंगे जो 'git लागू' को विफल कर सकते हैं, उस स्थिति में प्रयास करें git diff --no-color। अन्यथा, यह एन्कोडिंग समस्या की तरह दिखता है।
जकार्बलो

3
"नई फ़ाइलें जो अनट्रैक की गई हैं" से संबंधित हैं: "git diff" और "git diff --cached" केवल तभी काम करते हैं यदि "git add <file>" को पहले बुलाया गया हो। (मैं नया हूं और सोचता हूं कि मुझे हर बार एक खाली पैच क्यों मिला)
बेनामी

5
यह मुझे एक अजीब मर्ज / विद्रोह नरक से बहुत आसानी से मिल गया, धन्यवाद :)
जॉन हंट

86

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 में समान पैच कैसे बनाए जाएं (ऐसा नहीं है कि मैं उस टूल का उपयोग करने की सलाह देता हूं):

  1. अपने काम में बदलाव करें
  2. ब्रांच रूट डायरेक्टरी पर राइट क्लिक करें और Tortoise Git>> पर क्लिक करेंCreate Patch Serial
    1. लेकर जो भी बनाता है भावना चुनें ( Since: FETCH_HEADअगर आप अच्छी तरह से सिंक किए गए हैं काम करेंगे)
    2. पैच बनाएँ
  3. ब्रांच रूट डायरेक्टरी पर राइट क्लिक करें और Tortise Git>> पर क्लिक करेंShow Log
  4. अधिकार के लिए प्रतिबद्ध क्लिक करने से पहले अपने अस्थायी प्रतिबद्ध (रों), और क्लिकreset "<branch>" to this...
  5. Mixedविकल्प चुनें

और उन्हें कैसे लागू करें:

  1. ब्रांच रूट डायरेक्टरी पर राइट क्लिक करें और Tortoise Git>> पर क्लिक करेंApply Patch Serial
  2. सही पैच का चयन करें और उन्हें लागू करें
  3. ब्रांच रूट डायरेक्टरी पर राइट क्लिक करें और Tortise Git>> पर क्लिक करेंShow Log
  4. पैच के कमिट करने से पहले कमिट पर क्लिक करें और क्लिक करेंreset "<branch>" to this...
  5. Mixedविकल्प चुनें

5
तकनीकी रूप से इसके लिए एक कमेटी बनाने की आवश्यकता होती है, जिसे ओपी ने बचने के लिए कहा हो, लेकिन यह एक अस्थायी है और इसका जवाब उपयोगी है।
davenpcj

33

संशोधित और नई फ़ाइलों के साथ एक पैच बनाने के लिए (मंचन) आप चला सकते हैं:

git diff HEAD > file_name.patch

धन्यवाद, मेरे मामले में, यह उत्तर काम करता है, लेकिन git diff --cached > mypatch.patchकाम नहीं कर रहा है।
खनन

मेरे पास एक सवाल है: कमांड file_name.patchद्वारा उपयोग किया जा सकता है patch? क्या वे एक दूसरे के साथ संगत हैं?
रक्षार्थ रवि

git diff + git diff --cached / staged == git diff HEAD (अंतिम प्रतिबद्ध के बाद से सभी बदलाव दिखाएं)
। प्रतीक

20

मुझे पसंद है:

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 .

@jcarballo: मैंने जवाब अपडेट कर दिया है। बेझिझक मुझे किसी भी नोटिस को छोड़ दो।
यूजेन कोनकोव

2
एक कमिट बनाने और अनकमिट करने का एक सरल तरीका है। git diff --cached --binary
गौरव अग्रवाल

9

यदि आप बाइनरी करना चाहते हैं, तो --binaryजब आप दौड़ते हैं तो एक विकल्प दें git diff


0

हम फ़ाइलों को भी निर्दिष्ट कर सकते हैं, केवल सापेक्ष परिवर्तनों वाली फ़ाइलों को शामिल करने के लिए, विशेष रूप से जब वे कई निर्देशिकाओं का विस्तार करते हैं

git diff ~/path1/file1.ext ~/path2/file2.ext...fileN.ext > ~/whatever_path/whatever_name.patch

मैंने पाया कि यह उत्तर या टिप्पणियों में निर्दिष्ट नहीं है, जो सभी प्रासंगिक और सही हैं, इसलिए इसे जोड़ने के लिए चुना गया। निहितार्थ की तुलना में स्पष्ट है!

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