क्या मुझे git-diff से पैच-संगत आउटपुट मिल सकता है?


160

मैं कुछ बहुत ही गलत गलत कर रहा हूं। मैं एक साधारण पैच फ़ाइल तैयार करने की कोशिश कर रहा हूं, इसलिए मैं कुछ बदलावों को फिर से लागू कर सकता हूं:

$ git diff > before
$ git diff something_here > save.patch
$ git checkout . 
$ patch < save.patch
$ git diff > after
$ diff before after
$

something_here रिक्त के साथ यह लगभग काम करता है, लेकिन फ़ाइल नाम सही नहीं हैं। मुझे लगता है कि मैं बस कुछ विकल्प याद कर रहा हूं।

वास्तविक जीवन में, मैं चेकआउट के बाद मर्ज करने जा रहा हूं, इसलिए पैच वहां विफल हो सकता है, लेकिन आप देखते हैं कि मुझे क्या मिल रहा है।

गलत प्रश्न पूछने के लिए मेरी गलती को संपादित करें । वास्तविक सवाल यह है कि मैं अपने परिवर्तनों को दूर करना चाहता हूं, एक मर्ज करना चाहता हूं, फिर यदि संभव हो तो परिवर्तनों को फिर से लागू करें? मैंने इसे गलत तरीके से पूछा क्योंकि मैं इन प्रकार की समस्याओं को हल करने के लिए पैच का उपयोग करने के लिए उपयोग किया जाता हूं और git diffऐसा लगता है कि यह वही है जो मुझे करना चाहता था।

चार्ल्स बेली की टिप्पणी का सही उत्तर था। मेरे लिए, git-apply करना सही बात है (git-stash मुझे ज़रूरत से ज़्यादा भारी-भरकम लगता है और रिबासिंग और बंडल निश्चित रूप से मेरे वर्तमान कौशल स्तर से परे है।) मैं चार्ल्स द्वारा दिए गए उत्तर को स्वीकार करने जा रहा हूं (क्योंकि आप एक टिप्पणी स्वीकार नहीं कर सकते)। सभी सुझावों के लिए शुक्रिया।

संपादित करें, 6 साल बाद जैसा कि विषय से परिचित कोई भी जानता है, मैंने कठिनाई का अनुमान लगाया git stash। बहुत अधिक हर दिन या तो, मैं निम्नलिखित अनुक्रम का उपयोग करेगा:

$ git stash
$ git merge
$ git stash pop

8
क्या कोई कारण है जो आप विशेष रूप patchसे बजाय उपयोग करना चाहते हैं git apply?
सीबी बेली

3
और फिर भी, क्या आपको वास्तव में कुछ जैसे git stashया अन्य गिट टूल के बजाय पैच की आवश्यकता है ?
सीबी बेली

3
पोस्ट-एडिट, मुझे लगता है कि git stashआप जो करने की कोशिश कर रहे हैं, उसके लिए सबसे आसान समाधान है, लेकिन उस काम के बहुत सारे दृष्टिकोण हैं।
सीबी बेली

1
@ मालवियो: वास्तव में यह है, आपको अपने पैच को स्टोर करने के लिए एक अस्थायी फ़ाइल नाम के बारे में सोचना भी नहीं चाहिए।
CB Bailey

4
@Charlse, कभी-कभी आपको पूरे गिट रिपॉजिटरी के बिना किसी को एक पैच भेजने की आवश्यकता होती है। उदाहरण के लिए यदि उपयोग कर रहे हैं git-svn
एलजार लीबोविच

जवाबों:


139

यदि आप पैच का उपयोग करना चाहते हैं, तो आपको उन a/ b/उपसर्गों को हटाने की आवश्यकता है जो डिफ़ॉल्ट रूप से उपयोग करता है। आप इसे --no-prefixविकल्प के साथ कर सकते हैं (आप पैच के -pविकल्प के साथ भी ऐसा कर सकते हैं ):

git diff --no-prefix [<other git-diff arguments>]

आमतौर पर हालांकि, सीधे उपयोग करना आसान होता है git diffऔर फिर आउटपुट को फीड करने के लिए उपयोग किया जाता है git apply

ज्यादातर समय मैं पाठकीय पैच का उपयोग करने से बचने की कोशिश करता हूं। आमतौर पर एक या एक से अधिक अस्थायी आवागमन को रिबास के साथ जोड़ा जाता है,git stash होते हैं और बंडलों को प्रबंधित करना आसान होता है।

आपके उपयोग के मामले में मुझे लगता है कि stashयह सबसे उपयुक्त है।

# save uncommitted changes
git stash

# do a merge or some other operation
git merge some-branch

# re-apply changes, removing stash if successful
# (you may be asked to resolve conflicts).
git stash pop

7
git diff --no-prefix master > diff.patchऔर फिरgit checkout master patch -p0 < diff.patch
नटिम

1
@ अंतिम सुरक्षा के लिए मैं patch --dry-run < diff.patchअंतिम आदेश जारी करने से पहले उपयोग करने की सलाह दूंगा ।
55

1
@ be ऐसा करने से क्या लाभ होगा? चूंकि हम git का उपयोग कर रहे हैं इसलिए हम कुछ भी ढीला होने की संभावना नहीं है?
नटिम

1
@ नैटिम जैसा कि मैंने कहा, केवल परम सुरक्षा के लिए, त्रुटि के मामले में कुछ भी पूर्ववत करने की आवश्यकता नहीं है। मैं उन लोगों के बारे में भी सोच रहा था जो इसे पढ़ते हैं और अधिक सामान्य उपयोग के मामले patchमें git के बाहर उपयोग करना चाहते हैं (शायद द्वारा उत्पन्न पैच फ़ाइल का उपयोग करके diff)।

अपने पैच में नई फ़ाइलों को शामिल करने के लिए आपको पैच में "git diff --no-prefix --cached" भी शामिल करना होगा। शायद एक बेहतर तरीका है?
जामशीद

219

बस का उपयोग करें -p1: आप वैसे भी मामले -p0में उपयोग करने की आवश्यकता होगी --no-prefix, तो आप बस बाहर छोड़ सकते हैं --no-prefixऔर उपयोग कर सकते हैं -p1:

$ git diff > save.patch
$ patch -p1 < save.patch

$ git diff --no-prefix > save.patch
$ patch -p0 < save.patch

1
यदि आप सोच रहे हैं कि, आदमी डॉक्स को अच्छी तरह से क्यों सोता है - स्रोत
tutuDajuju

3
यह नाम बदलने के साथ काम नहीं करेगा; git diffएक लाइन को आउटपुट patchकरता है जो अनदेखा करता है। git applyजाने का रास्ता है।
hraban

17

गिट डिफरेंसेस में फाइल पाथ से पहले एक अतिरिक्त पथ खंड होता है। आप इस प्रविष्टि को पथ में निर्दिष्ट कर सकते हैं -p1 पैच के साथ, जैसे:

patch -p1 < save.patch

10
  1. मैं वर्तमान निर्देशिका के वर्तमान (अप्रभावित फ़ाइलों सहित) के अंतर को बचाता हूं।
  2. तब आप save.patchफ़ाइल को जहाँ भी (बाइनरी फ़ाइलों सहित) पहुँचा सकते हैं।
  3. अपने लक्ष्य मशीन पर, पैच का उपयोग करके लागू करें git apply <file>

नोट: यह अलग है वर्तमान में मंचन फ़ाइलें भी।

$ git diff --binary --staged HEAD > save.patch
$ git reset --hard
$ <transport it>
$ git apply save.patch

Hahaha। अजीब बात है। मैंने यह सवाल लगभग चार साल पहले पूछा था और जिस तरह से मैं कर रहा हूं वह विकसित हुआ है, लेकिन अगर आपने मुझसे पूछा कि कल यह कैसे करना है, तो मैंने आपका जवाब दिया होगा और कहा था कि मुझे इस सवाल के जवाब मिल गए हैं। (वास्तव में मैं शायद एक नंगे git diff > save.patchऔर git checkout .एक रीसेट के बजाय का उपयोग करेगा , लेकिन हाँ ...
मालवोलियो

ओह अपने 4 साल पुराने नहीं देखा: पी। Btw, रीसेट बस यह प्रदर्शित करने के लिए काम करता है .. मैं भी किसी का उपयोग करते हुए git applyया अपने राज्य और अंतिम उपलब्ध उपलब्ध सूचक के लिए प्रासंगिक बनाने के लिए नहीं देख रहा हूँ । अभी git diffकुछ भी नहीं किया है
Matej

हाँ, अब मुझे आश्चर्य है कि मुझे कैसे पता चला git apply। उपयोग करने के साथ git diff(मुझे लगता है) के साथ बात है git reset- रेपो, सूचकांक और कार्य क्षेत्र के बीच संबंध मुद्दा हैं।
मालवोलियो

8

अस्थायी पैच फ़ाइलें बनाने से बचने के लिए एक उपयोगी ट्रिक:

git diff | patch -p1 -d [dst-dir]

बिल्कुल वही जो मैं चाहता था। यह भी पूरी तरह से काम करता है! git stash show -p stash@{3} | patch -p1 -d [dst-dir]
dtmland
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.