मैं एकीकृत अंतर फ़ाइल में प्रति-वर्ण अंतर की कल्पना कैसे कर सकता हूं?


122

कहते हैं, मुझे एक पैच बनाया गया है git format-patch। फ़ाइल मूल रूप से कुछ मेटाडेटा के साथ एकीकृत रूप है। यदि मैं फ़ाइल को विम में खोलता हूं, तो मैं देख सकता हूं कि कौन सी पंक्तियों को संशोधित किया गया है, लेकिन मैं नहीं देख सकता कि परिवर्तित लाइनों में कौन से वर्ण भिन्न हैं। किसी को भी एक तरह से पता है (विम में, या कुछ अन्य मुफ्त सॉफ्टवेयर जो उबंटू पर चलता है) प्रति चरित्र अंतर की कल्पना करने के लिए?

एक काउंटर उदाहरण जहां प्रति-वर्ण भिन्न होता है, कल्पना करते समय निष्पादित होता है vimdiff a b

अपडेट शुक्र नवंबर 12 22:36:23 यूटीसी 2010

परिदृश्य उस परिदृश्य के लिए सहायक है जहाँ आप एक फ़ाइल के साथ काम कर रहे हैं।

अपडेट थू जून 16 17:56:10 यूटीसी 2016

की जाँच करें Git 2.9 में अंतर-प्रकाश डाला । यह स्क्रिप्ट वही करती है जो मैं मूल रूप से चाह रहा था।


यह superuser.com पर बेहतर हो सकता है
डेन्थ

13
शायद। मैंने stackoverflow.com को चुना क्योंकि एफएक्यू में कहा गया है कि यह "प्रोग्रामर्स द्वारा आमतौर पर उपयोग किए जाने वाले सॉफ़्टवेयर टूल" के बारे में प्रश्नों के लिए जगह है
एडम मोन्सन

7
मुझे यकीन नहीं है कि यह सीधे आपके सवाल का जवाब देता है, लेकिन git diff --color-wordsयह देखने के लिए बहुत उपयोगी है कि सामान्य एकीकृत अंतर आउटपुट के बजाय लाइनों के भीतर क्या शब्द बदल गए हैं। यह वर्ण-आधारित होने के बजाय शब्द-आधारित है, हालांकि, यदि आप जिस सामग्री को अलग-अलग कर रहे हैं, उसमें बहुत अधिक व्हाट्सएप नहीं है, तो आउटपुट कम साफ-सुथरा हो सकता है। (संपादित: उफ़, मैं देख रहा हूं कि आप जो कुछ भी पूछ रहे हैं, मैं उसे गलत समझ रहा हूं - फिर भी शायद यह टिप्पणी किसी के लिए उपयोगी होगी।)
मार्क लॉन्गेयर

जवाबों:


13

प्रश्न में विम के आपके संदर्भों को देखते हुए, मुझे यकीन नहीं है कि यह उत्तर आप चाहते हैं :) लेकिन Emacs ऐसा कर सकते हैं। Diff युक्त फ़ाइल खोलें, सुनिश्चित करें कि आप में कर रहे हैं diff-mode(यदि फ़ाइल का नाम है foo.diffया foo.patchनहीं तो टाइप करें यह अपने आप होता है M-x diff-mode RET, हंक आप में रुचि रखने वाले और मारा जाता है पर जाने के लिए) C-c C-bके लिए refine-hunk। या फ़ाइल के माध्यम से एक बार में एक हंक के माध्यम से कदम M-n; यह स्वचालित रूप से शोधन करेगा।


1
मेरे लिये कार्य करता है! हेह, मैंने 10 साल के लिए विम का उपयोग किया है, लेकिन मैंने सिर्फ इमैक स्थापित किया है। :)
एडम मोनसेन

लेकिन Emacs स्टड से पढ़ने का समर्थन नहीं करता है, मैं उदाहरण के लिए नहीं कर सकताgit log master.. -p | emacs -
हाय-एंजेल

1
@ हाय-एंजेल आप M-!कमांड चलाने और आउटपुट को बफर में कैप्चर करने के लिए Emacs और टाइप कर सकते हैं ।
लेगोस्कोपिया

172

गिट में, आप बिना मर्ज किए विलय कर सकते हैं। अपना पैच पहले मिलाएं, फिर करें:

git diff --word-diff-regex=.

बराबर के चिन्ह के बाद डॉट को नोट करें।


139
बेहतर: git diff --color-words=.
ntc2

4
@ ntc2 आपको अपनी टिप्पणी का उत्तर देना चाहिए।
टायलर कोलियर

1
Upvoters कृपया ध्यान दें, मेरा मूल उपयोग मामला मानता है कि आपके पास केवल एक पैच फ़ाइल , कोई गिट रेपो या यहां तक ​​कि आधार / संशोधित संस्करण नहीं हैं। इसलिए मैंने @ लेगोशिया के उत्तर को स्वीकार कर लिया ... यह वही है जो अनुरोध किया गया था।
एडम मोनसेन

2
@ ntc2 git diff --color-words=.और git diff --color-words .अलग तरीके से काम करता है। बेहतर है git diff --color-words .
abhisekp

2
@abhisekp: तस्वीर के लिए धन्यवाद। मुझे लगता है कि मैंने इसे समझ लिया है: git diff --color-words .क्या वास्तव में ऐसा ही है git diff --color-words -- .! यानी, .एक पथ के रूप में व्याख्या की जाती है। आप के साथ सत्यापित कर सकते हैं mkdir x y; echo foo > x/test; git add x/test; git commit -m test; echo boo > x/test; cd y; git diff --color-words=.; git diff --color-words .; git diff --color-words -- .
ntc2

145

यहां कुछ संस्करण कम शोर आउटपुट के साथ हैं git diff --word-diff-regex=<re>और जिनकी तुलना में कम टाइपिंग की आवश्यकता होती है, लेकिन इसके बराबर है git diff --color-words --word-diff-regex=<re>

सरल (अंतरिक्ष परिवर्तनों को उजागर करता है):

git diff --color-words

सरल (हाइलाइट व्यक्तिगत चरित्र परिवर्तन; अंतरिक्ष परिवर्तनों को उजागर नहीं करता है):

git diff --color-words=.

अधिक जटिल (अंतरिक्ष परिवर्तनों को उजागर करता है):

git diff --color-words='[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'

सामान्य रूप में:

git diff --color-words=<re>

<re>परिवर्तनों की पहचान के उद्देश्य से "शब्दों" को परिभाषित करने वाला एक regexp कहां है।

ये कम शोर में हैं कि वे बदले हुए "शब्दों" को रंगते हैं, जबकि --word-diff-regex=<re>रंगीन -/+मार्करों के साथ बस घिरे हुए "शब्दों" का उपयोग करते हैं।


9
मुझे खुद पसंद है --color-words, =.भाग के बिना ।
टायलर कोलियर

1
git diff --color-words='\w'diacritics के साथ बेहतर काम करेगा (git v1.7.10.4)
nr

1
आपका अधिक जटिल संस्करण बढ़िया काम करता है। मैं संलग्न --word-diff=plainअतिरिक्त है करने के लिए [-और -]विलोपन चारों और {+और +}चारों ओर अतिरिक्त। जैसा कि मैनुअल ने चेतावनी दी है, हालांकि, स्रोत में इन सीमांकक की वास्तविक घटनाओं को किसी भी तरह से नहीं
बचाया गया है

2
आपका अधिक जटिल संस्करण दुर्भाग्य से उजागर नहीं करता है उदाहरण के लिए इंडेंटेशन परिवर्तन, मैंने इस पर एक प्रश्न खोला है
टोबियास किंजलर

यह जवाब बहुत अच्छा है! हालाँकि, वास्तव में उन परिवर्तनों की पृष्ठभूमि को हरे / लाल में बदलने का एक तरीका है?
WoLfPwNeR

45
git diff --color-words="[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+"

उपरोक्त रेगेक्स ( थॉमस रास्ट से ) विखंडन / वर्ण स्तर पर अलग-अलग टुकड़ों को अलग करने का एक अच्छा काम करता है (जबकि शोर के रूप में नहीं किया जा रहा है)--word-diff-regex=. )।

मैंने यहां परिणामी आउटपुट का स्क्रीनशॉट पोस्ट किया है


अपडेट करें:

इस लेख में कुछ बेहतरीन सुझाव हैं। विशेष रूप से, contrib/गिट रेपो के पेड़ में ए हैdiff-highlight पर्ल लिपि होती है जो बारीक-बारीक हाइलाइट दिखाती है।

त्वरित इसका उपयोग शुरू करें:

$ curl https://git.kernel.org/cgit/git/git.git/plain/contrib/diff-highlight/diff-highlight > diff-highlight
$ chmod u+x diff-highlight
$ git diff --color=always HEAD~10 | diff-highlight | less -R

5
आप इसे छोटा कर सकते हैं--color-words=[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'
संपादित करें

मुझे 'वहाँ मूल्य की शुरुआत में जोड़ना था । अन्यथा मुझे एक त्रुटि मिली। इसके अलावा, मैं बस का उपयोग कर --color-wordsमैं उसी regexp का उपयोग कर के रूप में एक ही व्यवहार मिलता है।
जीसीबी

3
@gcb पाठ सामग्री मायने रखती है। यदि आपके परिवर्तन व्हाट्सएप द्वारा अलग किए गए हैं, तो कोई अंतर नहीं है। लेकिन आप अगर आप की तरह कुछ बदलने के परिवर्तित होने foo.barके लिए foo.quxआप अंतर देखेंगे।
जस्टिन एम। कीज़

5
सरल: git diff --color-words='[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'
ntc2

1
मैंने होमब्रे के साथ गिट स्थापित किया था और पहले से ही उस स्क्रिप्ट पर था /usr/local/share/git-core/contrib/diff-highlight/diff-highlightऐसा लगता है कि Homebrew के गिट पूरे कॉन्ट्रिब्यूशन को स्थापित करता है /usr/local/share/git-core/contrib/। इसलिए अंत में, मेरे लिए काम कियाgit diff --color=always | /usr/local/share/git-core/contrib/diff-highlight/diff-highlight
आशुतोष जिंदल

6

यदि आपके पास NodeJS स्थापित करने के खिलाफ कुछ भी नहीं है, तो "diff-so-फैंसी" ( https://github.com/so-fancy/diff-so-fancy ) नामक एक पैकेज है , जो स्थापित करना बहुत आसान है और पूरी तरह से काम करता है:

npm install -g diff-so-fancy
git diff --color | diff-so-fancy | less -R

संपादित करें: अभी पता चला है कि यह वास्तव में आधिकारिक अंतर-हाइपर के लिए एक आवरण है ... कम से कम यह मेरे जैसे पेरोफोब के लिए स्थापित करना आसान है और गीथहब पृष्ठ अच्छी तरह से प्रलेखित है :)


2

प्रति वर्ण अंतर उपकरण के बारे में पता नहीं है, लेकिन प्रति शब्द अंतर उपकरण है: wdiff।

उदाहरण देखें UNIX / Linux पर टॉप 4 फ़ाइल अंतर उपकरण - डिफ, कोलॉर्डिफ़, डीडी, विम्फिफ़


wdiff दिलचस्प है, धन्यवाद! अपने मूल प्रश्न को स्पष्ट करने के लिए, मैं एक ऐसी चीज़ की तलाश कर रहा हूँ जो एक एकल फ़ाइल के लिए संवर्धित वाक्यविन्यास को उजागर करती है जो एकीकृत रूप से भिन्न स्वरूप में होती है।
एडम मोन्सन

थोड़ा ऑफटॉपिक (शब्द-दर-शब्द भिन्न होता है, preexisting अलग आउटपुट को बढ़ाने के लिए नहीं), लेकिन मैंने निम्नलिखित संयोजनों को शब्द-शब्द-शब्द विज़ुअलाइज़ेशन के लिए सबसे अच्छा पाया है: * wdiff old_file new_file | cdiff * vimdiff , फिर :windo wincmd Kऊर्ध्वाधर विंडो लेआउट पर स्विच करने के लिए विम के अंदर (एक के नीचे एक) एक तरफ से। लंबी लाइनों वाली फाइलों के लिए यह लेआउट बहुत बेहतर है।
अलेक्जेंडर एडमोवस्की

2
Btw, कुछ अन्य उपकरणों के लायक बाहर की जाँच, लिंक किए गए लेख में उल्लेख नहीं किया: wdiff2, mdiff, और गूगल के ऑनलाइन उपकरण
अलेक्जेंडर एडमोवस्की

1

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

मैंने NrrwRgn की कोशिश की और इसे, साथ: diffthis, वास्तव में एक फ़ाइल के कुछ हिस्सों के भीतर प्रति-वर्ण अंतर को दर्शाने के लिए उपयोगी था। लेकिन इसमें कई कीस्ट्रोक्स लगे। मेरी वीमस्क्रिप्ट बहुत जंग लगी है, लेकिन इसकी संभावना स्क्रिप्टेड हो सकती है। शायद NrrwRgn वांछित कार्यक्षमता प्रदान करने के लिए बढ़ाया जा सकता है।

विचार?

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