Git केवल उन लाइनों को दिखाने के लिए अलग है जिन्हें संशोधित किया गया है


128

जब मैं एक अंतर करता हूं, तो यह उन रेखाओं को दिखाता है जिन्हें जोड़ा गया है:

+ this line is added

लाइनों को हटा दिया गया है:

- this line is removed

लेकिन यह कई लाइनें भी दिखाता है जो संशोधित नहीं हैं:

this line is not modified
this line is also not modified

वास्तविक गिट में यह परिणाम कुछ इस तरह दिखता है:

+ this line is added
  this line is not modified
- this line is removed
  this line is not modified

क्या मैं केवल उन पंक्तियों को दिखाने के लिए कह सकता हूं जिन्हें संशोधित किया गया है और अन्य सभी कोड को अनदेखा कर दिया गया है जिन्हें संशोधित नहीं किया गया है? मैंने एक विधि लिखी है जो उन सभी लाइनों को हटा देगी जिनके पास "+" या "-" चिन्ह नहीं है, लेकिन मुझे यकीन है कि ऐसा करने का एक सरल तरीका होना चाहिए।

मेरे अंतर में, मुझे केवल उन पंक्तियों को देखने में दिलचस्पी है जिन्हें संशोधित किया गया है।

अग्रिम में धन्यवाद।

जवाबों:


182

आप जो चाहते हैं वह संदर्भ की 0 लाइनों के साथ एक अंतर है। आप इसके साथ उत्पन्न कर सकते हैं:

git diff --unified=0

या

git diff -U0

आप इसे उस रिपॉजिटरी के लिए एक विन्यास विकल्प के रूप में भी सेट कर सकते हैं:

git config diff.context 0

किसी भी भंडार के लिए इसे विश्व स्तर पर स्थापित करने के लिए:

 git config --global diff.context 0

4
तुरंत जवाब देने के लिए धन्यवाद। यह मेरी समस्या का आधा हल करता है लेकिन मुझे अभी भी कुछ लाइनें मिल रही हैं जैसे "@@ -1 +1 @@" मेरे अंतर में और मेरे git के ऊपर "diff --git a / db / xxxxxxx b / db / xxxx इंडेक्स" है। xxxxx..aaaaaaaa bbbbbbb
r3b00t

3
मुझे नहीं लगता कि git उन पंक्तियों को आउटपुट करने से बचने का कोई तरीका प्रदान करता है, क्योंकि अंतर उनके बिना कोई मतलब नहीं होगा (आप यह नहीं जान सकते कि आप किस फ़ाइल को देख रहे थे, और न ही आप फ़ाइल में कहाँ थे)।
क्रिस हेस

8
@ राकेश: विस्तार करने के लिए, git- डिफरेंशियल डिफरेंसेस बनाने की कोशिश करता है जो वास्तव में पैच टू सोर्स फाइल्स के रूप में इस्तेमाल किया जा सकता है, जो उस जानकारी के बिना असंभव है। इसे हटाने का एकमात्र तरीका यह होगा कि आप इसे पोस्ट-प्रोसेस करें, जैसे कि इसके माध्यम से git diff | egrep "^(\+|-) "
क्रिस हेस

1
git config --global diff.context 0 इसे विश्व स्तर पर सेट करने के लिए
आंद्रेजे रहमान

यदि आप किसी विशेष निर्देशिका में git diff -U0 <dir>
Eswar Yaganti

41

एक और हैक (संयुक्त राष्ट्र में * x) के साथ शुरू होने वाली लाइनों को दिखाने के लिए +और -:

git diff -U0 | grep '^[+-]' | grep -Ev '^(--- a/|\+\+\+ b/)'

उपरोक्त कोड निम्न कार्य करता है:

  • git diff -U0: 0 संदर्भ लाइनें चुनें
  • पहले grep में +या से शुरू होने वाली सभी लाइनें शामिल हैं-
  • दूसरा grep लाइनों को छोड़कर --- a/या के साथ शुरू होता है+++ b/

रंग

रंगीन अंतर दिखाने के लिए, निम्नलिखित प्रयास करें:

git diff -U0 --color | grep '^\e\[[^m]*m[-+]' | grep -Ev '(--- a/|\+\+\+ b/)'
  • अभिव्यक्ति, ^\e\[[^m]*m[-+]लाइन की शुरुआत के लिए लग रही है ( ^), फिर भागने के अनुरेखक ( \e) जिसके बाद [एक साथ भागने का क्रम शुरू करते हैं, फिर कोई भी चरित्र जो "एम" (संख्या, अर्धविराम या कुछ भी नहीं) है, उसके बाद " m ”जो पलायन क्रम को समाप्त करता है।
  • ध्यान दें कि निम्नलिखित सभी वैध बच क्रम हैं: \e[0m(रीसेट), \e[m(रीसेट भी), \e[1m(बोल्ड ऑन), \e[31m(रेड), \e[32m(ग्रीन), \e[9;31m(स्ट्राइक + रेड), \e[31;9m(रेड + स्ट्राइक आउट), \e[1;4;9;31m(बोल्ड +) अंडरलाइन + स्ट्राइक आउट + रेड)। डिफ़ॉल्ट गिट रंग लाल और हरे रंग का उपयोग करते हैं, लेकिन उन्हें फिर से जोड़ा जा सकता है।
  • --colorके रूप में ही है --color=always
  • भागने के क्रम के लिए समायोजित करने के लिए लाइन के शुरू होने --- a/या +++ b/प्रकट होने पर प्रतिबंध हटा दिया गया है और इससे किनारे का मामला बन सकता है।

अतिरिक्त नोट्स:

  • इसके बाद के संस्करण समाधान यदि आप इस तरह के रूप में अतिरिक्त Git diff विकल्पों का उपयोग संशोधित करने की आवश्यकता -R, --src-prefix, --dst-prefix,--no-prefix , आदि
  • दो क्रेप्स को एक एकल में जोड़ा जा सकता है grep -E -v '^(\+\+\+ b/|--- a/|@@ |diff --git|index )', लेकिन मुझे डबल ग्रीप संस्करण समझने में आसान लगता है।

2
अच्छा है। प्रत्येक फिल्टर पर स्पष्ट विवरण के लिए अपवोट करें।
हेनरेबोथा

मुझे बहुत सी git diff"हेडर" प्रकार की लाइनें दिखाई देती हैं @@, जो शुरू होती हैं , लेकिन वे कौन सी git diffलाइनें हैं, जो ---या से शुरू होती हैं +++? मुझे उन लोगों की जानकारी नहीं थी।
गैब्रियल स्टेपल्स

आह बुरा न मानें। उन फ़ाइलों के लिए फ़ाइल नामों को निरूपित करें जिनमें परिवर्धन ( +++) या विलोपन ( ---) हैं। मैं अब यहां देखता हूं: git-scm.com/docs/git-diff#_combined_diff_format
गेब्रियल स्टेपल्स

सुधार अभी तक फिर से: --- a/filename"बाईं ओर फ़ाइल", या फ़ाइल को पहले के रूप में +++ b/filenameनिरूपित करने के लिए लगता है , और "दाईं ओर फ़ाइल" को निरूपित करने के लिए लगता है, या फ़ाइल अब आपके परिवर्तनों के साथ है। मैं बहुत git difftoolही मस्त के साथ उपयोग करने के लिए अभ्यस्त हूं , जो सुंदर साइड-बाय-साइड तुलनाओं को दर्शाता है, कि मुझे वास्तव में देखने की आदत नहीं है git diff, इसलिए यह अभी भी मुझे अजीब लगता है, और मैंने वास्तव में पहले कभी इन बारीकियों को नहीं देखा।
गैब्रियल स्टेपल्स

1
@ गैब्रिएलस्टैपल्स, रंग के लिए समर्थन जोड़ा गया है। धन्यवाद।
user650654

6

क्रिस की नवीनतम टिप्पणी के बाद, पोस्ट-प्रोसेसिंग के साथ मुख्य समस्या यह है कि आप लाइनों को शुरू -|+करना चाहते हैं, लेकिन आप उन लोगों को भी फ़िल्टर करना चाहते हैं जो इसके साथ शुरू करते हैं ---|+++। यदि आप अपने रेपो (I do in Pydoop ) में पैच फाइलें संग्रहीत कर रहे हैं, तो दूसरी ओर, आप उन पंक्तियों को रखना चाहते हैं जो शुरू होती हैं --|++, इसलिए regexp थोड़ा सा शामिल हो जाता है:

git diff | grep -P '^\+(?:(?!\+\+))|^-(?:(?!--))'

Regexp एक नकारात्मक लुकहेड का उपयोग करता है: विस्तृत विवरण के लिए इस प्रश्न का उत्तर पीटर बॉटन देखें ।

यदि आप अक्सर ऐसा करते हैं, तो आप इसके लिए git उपनाम सेट करना चाहते हैं:

git config --global alias.diffonly '!git diff | grep -P "^\+(?:(?!\+\+))|^-(?:(?!--))"'

1
यह मेरे लिए विंडोज गिट बैश पर काम नहीं किया। पता नहीं क्यों (grep ने कहा कि अवैध विकल्प P), चुतझप को इस समय देखने की जरूरत नहीं है।
डेनिस

1
-Pया --perl-regexpइसका उपयोग पर्ल रेगुलर रेक्सप्रेशन के रूप में पैटर्न की व्याख्या करने के लिए किया जाता है, लेकिन इसे हमेशा लागू नहीं किया जाता है। यह OSX पर मेरे लिए काम नहीं किया। gnu.org/software/grep/manual/grep.html#grep-Programs
विलिंगटन वेगा

5

मुझे लगता है कि साधारण मामलों के लिए रेगेक्स बहुत छोटा और याद रखने में आसान हो सकता है, कैविएट के साथ कि यह काम नहीं करेगा यदि आपके पास लाइन परिवर्तन हैं जहां लाइन खुद से शुरू होती है +या-

$ git diff | grep '^[+|-][^+|-]'

रेगेक्स का कहना है कि लाइन के साथ शुरू होना चाहिए +या -, और तुरंत निम्नलिखित चरित्र न तो उनमें से होना चाहिए। मुझे वही परिणाम मिले कि क्या मैं यहाँ भाग गया +या नहीं, btw ...


उदाहरण:

$ cat testfile
A
B
C
D
E
F
G

कहते हैं कि मैं Cकरने के लिए X, Eकरने के लिए Y, और बदल Gजाते हैं Z

$ git diff | grep '^[+|-][^+|-]'
-C
+X
-E
+Y
-G
+Z

जैसा कि मैंने ऊपर कहा, हालांकि, यह ज्यादातर मामलों के लिए है। यदि आप उस आउटपुट को फ़ाइल में पाइप करते हैं dout, तो उसी रेगेक्स को आज़माएँ, यह काम नहीं करेगा।

$ git diff dout | grep '^[+|-][^+|-]'
$

वैसे भी, आशा है कि आपके मामले में मदद करता है


उन मामलों के लिए जहां लाइन "-" से शुरू होती है, यह काम नहीं करेगा। उदाहरण: - name: No pdbएक yaml फ़ाइल में।
अनपुलगोम्स

3

यह उत्तर पठनीयता के लिए मूल लाल / हरे रंग को बनाए रखेगा। मैंने वाक्य रचना में कुछ भिन्नताएँ प्रदान की हैं:

git diff --color | grep --color=never $'^\e\[3[12]m'
git diff --color | grep --color=never $'^\033\[3[12]m'
git diff --color | grep --color=never -P '^\e\[3[12]m'
git diff --color | grep --color=never -P '^\033\[3[12]m'

स्पष्टीकरण:

  • git diff --colorरंग जब यह पाइप है अक्षम करने से Git को रोकने के लिए की जरूरत है।
  • grep --color=neverमूल रंग को दूर करने और मिलान किया स्ट्रिंग प्रकाश डाला ग्रेप को रोकने के लिए है।
  • हम उन पंक्तियों के लिए मेल कर रहे हैं जो लाल ( \e[31m) या हरे ( \e[32m) एस्केप कोड से शुरू होती हैं।
  • $'...'(एएनएसआई-सी के हवाले से वाक्य रचना) या -P(पर्ल सिंटेक्स) जाने के लिए है grepव्याख्या करने के लिए \eया \033एक के रूप में ESCचरित्र।

इसके लिए धन्यवाद। यहाँ एक वैकल्पिक रूप है जिसे मैं अभी सामने आया हूँ। आपके $''हिस्से ने विशेष रूप से मेरी मदद की। stackoverflow.com/a/61929887/4561887
गेब्रियल स्टेपल्स

1

awkबस लाइनों +और -लाइनों को दिखाने के लिए कैसे उपयोग करें , किसी भी रंग या पाठ स्वरूपण के लिए लेखांकन git diffआउटपुट हो सकता है:

यहाँ अन्य उत्तरों में से एक भी नहीं ( मेरे अन्य उत्तर सहित ) ठीक वही होगा जो आप 100% सही ढंग से चाहते हैं। हालाँकि, यह उत्तर होगा। यहां 1-लाइनर है जिसे आप अपने टर्मिनल में कॉपी और पेस्ट कर सकते हैं। मैंने इसे केवल पठनीयता के लिए कई पंक्तियों में बनाया है - आप इसे उसी तरह से कॉपी-पेस्ट कर सकते हैं ताकि मैं इसे पठनीय बना सकूं! यह awkप्रोग्रामिंग भाषा पर निर्भर करता है :

git diff --color=always "$@" | awk '
# 1. Match and then skip "--- a/" and "+++ b/" lines
/^(\033\[(([0-9]{1,2};?){1,10})m)?(--- a\/|\+\+\+ b\/)/ {
    next 
} 
# 2. Now print the remaining "+" and "-" lines ONLY! Note: doing step 1 above first was required or
# else those lines would have been matched by this matcher below too since they also begin with 
# the "+" and "-" symbols.
/^(\033\[(([0-9]{1,2};?){1,10})m)?[-+]/ {
    print $0 
}
' | less -RFX

यहां इसकी विशेषताएं हैं। इन सभी सुविधाओं को, जब एक साथ लिया जाता है, तो हर दूसरे उत्तर की कमियों को हल करें:

  1. यह रंग और कोई रंग उत्पादन संभालती है। यही वह नियमित अभिव्यक्ति करता है:^(\033\[(([0-9]{1,2};?){1,10})m)?
  2. यह बोल्ड, इटैलिक्स, स्ट्राइकथ्रू, आदि सहित सभी रंगों और सभी पाठ प्रारूप विकल्पों को संभालता है, जिन्हें आप अपनी git configसेटिंग्स में सेट कर सकते हैं । यही कारण है कि ऊपर रेगेक्स में ;?और {1,10}इसमें है: यदि यह एक रंग या पाठ प्रारूपण कोड की शुरुआत का पता लगाता है, तो यह इन संयुक्त ANSI कोड के 10 अनुक्रमों तक मेल खाएगा।
  3. इसमें उन पंक्तियों को भी शामिल नहीं किया गया है जो शुरू @@और शब्द के साथ होती हैं diff, जैसा कि स्वीकृत उत्तर करता है। यदि आप उन पंक्तियों को चाहते हैं (जो काफी स्पष्ट रूप से, मुझे लगता है कि उपयोगी हैं :)), इसके बजाय ऐसा करें:

    git diff --unified=0
    

    या

    git diff -U0
    
  4. यह आउटपुट को ठीक उसी तरह दिखाता है जैसे git diff: lessपेजर में वैकल्पिक रंग आउटपुट ( -R) के साथ होता है, और केवल तभी जब टेक्स्ट> 1 पेज ( -F) हो, और qयूआईटी ( -X) के समय स्क्रीन पर टेक्स्ट के वर्तमान पेज को बनाए रखते हुए। ।

यह भी शक्तिशाली और आसानी से विन्यास होने का लाभ है क्योंकि यह awk प्रोग्रामिंग भाषा का उपयोग करता है।

यदि आप जाग सीखने में रुचि रखते हैं , तो यहां कुछ संसाधन हैं:

  1. gawk(GNU awk) मैनुअल: https://www.gnu.org/software/gawk/manual/html_node/index.html#SEC_Contents
  2. अध्ययन git diffnऔर उसमें दी गई टिप्पणियाँ: https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/blob/master/useful_scripts/git-diffn.sh
    1. यदि आप git diffnभी चाहते हैं, जो git diffलाइन नंबरों के साथ है, तो यहां देखें: लाइन नंबरों के साथ अंतर करें (लाइन नंबरों के साथ प्रवेश करें)
  3. कुछ awk "हैलो दुनिया" और वाक्यविन्यास परीक्षण उदाहरण: https://github.com/ElectricRCAircraftGuy/eRCaGuy_hello_world/tree/master/awk

एक बोनस के रूप में, मैं ऊपर के रूप में इस्तेमाल किया जा सकता है git diffc, जिसका अर्थ है "केवल 'c'hanges दिखाने के लिए अंतर"। उपयोग के समान है git diff; git diffcइसके बजाय बस का उपयोग करें ! यह सभी विकल्पों का समर्थन करता है। डिफ़ॉल्ट रूप से रंग चालू है। इसे बंद करने के लिए, बस का उपयोग करें git diffc --no-colorया git diffc --color=neverman git diffविवरण के लिए देखें।

चूँकि मैंने कल रात को लाइन (n 'के साथ git diffnदिखाने के लिए एक उपकरण git diff) समाप्त किया था, लेखन git diffcतुच्छ था। मुझे लगा कि अब मैं इसे बेहतर कर सकता हूं जबकि ज्ञान मेरे दिमाग में ताजा है।

स्थापित करें git diffc:

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


0

यहां एक और सरल तरीका है, केवल उन पंक्तियों को खोजने के लिए जिन्हें संशोधित किया गया है, और इसलिए रंग आउटपुट को बनाए रखते हुए एकल +या के साथ शुरू करें -:

git diff -U0 --color=always HEAD~ | grep --color=never -E $'^\e\[(32m\+|31m-)'
  1. -U0बदल लाइनों के आसपास संदर्भ 0 पंक्तियों को शामिल कर कहते हैं - यानी: अभी-अभी बदली लाइनों खुद को शामिल हैं। देखते हैं man git diff
  2. -Eग्रेप के लिए यह काम करने के लिए अनुमति देता है विस्तारित नियमित अभिव्यक्ति के साथ
  3. $''वाक्य रचना जाहिरा तौर पर एएनएसआई के हवाले से है, जो ठीक से ESC (भागने, या 0x1b) चरित्र ठीक से व्याख्या की अनुमति देता है। देखें यहाँ
  4. और यहाँ https://www.regex101.com से regex विवरण है :यहाँ छवि विवरण दर्ज करें
  5. मूल रूप से, ^लाइन की शुरुआत से \eमेल खाता है, एस्केप चार से मेल खाता है, जो टर्मिनल में एक रंग कोड की शुरुआत है, रंग कोड में \[अगले चार से मेल खाता है, जो कि है [, और फिर (this|that)वाक्यविन्यास "यह" या "उस" से मेल खाता है , जहां "यह" है 32m+, जो एक हरी + रेखा है, और 31m-एक लाल-रेखा है।
  6. रंग इस तरह हैं: \e[32mहरा है और \e[31mलाल है।
  7. +git diffजोड़े गए लाइनों को, निश्चित रूप से, और हटाए गए के रूप में -चिह्नित लाइनों को दिखाता git diffहै।
  8. ध्यान दें कि --color=neverहै की आवश्यकता 2 में grepहै ताकि इसे अपने मैच, जो अन्यथा से आ रंग कोड ऊपर पेंच हैं पर प्रकाश डाला से रोकने के लिए अभिव्यक्ति git diffबाईं ओर।
  9. को इस तरह +से भी बचना चाहिए \+क्योंकि अन्यथा +एक विशेष नियमित अभिव्यक्ति (रेगेक्स) चरित्र है जो पूर्ववर्ती तत्व की एक या अधिक घटनाओं को निर्दिष्ट करता है । यहाँ देखें: https://en.wikipedia.org/wiki/Regular_expression#Basic_concepts

संदर्भ:

  1. https://git-scm.com/docs/git-diff#_combined_diff_format
  2. @ User650654 द्वारा उत्तर: Git केवल उन पंक्तियों को दिखाने के लिए अलग है जिन्हें संशोधित किया गया है
  3. @Wisbucky द्वारा उत्तर: Git केवल उन पंक्तियों को दिखाने के लिए अलग है जिन्हें संशोधित किया गया है

सम्बंधित:

  1. [मेरा अपना जवाब] Git लाइन नंबर के साथ भिन्न होता है (Git लॉग इन लाइन नंबर)
  2. [किसी और का जवाब] Git लाइन नंबर के साथ अलग है (Git लॉग इन लाइन नंबर)
  3. git लाइन नंबर और उचित कोड अलाइनमेंट / इंडेंटेशन के साथ भिन्न होता है
  4. git-filechange-search.sh- एक स्क्रिप्ट जो आपको एक चर या फ़ंक्शन नाम के लिए एक फ़ाइल खोजने की अनुमति देती है और यह पता लगाती है कि कौन सा परिवर्तन उस चर या फ़ंक्शन नाम के साथ परिवर्तन करता है। पूर्व। उपयोग: फाइल में बदलाव के साथ ./git-filechange-search.sh path/to/my/file.cpp variable_nameसभी कमिट मिलेंगे variable_name। यह देखने के लिए उपयोगी है कि कुछ विशेषताओं को कहाँ और कब बदला गया था। यह ऐसा है जैसे यह एक खोज थी जो git blameसमय के माध्यम से प्रदर्शित फ़ाइल के वर्गों का निरीक्षण कर सकती थी।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.