2011-01-06 4 views
123

मैं कुछ बहुत ही गलत गलत कर रहा हूं। मैं एक साधारण पैच फ़ाइल तैयार करने के लिए कोशिश कर रहा हूँ, इसलिए मैं कुछ परिवर्तन पुन: लागू कर सकते हैं:क्या मुझे गिट-डिफ से पैच-संगत आउटपुट मिल सकता है?

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

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

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

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

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

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

$ git stash 
$ git merge 
$ git stash pop 
+7

तो ऐसा कोई कारण आप विशेष रूप से 'patch' बजाय' Git apply' का उपयोग करना चाहते है? –

+2

और फिर भी, क्या आपको वास्तव में 'गिट स्टेश' या अन्य गिट टूल्स की तरह पैच की आवश्यकता है? –

+2

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

उत्तर

104

आप पैच आप a/b/ उपसर्गों कि Git डिफ़ॉल्ट रूप से उपयोग करता है हटाने की जरूरत उपयोग करना चाहते हैं। आप --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 
+3

'गिट diff --no-prefix master> diff.patch' और फिर 'गिट चेकआउट मास्टर'' पैच -p0 Natim

+0

@Natim अंतिम सुरक्षा के लिए मैं 'पैच - ड्राय-रन

+1

@ ᴠɪɴᴄᴇɴᴛ ऐसा करने का क्या फायदा होगा? चूंकि हम गिट का उपयोग कर रहे हैं, इसलिए हम कुछ भी खोने की संभावना नहीं है? – Natim

15

Git diffs एक अतिरिक्त पथ खंड फ़ाइल पथ के लिए prepended है।तुम्हें पता है, पैच के साथ -P1 निर्दिष्ट द्वारा रास्ते में इस प्रविष्टि पट्टी कर सकते हैं ताकि तरह:

patch -p1 < save.patch 
175

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

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

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

यदि आप सोच रहे हैं कि क्यों, [मैन डॉक्स] (http://www.gnu.org/software/diffutils/manual/diffutils.html#patch- निर्देशिकाएं) इसे अच्छी तरह से बताता है - [स्रोत] (http://unix.stackexchange.com/a/26502/17836)। – tutuDajuju

7

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

Git diff | -d [डीएसटी-निर्देशिका] -P1 पैच

+0

बिल्कुल वही जो मैं चाहता था। स्टैश के साथ पूरी तरह से काम करता है! 'गिट स्टैश शो -पी स्टैश @ {3} | पैच -पी 1-डी [डीएसटी-डीआईआर] ' – dtmland

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

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

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

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

+0

ओह ने 4 साल पुराना नहीं देखा: पी। बीटीडब्ल्यू, रीसेट है बस यह प्रदर्शित करने के लिए काम करता है ..मैं किसी भी 'गिट लागू' का उपयोग करके किसी भी व्यक्ति को नहीं देखता या आपके राज्य के लिए अलग-अलग अंतर और उपलब्ध अंतिम प्रतिबद्धता के सूचक को नहीं देखता। सिर्फ 'गिट diff' करने से कुछ भी नहीं किया गया है –

+0

हाँ, अब मुझे आश्चर्य है कि मुझे' गिट आवेदन 'के बारे में पता चला। 'गीट रीफ 'के साथ बात (मुझे लगता है)' गीट रीसेट 'का उपयोग करने से है - रेपो, इंडेक्स और वर्किंग एरिया के बीच संबंध मुद्दे हैं। – Malvolio

संबंधित मुद्दे