Git लाइन नंबर के साथ अलग है (Git लॉग इन लाइन नंबर)


93

जब मैं एक git diffया एक git log -pकरता हूं, तो आउटपुट के साथ स्रोत फ़ाइल (ओं) की लाइन नंबर कैसे प्राप्त करूं?

मैंने इसे देखने की कोशिश की man git-diff | grep "line numbers"और मैंने गुगली करने की कोशिश की लेकिन जल्दी कुछ नहीं हुआ।

जवाबों:


92

आप के साथ मानव-पठनीय लाइन नंबर प्राप्त नहीं कर सकते git diff

वर्तमान में लाइन-नंबर को साइड में लंबवत प्रदर्शित करने का कोई विकल्प नहीं है git diff

एकीकृत-अलग प्रारूप

यह जानकारी (c) हंक हेडर में प्रत्येक परिवर्तन के लिए उपलब्ध है, हालांकि, यह सिर्फ एकीकृत-भिन्न प्रारूप में है :

@@ -start,count +start,count @@

फ़ाइल की मूल स्थिति के साथ प्रतिनिधित्व किया है -, और नए राज्य के साथ प्रतिनिधित्व किया है +(वे हंक हेडर में परिवर्धन और विलोपन का मतलब नहीं है। startफ़ाइल के प्रत्येक संस्करण की शुरुआती लाइन संख्या का countप्रतिनिधित्व करता है , और प्रतिनिधित्व करता है कि कितनी लाइनें शामिल हैं। , शुरू बिंदु से शुरू।

उदाहरण

diff --git a/osx/.gitconfig b/osx/.gitconfig
index 4fd8f04..fcd220c 100644
--- a/osx/.gitconfig
+++ b/osx/.gitconfig
@@ -11,7 +11,7 @@ <== HERE!
 [color "branch"]
        upstream = cyan
 [color "diff"]
-       meta = yellow
+       meta = cyan
        plain = white dim
        old = red bold
        new = green bold

हंक हेडर

@@ -11,7 +11,7 @@

कहते हैं कि फ़ाइल का पिछला संस्करण लाइन 11 पर शुरू होता है, और इसमें 7 लाइनें शामिल हैं:

11  [color "branch"]
12         upstream = cyan
13  [color "diff"]
14 -       meta = yellow
14 +       meta = cyan
15         plain = white dim
16         old = red bold
17         new = green bold

जबकि फ़ाइल का अगला संस्करण भी लाइन 11 पर शुरू होता है, और इसमें 7 लाइनें भी शामिल हैं।

एकीकृत-रूप प्रारूप वास्तव में मानव उपभोग के लिए नहीं है

जैसा कि आप शायद बता सकते हैं, एकीकृत-अलग प्रारूप में लाइन नंबर (कम से कम यदि आप एक मशीन नहीं हैं) का पता लगाना आसान नहीं है। यदि आप वास्तव में लाइन नंबर चाहते हैं जिसे आप पढ़ सकते हैं, तो आपको एक अलग उपकरण का उपयोग करने की आवश्यकता होगी जो उन्हें आपके लिए प्रदर्शित करेगा।

अतिरिक्त पढ़ना


4
यहाँ संशोधित फ़ाइलों में केवल लाइन संख्या निकालने के लिए एक grep है, उदाहरण के लिए एक चेकस्टाइल रिपोर्ट को फ़िल्टर करने के लिए उपयोग किया जाता हैgit diff --unified=0 | grep -Po '^\+\+\+ ./\K.*|^@@ -[0-9]+(,[0-9]+)? \+\K[0-9]+(,[0-9]+)?(?= @@)'
जैकब बोचेंस्की

1
@ JakubBochenski की टिप्पणी से मेरी समस्या काफी अच्छी तरह से हल हो गई।
0xbe5077ed

यह केवल तभी उपयोगी है जब आप निर्दिष्ट --unified=0या -U0, हालांकि।
पंजा

मैंने अभी git diffn- अभी समाप्त किया , एक ड्रॉप-इन रिप्लेसमेंट (आवरण) git diffजिसके लिए लाइन नंबर दिखाता है और सभी उपयोग और विकल्पों के साथ पूर्ण संगतता है git diff: stackoverflow.com/questions/24455377/…
गेब्रियल स्टेपल्स

22

एंडी टॉकॉव्स्की के कोड पर विस्तार करते हुए यहां दो और समाधान दिए गए हैं।

सादे पाठ:

  git diff | gawk 'match($0,"^@@ -([0-9]+),[0-9]+ [+]([0-9]+),[0-9]+ @@",a){left=a[1];right=a[2];next};\
   /^(---|\+\+\+|[^-+ ])/{print;next};\
   {line=substr($0,2)};\
   /^-/{print "-" left++ ":" line;next};\
   /^[+]/{print "+" right++ ":" line;next};\
   {print "(" left++ "," right++ "):"line}'

रंगीन पाठ, \033[66mरंग कोड के लिए प्रारूप है:

  git diff --color=always | \
    gawk '{bare=$0;gsub("\033[[][0-9]*m","",bare)};\
      match(bare,"^@@ -([0-9]+),[0-9]+ [+]([0-9]+),[0-9]+ @@",a){left=a[1];right=a[2];next};\
      bare ~ /^(---|\+\+\+|[^-+ ])/{print;next};\
      {line=gensub("^(\033[[][0-9]*m)?(.)","\\2\\1",1,$0)};\
      bare~/^-/{print "-"left++ ":" line;next};\
      bare~/^[+]/{print "+"right++ ":" line;next};\
      {print "("left++","right++"):"line;next}'

कोड लाइनों है कि के साथ शुरू बदलता है -और +करने के लिए -1:-और +1:+क्रमशः, और लाइनों है कि कुछ भी नहीं के साथ शुरू करने के लिए (5,6):। नंबर संबंधित फाइल से लाइन नंबर हैं।


मुझे लगता है कि यह कोड के संरेखण (इंडेंटेशन) को तोड़ता है, जबकि देशी git diffसावधानी से संरेखण बनाए रखता है। यह कोड इस समय मेरे सिर पर है, तो क्या आप इसे ठीक करने के लिए तैयार हैं? दूसरे शब्दों में, जब एक पंक्ति कहती है +240:+और अगली पंक्ति कहती है (241,257):, तो आपको अपने कोड को निचली पंक्ति से कोड के साथ उचित संरेखण और इंडेंटेशन बनाए रखने के लिए शीर्ष पंक्ति में कुछ अतिरिक्त स्थान जोड़ने की आवश्यकता है। शायद यह आसानी से प्रिंट के साथ किया जा सकता है?
गेब्रियल स्टेपल्स

... मेरा मतलब है printf
गेब्रियल स्टेपल्स


कोई बात नहीं; मैं समझ गया! मैं अभी समाप्त हुआ git diffn। यहाँ देखें: stackoverflow.com/a/61997003/4561887 । धन्यवाद @PFudd, आपके उत्तर के लिए। मैंने इसका अध्ययन किया और इसे सीखने के लिए इस्तेमाल किया, फिर स्क्रैच से शुरू किया और लिखा git diffn। एक बार स्वरूपित होने के बाद मैं आपका कोड पढ़ सकता था (धन्यवाद @EdMorton), इससे मुझे कुछ बेहतरीन चीजें सीखने में मदद मिली, जिससे मुझे मदद मिली।
गेब्रियल स्टेपल्स

6

यहां एक स्क्रिप्ट है जो इसे ठीक करने का प्रयास करती है - क्रोध में इसका परीक्षण नहीं किया गया लेकिन यह ठीक लगता है। यह रिकॉर्ड पर निर्भर करता है कि git भिन्न होता है और लाइन काउंट को बनाए रखने के लिए awk का उपयोग करता है।

# Massage the @@ counts so they are usable
function prep1() {
   cat | awk -F',' 'BEGIN { convert = 0; }
       /^@@ / { convert=1; }
       /^/  { if ( convert == 1 ) { print $1,$2,$3;
              } else { print $0;
              }
              convert=0;
             }'
}

# Extract all new changes added with the line count
function prep2() {
  cat | awk 'BEGIN { display=0; line=0; left=0; out=1;}
     /^@@ / { out=0; inc=0; line=$4; line--; display=line; left=line;        }
     /^[-]/   { left++; display=left; inc=0; }
     /^[+]/   { line++; display=line; inc=0; }
     /^[-+][-+][-+] / { out=0; inc=0; }
     /^/    { 
               line += inc;
               left += inc;
               display += inc;
               if ( out == 1 ) {
                   print display,$0;
               } else {
                   print $0;
               }
               out = 1;
               inc = 1;
               display = line;
            }'
} 

git diff $1 | prep1 | prep2 

4

आप git difftoolबाहरी संपादक के साथ अंतर करने के लिए उपयोग कर सकते हैं जो लाइन नंबर प्रदर्शित करेगा। यहाँ इसे vim / vimdiff के साथ कैसे करें:

  1. Vitdiff को git के difftool के रूप में सेट करें:

    git config --global diff.tool vimdiff
    
  2. ~/.vimrcVimdiff का उपयोग करते समय स्वचालित रूप से लाइन नंबर दिखाने के लिए कॉन्फ़िगर करें:

    if &diff
        set number
    endif
    
  3. लाइन अंतर के साथ git difftool चलाएं, जो vimdiff का उपयोग करेगा:

    git difftool
    

केवल git difftool करने से यह मेरे लिए tkdiff टूल के रूप में खुलता है, जो स्वयं लाइन नंबर फ़ंक्शन है। धन्यवाद wisbucky
Richardd

3

एक त्वरित तरीका उपयोग करना है git diff -U0। यह संदर्भ की पंक्तियों को 0 पर सेट करेगा, जो @@ मानों को वास्तविक परिवर्तित लाइनों से मेल खाएगा। डिफ़ॉल्ट रूप से, @@ मानों में संदर्भ से पहले / बाद की 3 पंक्तियाँ शामिल हैं, जो मनुष्यों के लिए सुविधाजनक नहीं है।

उदाहरण:

git diff # default
@@ -10,8 +10,8 @@

यह परिवर्तित लाइनों की लाइन संख्या की गणना करना कठिन है क्योंकि लाइन 10 पहले संदर्भ की पहली पंक्ति को संदर्भित करता है। पहली परिवर्तित लाइन की वास्तविक लाइन संख्या 10 + 3 = 13 है। परिवर्तित लाइनों की संख्या की गणना करने के लिए, फिर आपको पहले और बाद के संदर्भ को घटाना होगा: 8-3-3 = 2।

git diff -U0
@@ -13,2 +13,2 @@

जैसा कि आप देख सकते हैं, संदर्भ सेट करना = 0 मानवों को पढ़ने के लिए @@ मूल्यों को आसान बनाता है। आप देख सकते हैं कि परिवर्तित रेखाएँ रेखा १३ पर शुरू होती हैं, और २ परिवर्तित रेखाएँ हैं।

यह सही नहीं है, क्योंकि यह केवल प्रत्येक ब्लॉक के लिए लाइन नंबर दिखाता है। यदि आप हर लाइन के लिए लाइन नंबर देखना चाहते हैं, तो एक बाहरी संपादक के लिए difftool का उपयोग करें। Https://stackoverflow.com/a/50049752 देखें


3

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

सेट अप:

  1. Windows या Linux के लिए अपने difftool के रूप में मेल्ड सेट करने के निर्देश

नमूना स्क्रीनशॉट:

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

अपडेट 24 मई 2020:

मैंने git diffnपिछले कुछ दिनों git diffमें कमांड-लाइन पर ड्रॉप-इन रिप्लेसमेंट होने के लिए लिखा था। इसे आजमा कर देखें। मेरा दूसरा जवाब यहां देखें


3

24 मई 2020 तक, आप अब git diffnइस उद्देश्य के लिए तृतीय-पक्ष टूल (पूर्ण प्रकटीकरण: मैंने इसे लिखा था) का उपयोग कर सकते हैं । यह एक लाइट-वेट रैपर है git diff, जिसे awkपैटर्न / एक्शन-आधारित प्रोग्रामिंग भाषा में लिखा गया है । यहां चल रहा है से एक नमूना उत्पादन git diffn:

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

यहाँ एक डेमो है:

1/3: का डेमो git diffn :

यह फ़ाइल बनाएँ:

hello_world.c:

#include <stdio.h>

int main()
{
    printf("Hello World\n");

    return 0;
}

इसे प्रतिबद्ध करें:

git add hello_world.c
git commit -m "add hello_world.c"

इसे इसमें बदलें और फ़ाइल को सहेजें:

hello_world.c:

// Basic hello world example

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("Hello Gabriel\n");
    
    int i = 700;
    printf("i = %i\n", i);
    return 0;
}

अब चलाएं:

git diff

यहाँ git diffतुलना के प्रयोजनों के लिए पहले का उत्पादन है:

$ git diff
diff --git a/hello_world.c b/hello_world.c
index e01704a..e971b73 100644
--- a/hello_world.c
+++ b/hello_world.c
@@ -1,8 +1,12 @@
+// Basic hello world example
+
 #include <stdio.h>
 
-int main()
+int main(int argc, char *argv[])
 {
-    printf("Hello World\n");
-
+    printf("Hello Gabriel\n");
+    
+    int i = 700;
+    printf("i = %i\n", i);
     return 0;
-}
\ No newline at end of file
+}

और रंग दिखाने के लिए एक स्क्रीनशॉट। ध्यान दें कि लाल हाइलाइट किया गया खंड बस खाली व्हाट्सएप (इस मामले में रिक्त स्थान) दिखा रहा है जिसे हटाया जा सकता है:

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

अब यहाँ का आउटपुट है git diffn। ध्यान दें कि यह सभी लाइन नंबरों को पूरी तरह दिखाता है!

  • हटाए गए लाइनों के लिए लाइन नंबर बाईं ओर हैं, और आपको बेहतर देखने में मदद -करने के लिए बाईं ओर और दाईं ओर दोनों पर एक संकेत दिखाते :हैं - चाहे आपकी आँखें बृहदान्त्र के दाईं ओर नीचे या दूर तक स्कैन करना पसंद करती हैं स्क्रीन के बाईं ओर।
  • अतिरिक्त लाइनों के लिए लाइन नंबर दाईं ओर आगे हैं, और बाईं ओर और दाईं ओर +दोनों पर एक संकेत दिखाते हैं :
  • संदर्भ के लिए दिखाई गई अपरिवर्तित रेखाओं के लिए पंक्ति संख्या को बाईं (पुरानी फ़ाइल) और दाईं ओर (नई फ़ाइल) के लिए दिखाया गया है, द्वारा अलग किया गया है ,

का आउटपुट git diffn:

$ git diffn
diff --git a/hello_world.c b/hello_world.c
index e01704a..e971b73 100644
--- a/hello_world.c
+++ b/hello_world.c
@@ -1,8 +1,12 @@
+        1:+// Basic hello world example
+        2:+
    1,   3: #include <stdio.h>
    2,   4: 
-   3     :-int main()
+        5:+int main(int argc, char *argv[])
    4,   6: {
-   5     :-    printf("Hello World\n");
-   6     :-
+        7:+    printf("Hello Gabriel\n");
+        8:+    
+        9:+    int i = 700;
+       10:+    printf("i = %i\n", i);
    7,  11:     return 0;
-   8     :-}
\ No newline at end of file
+       12:+}

और रंग दिखाने के लिए एक स्क्रीनशॉट। ध्यान दें कि बाईं ओर और दाईं ओर के आसपास के पाठ से मेल खाने के लिए कॉलोन रंगीन या शैलीबद्ध नहीं हैं। यह जानबूझकर और डिज़ाइन किया गया व्यवहार है जो बाईं ओर जोड़ी गई रेखाओं और git diffदाईं ओर मूल आउटपुट के बीच दृश्य विभाजक के रूप में कार्य करता है ।

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

2/3: यह क्या है?

से के शीर्षgit-diffn.sh :

विवरण:

git-diffn.sh

  1. एक ड्रॉप-इन रिप्लेसमेंट, git diffजिसके लिए लाइन 'एन'डर्स भी दिखाता है! इसे बिल्कुल वैसे ही इस्तेमाल करें git diff, सिवाय इसके कि आप इन खूबसूरत लाइन नंबरों को देखने के साथ-साथ अपने बदलावों को समझने में मदद करें।

  2. चूँकि यह सिर्फ एक हल्के वजन की awk-language-based आवरण के आसपास है git diff, इसलिए यह सभी विकल्पों और मापदंडों को git diffस्वीकार करता है जो स्वीकार करता है। उदाहरण:

  3. git diffn HEAD~

  4. git diffn HEAD~3..HEAD~2

  5. आपके किसी भी git diffरंग सेटिंग्स के साथ काम करता है , भले ही आप कस्टम रंगों का उपयोग कर रहे हों

  6. कस्टम भिन्न रंग कैसे सेट करें, साथ ही साथ कस्टम-कलर आउटपुट का स्क्रीनशॉट देखने के लिए यहाँ मेरा उत्तर देखें git diffn: आप git में अलग हेडर के रंग को कैसे अनुकूलित करते हैं?

  7. git configकस्टम git diffरंग और विशेषताएँ (टेक्स्ट फ़ॉर्मेटिंग) सेट करने के लिए ऊपर दिए गए मेरे उत्तर से कुछ नमूना आदेश दिए गए हैं :

       git config --global color.diff.meta "blue"
       git config --global color.diff.old "black red strike"
       git config --global color.diff.new "black green italic"
       git config --global color.diff.context "yellow bold"
    
  8. में git diffn, रंग आउटपुट डिफ़ॉल्ट रूप से चालू है; यदि आप आउटपुट रंग को अक्षम करना चाहते हैं, तो आपको इसका उपयोग करना होगा --no-colorया --color=neverman git diffविवरण के लिए देखें। उदाहरण:

     git diffn --color=never HEAD~
     git diffn --no-color HEAD~3..HEAD~2
    

3/3: स्थापना

  1. विंडोज (अनटाइटेड): यह बैश टर्मिनल के अंदर काम कर सकता है जो कि विंडोज के लिए जीआईटी के साथ आता है , लेकिन अनटाइटेड है। विंडोज के लिए Git इंस्टॉल करें। इसके साथ आने वाले बैश टर्मिनल को खोलें, और नीचे दिए गए निर्देशों का पालन करने का प्रयास करें। मुझे कुछ परीक्षकों की आवश्यकता है जो विंडोज के लिए Git में इसका परीक्षण करेंगे। कृपया देख सकते हैं और यहां का जवाब: https://github.com/git-for-windows/git/issues/2635
  2. Mac (अप्रयुक्त): टर्मिनल का उपयोग करें और नीचे दिए गए निर्देशों का पालन करें। आपको स्थापित करने की आवश्यकता हो सकती है gawk। यदि ऐसा है, तो यह प्रयास करें :brew install gawk
  3. लिनक्स (उबंटू 18.04 पर परीक्षण और पूरी तरह से काम करता है): नीचे दिए गए टर्मिनल निर्देशों का पालन करें।

विकल्प 1 (मेरी सिफारिश): पूरे रेपो को डाउनलोड करें और फिर प्रोग्राम के लिए एक सिमलिंक बनाएं ताकि आप आसानी से अपडेट प्राप्त कर सकेंgit pull जब चाहें रेपो से ।

सबसे पहले, cdजहाँ भी आप इसे स्थापित करना चाहते हैं। फिर भागो:

git clone https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles.git
cd eRCaGuy_dotfiles/useful_scripts
mkdir -p ~/bin
ln -si "${PWD}/git-diffn.sh" ~/bin/git-diffn

किया हुआ! अब बस नीचे अंतिम चरण करो!

विकल्प 2 (उन लोगों के लिए जो केवल 1 फ़ाइल चाहते हैं): बस एक फ़ाइल को एक बार डाउनलोड करें।

mkdir -p ~/bin
cd ~/bin
wget https://raw.githubusercontent.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/master/useful_scripts/git-diffn.sh
chmod +x git-diffn.sh
mv git-diffn.sh git-diffn

किया हुआ! अब बस नीचे अंतिम चरण करो!

अंतिम चरण:

अब अपने टर्मिनल को बंद करें और फिर से खोलें, या इसके साथ पुन: स्रोत करें . ~/.bashrc, और आप कर रहे हैं!

git diffnअब एक सटीक ड्रॉप-इन प्रतिस्थापन के रूप में काम करेगा git diff!


1

तुम कोशिश कर सकते हो

git blame

फ़ाइल पर। यह आपको फ़ाइल में प्रत्येक पंक्ति के लिए कमिट, कमिट आईडी और लाइन नंबर दिखाता है।


4
इसके साथ समस्या यह है कि यह आपको एक अंतर नहीं दिखाता है , जो कि मूल पोस्टर ने पूछा है। git blameबस लाइन नंबरों के साथ फ़ाइल की वर्तमान स्थिति दिखाएगा।

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

git blameकिसी भी तरह से सवाल का जवाब नहीं; मैं यहाँ upvotes पर बहुत चकित हूँ
माइकल Mrozek

कृपया उन उत्तरों के साथ स्टैकओवरफ़्लो को स्पैम न करें जो प्रश्नों से संबंधित नहीं हैं।
अहमद

0

सबसे पहले, अपने git अलग टूल को कॉन्फ़िगर करें, जैसे Meld

git config --global diff.tool meld

फिर, कुछ फ़ाइल पर अपने difftool yank करें:

git difftool -y config.rb

अपने अलग उपकरण की वरीयता में लाइन नंबर सेट करना याद रखें।

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