गिट संस्करण नियंत्रण में एक पैच क्या है?


137

मैं git और संस्करण नियंत्रण दोनों के लिए नया हूं, इसलिए मैं यह पता लगाने की कोशिश कर रहा हूं कि पैच क्या है और यह उन सभी गतिविधियों से अलग है जो मैं git में करता हूं?

मैं एक पैच कब लगाऊं? क्या यह हर बार जब मैं करता हूं?

जवाबों:


116

आप इस ब्लॉग पोस्ट में देख सकते हैं कि आप एक पैच कैसे बना सकते हैं (उन परिवर्तनों का संग्रह जो आप किसी अन्य रेपो से संवाद और लागू करना चाहते हैं)

गिट पैच
(2008 ब्लॉग पोस्ट से तस्वीर " Git साथ Bioruby: कैसे होगा कि काम ", द्वारा प्रकाशित जनवरी AERTS )

एक अन्य ठोस उदाहरण के रूप में गिट के साथ रेल का योगदान भी देखें ।

आजकल, GitHub पुल अनुरोध GitHub repos पर पैच को लागू करना वास्तव में आसान बनाता है , जो तब उपयोगी होता है जब आप प्रत्यक्ष योगदानकर्ता नहीं होते हैं (यानी आपको सीधे रेपो पर पुश करने का कोई अधिकार नहीं है)।
दरअसल, हाल ही में GitHub ने नए पैच की सूचना में सुधार करने के लिए " बेहतर पुल अनुरोध ईमेल " पेश किया।


4
एक अच्छा जवाब, और एक जो मुझे बताता है कि एक जीआईटी 'पैच' वह नहीं है जिसकी मुझे तलाश है।
RonLugge

91

पैच एक यूनिक्स कार्यक्रम है जो एक अलग फ़ाइल में निहित निर्देशों के अनुसार पाठ फ़ाइलों को अद्यतन करता है, जिसे पैच फ़ाइल कहा जाता है।

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

अब, पैच फाइल क्या है? मान लें कि आपके पास 2 पंक्तियों के साथ एक पाठ फ़ाइल है:

This is line A.
This is line B, or otherwise #2.

तब आप पहली पंक्ति बदलते हैं, और अब आपकी फ़ाइल इस तरह दिखती है:

This is SPARTA.
This is line B, or otherwise #2.

आप फ़ाइल की सामग्री में परिवर्तन का वर्णन कैसे करेंगे? आप कह सकते हैं कि पहली पंक्ति "यह लाइन ए है।" "यह SPARTA" है, या यहां तक ​​कि पहली पंक्ति के अंतिम शब्द "A" को दूसरे शब्द "SPARTA" से बदल दिया गया। और वह वास्तव में क्या है अंतर हमें बताता है। मान लें कि मेरे पास इस फ़ाइल के दो संस्करण हैं, एक को file1.txt और दूसरे को file2.txt कहा जाता है, फिर मैं अंतर चलाता हूं और इसे प्राप्त करता हूं:

$ diff -u file1.txt file2.txt 
--- file1.txt   2011-11-26 11:07:03.131010360 -0500
+++ file2.txt   2011-11-26 11:07:13.171010362 -0500
@@ -1,2 +1,2 @@
-This is line A.
+This is SPARTA.
 This is line B, or otherwise #2.

परिवर्तनों का विवरण होने पर, आप इसे प्रारंभिक सामग्री पर लागू कर सकते हैं और संशोधित सामग्री प्राप्त कर सकते हैं। और उन बदलावों को एकीकृत प्रारूप में रखा गया है जो "पैच" जैसे प्रोग्राम समझ सकते हैं, उन्हें पैच फ़ाइल कहा जाता है। यह ऐसा है जैसे वे किसी से मछली प्राप्त करने के बजाय आपको सिखाते हैं कि आप मछली कैसे बनाते हैं, ताकि आप स्वयं उस मछली को पानी से बाहर निकाल सकें। अब, यह फ़ाइल2.txt के लिए हमारे पैच लागू करते हैं ताकि यह बिल्कुल file2.txt की तरह दिखाई दे:

$ cat file1.txt 
This is line A.
This is line B, or otherwise #2.
$ cat file2.txt 
This is SPARTA.
This is line B, or otherwise #2.
$ diff -u file1.txt file2.txt > changes.patch
$ cat changes.patch 
--- file1.txt   2011-11-26 11:09:38.651010370 -0500
+++ file2.txt   2011-11-26 11:07:13.171010362 -0500
@@ -1,2 +1,2 @@
-This is line A.
+This is SPARTA.
 This is line B, or otherwise #2.
$ patch < changes.patch 
patching file file1.txt
$ cat file1.txt 
This is SPARTA.
This is line B, or otherwise #2.
$ 

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

जब git के संदर्भ में बात की जाती है, तो पैच फ़ाइल का अर्थ अभी भी एक ही होता है, लेकिन diff + पैच का उपयोग करना एक बुरा सपना होगा। उदाहरण के लिए, आपको उनकी तुलना करने के लिए हमेशा फ़ाइल के दो संस्करण (या संपूर्ण रिपॉजिटरी) की जाँच करनी होगी। क्या यह अच्छा नहीं लगता है? तो git आपके लिए सभी कड़ी मेहनत का ख्याल रखता है - यह आपकी स्थानीय फ़ाइल की तुलना उस स्थान के साथ करता है, जिसमें आप जिस रिपॉजिटरी में काम कर रहे हैं, वहाँ है, और इसे "अंतर" के रूप में आपको दिखा सकता है, या "diff" को एक के रूप में लागू कर सकता है पैच aka आपके परिवर्तन करता है, या आपको कुछ पैच फ़ाइल भी लागू करने देता है जो आपके पास पहले से हैं। विवरण में गहराई से जाने के बिना, इस अर्थ में गिट बिल्कुल अन्य संस्करण नियंत्रण प्रणाली जैसे कि एसवीएन, या यहां तक ​​कि सीवीएस या पेरफोर्स के समान है।

आशा करता हूँ की ये काम करेगा!


कभी नहीं पता था कि निर्मित patchकार्यक्रम का उपयोग करता है । मुझे लगा कि जीआईटी का अपना कार्यान्वयन है।
रेडिएंटशॉ सेप

43

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

यह वास्तव में मुख्य रूप से एक सुरक्षा चीज है (कम से कम, यही लोग इसका उपयोग करते हैं)।


1
अतिरिक्त जानकारी: जबकि git आंतरिक रूप से पैच का उपयोग नहीं करता है, git के लिए एक डिज़ाइन लक्ष्य पैच का आदान-प्रदान करना आसान बनाता है (क्योंकि कई परियोजनाएं इस तरह से काम करती हैं, जैसे कि लिनक्स और खुद git)। तो git में पैच से निपटने के लिए विशेष कमांड हैं ( git diffडिफ़ॉल्ट रूप से पैच के रूप में परिवर्तन दिखाता है, git applyआपको पैच इत्यादि लागू करने देता है)।
१०

Congratullations! आपने वास्तव में इसका उपयोग किस पैच के लिए किया जाता है, इसके बारे में किसी को नहीं बताया है, जो कि रिपॉजिटरी में परिवर्तन प्रस्तुत करने का एक साधन है, जिसमें परिवर्तनों के लेखक की कोई लिखित पहुंच नहीं है। इसलिए, गीथहब का कांटा और पुल अनुरोध मॉडल परिवर्तन वितरण के पैच मॉडल के लिए एक प्रतिस्थापन है। इसलिए मेरा मानना ​​है कि गीथहब जैसे उपकरणों के संदर्भ में पैच केवल उपयोगी हैं।
mljrg

8

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

git diff > mypatch.patch

यदि आपके पास अपनी रिपॉजिटरी (अनट्रैक) में नई फाइलें हैं, तो आपको एक पैच बनाने से पहले फाइल को स्टेज करना चाहिए (कमिट नहीं करें), और निम्न कमांड का उपयोग करें

git diff --cached > mypatch.patch 

आप बाद में पैच लागू कर सकते हैं:

git apply mypatch.patch

यदि आप गिट रिपॉजिटरी में कुछ बदलाव करना चाहते हैं, तो आपके पास लिखित अनुमति नहीं है, बस बदलाव करें और दोनों के बीच एक पैच बनाएं, और पैच को किसी को भेजें जिसे पैच लगाने की अनुमति है, इसके द्वारा आपके परिवर्तन उस गिट रिपॉजिटरी में जोड़े जाने चाहिए।


बेहतर डेमो: robots.thoughtbot.com/… । मेरा मूल उदाहरण सारांश: git format-patch <base_commit_or_branch_name>= अब से सभी कमिटों को रैप करें <bas_commit_or_branch_name> अच्छी और साफ-सुथरी फाइलों में, साथ ही साथ कमिट मैसेजेस के लिए, आसानी से भेजने (पूर्व: ईमेल के माध्यम से) किसी और को उन्हें पैच करना चाहते हैं। उनका कोड आधार। तब प्राप्तकर्ता आपकी फाइल के साथ अपने सिस्टम को पैच करता है:cat *.patch | git am
गेब्रियल स्टेपल्स

7

पैच एक या एक से अधिक फ़ाइलों के बीच अंतर का एक सेट है, यह दिखाने के लिए कि उनके बीच क्या अलग है। आप आमतौर पर किसी को दिखाने के लिए केवल एक पैच उत्पन्न करेंगे जो आपने बदल दिया है। जब आप ऐसा कर सकते हैं तो इसका एक उदाहरण है जब आप किसी ओपन सोर्स एप्लिकेशन में बग ढूंढते हैं और ठीक करते हैं और फिर उनके बग ट्रैकर पर फिक्स पोस्ट करते हैं।

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