'गिट फॉर्मेट-पैच और' गिट डिफरेंस 'में क्या अंतर है?


92

मुझे 'git फॉर्मेट-पैच' और 'git diff' के आउटपुट में कोई अंतर नहीं दिखता है, क्या कोई है? और क्या मैं एक पैच बनाने के लिए 'git diff' का उपयोग नहीं कर पाऊंगा और फिर इसे git apply का उपयोग करके लागू करूँगा?

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

git diff --cached > index.patch

जवाबों:


129

साथ बनाए गए एक पैच git format-patchमें कमिट (कमिट, डेट, कमिट मैसेज, ...) के बारे में कुछ मेटा-जानकारी भी शामिल होगी और इसमें बाइनरी डेटा का अंतर होगा। सब कुछ एक मेल के रूप में स्वरूपित किया जाएगा, ताकि इसे आसानी से भेजा जा सके। जो व्यक्ति इसे प्राप्त करता है, वह इसके साथ संबंधित प्रतिबद्ध को फिर से बना सकता है git amऔर सभी मेटा-डेटा बरकरार रहेगा। यह git applyएक साधारण अंतर का एक सुपर-सेट होने के साथ भी लागू किया जा सकता है ।

एक पैच के git diffसाथ संदर्भ (विचार diff -u) के साथ एक सरल अंतर होगा । इसके साथ भी आवेदन किया जा सकता है git applyलेकिन मेटा-डेटा को फिर से बनाया नहीं जाएगा (क्योंकि वे मौजूद नहीं हैं)।

संक्षेप में, git format-patchएक प्रतिबद्ध प्रेषित git diffकरने के लिए उपयोगी है , जबकि दो पेड़ों के बीच एक अंतर प्राप्त करने के लिए उपयोगी है।


12

मैनुअल से गिट-फॉर्मेट-पैच ईमेल प्रस्तुत करने के लिए उपयुक्त पैच तैयार करता है, जबकि गिट-डिफरेंस परिवर्तन दिखाता है।

वे दो अलग-अलग चीजें हैं और अलग-अलग उद्देश्य हैं, वे सिर्फ एक पैच प्रारूप का उत्पादन करते हैं। लेकिन git-format-patchएक कमिट (डेट, ऑथर, कमिट मैसेज) के बारे में डेटा जोड़ता है और इसे एक ऐसे प्रारूप में बाँधता है जो यूनिक्स मेल संदेश के रूप में भेजने के लिए उपयुक्त है (हालाँकि ये सिर्फ फाइलें हैं, इसलिए इन्हें अन्य तरीकों से भेजा जा सकता है और फिर भी इसे लागू किया जा सकता है Git-am)।

git-format-patchआपके द्वारा निर्दिष्ट सीमा में प्रत्येक कमिट के लिए एक पैच फ़ाइल भी बनाता है। इन परिवर्तनों को आपकी रिपॉजिटरी के साथ आने पर जोड़ा जाएगा git-am

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

और हाँ, आप इस तरह से अपने सूचकांक के लिए एक पैच बना सकते हैं।


धन्यवाद। UNIX मेल के बारे में क्या खास है ताकि उन्होंने इसके आधार पर पैच को डिजाइन किया?
रफीद R

7
वास्तव में कुछ खास नहीं है। यह सिर्फ गित लिनस टोरवाल्ड्स द्वारा डिज़ाइन किया गया था, जिनके वर्कफ़्लो में लिनक्स कर्नेल में एकीकरण से पहले सत्यापन के लिए ईमेल द्वारा पैच भेजना और प्राप्त करना शामिल था।
सिल्वेन डेफ्रेसने

लिनक्स लिनक्स कर्नेल को रखने के लिए लिनस टोरवाल्ड्स द्वारा गिट डिजाइन किया गया था । यूनिक्स मेल एक सामान्य प्रारूप था।
अबिज़र्न

1

पैच फ़ाइल को git diffकमांड के साथ उत्पन्न किया जा सकता है , लेकिन git format-patchकमांड द्वारा उत्पन्न पैच के साथ तुलना करते हुए , प्रमुख अंतर हैं:

  1. किसी कमिटमेंट के बारे में कोई मेटाडेटा नहीं है (जैसे दिनांक, लेखक, प्रतिबद्ध संदेश, आदि);
  2. अंतर के बारे में कोई आंकड़े (डिस्फ़ास्टैट, जैसे कि एक्स फाइलें नहीं बदली गईं, y सम्मिलन (+), z विलोपन (-));
  3. कोई भी द्विआधारी भिन्न नहीं होता है, केवल पाठ्य भिन्न होता है।

यहां छवि विवरण दर्ज करें

सभी परिवर्तित फ़ाइलों के लिए पैच फ़ाइल (इंडेक्स या वर्किंग डायरेक्टरी में) उत्पन्न करने के लिए:

git diff HEAD --binary > my.patch
# git diff + git diff --cached/staged == git diff HEAD

उत्पन्न पैच फ़ाइल को लागू करने के लिए:

# restore the changed files firstly
git restore --staged .
git restore .

# apply the patch to redo the changes 
git apply my.patch
# or
patch -p1 < my.patch
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.