जब मैं एक git diff
या एक git log -p
करता हूं, तो आउटपुट के साथ स्रोत फ़ाइल (ओं) की लाइन नंबर कैसे प्राप्त करूं?
मैंने इसे देखने की कोशिश की man git-diff | grep "line numbers"
और मैंने गुगली करने की कोशिश की लेकिन जल्दी कुछ नहीं हुआ।
जब मैं एक git diff
या एक git log -p
करता हूं, तो आउटपुट के साथ स्रोत फ़ाइल (ओं) की लाइन नंबर कैसे प्राप्त करूं?
मैंने इसे देखने की कोशिश की man git-diff | grep "line numbers"
और मैंने गुगली करने की कोशिश की लेकिन जल्दी कुछ नहीं हुआ।
जवाबों:
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 लाइनें भी शामिल हैं।
जैसा कि आप शायद बता सकते हैं, एकीकृत-अलग प्रारूप में लाइन नंबर (कम से कम यदि आप एक मशीन नहीं हैं) का पता लगाना आसान नहीं है। यदि आप वास्तव में लाइन नंबर चाहते हैं जिसे आप पढ़ सकते हैं, तो आपको एक अलग उपकरण का उपयोग करने की आवश्यकता होगी जो उन्हें आपके लिए प्रदर्शित करेगा।
--unified=0
या -U0
, हालांकि।
git diffn
- अभी समाप्त किया , एक ड्रॉप-इन रिप्लेसमेंट (आवरण) git diff
जिसके लिए लाइन नंबर दिखाता है और सभी उपयोग और विकल्पों के साथ पूर्ण संगतता है git diff
: stackoverflow.com/questions/24455377/…
एंडी टॉकॉव्स्की के कोड पर विस्तार करते हुए यहां दो और समाधान दिए गए हैं।
सादे पाठ:
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), इससे मुझे कुछ बेहतरीन चीजें सीखने में मदद मिली, जिससे मुझे मदद मिली।
यहां एक स्क्रिप्ट है जो इसे ठीक करने का प्रयास करती है - क्रोध में इसका परीक्षण नहीं किया गया लेकिन यह ठीक लगता है। यह रिकॉर्ड पर निर्भर करता है कि 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
आप git difftool
बाहरी संपादक के साथ अंतर करने के लिए उपयोग कर सकते हैं जो लाइन नंबर प्रदर्शित करेगा। यहाँ इसे vim / vimdiff के साथ कैसे करें:
Vitdiff को git के difftool के रूप में सेट करें:
git config --global diff.tool vimdiff
~/.vimrc
Vimdiff का उपयोग करते समय स्वचालित रूप से लाइन नंबर दिखाने के लिए कॉन्फ़िगर करें:
if &diff
set number
endif
लाइन अंतर के साथ git difftool चलाएं, जो vimdiff का उपयोग करेगा:
git difftool
एक त्वरित तरीका उपयोग करना है 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 देखें
मैं अपने difftool के रूप में meld केgit difftool
साथ उपयोग करना पसंद करता हूं। यह देखने में आसान है , इसमें एक अच्छी साइड-बाय-साइड गुई तुलना है, और प्रत्येक तरफ लाइन नंबर दिखाता है।git diff
मैंने git diffn
पिछले कुछ दिनों git diff
में कमांड-लाइन पर ड्रॉप-इन रिप्लेसमेंट होने के लिए लिखा था। इसे आजमा कर देखें। मेरा दूसरा जवाब यहां देखें ।
24 मई 2020 तक, आप अब git diffn
इस उद्देश्य के लिए तृतीय-पक्ष टूल (पूर्ण प्रकटीकरण: मैंने इसे लिखा था) का उपयोग कर सकते हैं । यह एक लाइट-वेट रैपर है git diff
, जिसे awk
पैटर्न / एक्शन-आधारित प्रोग्रामिंग भाषा में लिखा गया है । यहां चल रहा है से एक नमूना उत्पादन git diffn
:
यहाँ एक डेमो है:
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
दाईं ओर मूल आउटपुट के बीच दृश्य विभाजक के रूप में कार्य करता है ।
से के शीर्षgit-diffn.sh
:
विवरण:
git-diffn.sh
एक ड्रॉप-इन रिप्लेसमेंट, git diff
जिसके लिए लाइन 'एन'डर्स भी दिखाता है! इसे बिल्कुल वैसे ही इस्तेमाल करें git diff
, सिवाय इसके कि आप इन खूबसूरत लाइन नंबरों को देखने के साथ-साथ अपने बदलावों को समझने में मदद करें।
चूँकि यह सिर्फ एक हल्के वजन की awk-language-based आवरण के आसपास है git diff
, इसलिए यह सभी विकल्पों और मापदंडों को git diff
स्वीकार करता है जो स्वीकार करता है। उदाहरण:
git diffn HEAD~
git diffn HEAD~3..HEAD~2
आपके किसी भी git diff
रंग सेटिंग्स के साथ काम करता है , भले ही आप कस्टम रंगों का उपयोग कर रहे हों
कस्टम भिन्न रंग कैसे सेट करें, साथ ही साथ कस्टम-कलर आउटपुट का स्क्रीनशॉट देखने के लिए यहाँ मेरा उत्तर देखें git diffn
: आप git में अलग हेडर के रंग को कैसे अनुकूलित करते हैं?
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"
में git diffn
, रंग आउटपुट डिफ़ॉल्ट रूप से चालू है; यदि आप आउटपुट रंग को अक्षम करना चाहते हैं, तो आपको इसका उपयोग करना होगा --no-color
या --color=never
। man git diff
विवरण के लिए देखें। उदाहरण:
git diffn --color=never HEAD~
git diffn --no-color HEAD~3..HEAD~2
gawk
। यदि ऐसा है, तो यह प्रयास करें :brew install gawk
।विकल्प 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
!
तुम कोशिश कर सकते हो
git blame
फ़ाइल पर। यह आपको फ़ाइल में प्रत्येक पंक्ति के लिए कमिट, कमिट आईडी और लाइन नंबर दिखाता है।
git blame
बस लाइन नंबरों के साथ फ़ाइल की वर्तमान स्थिति दिखाएगा।
git blame
किसी भी तरह से सवाल का जवाब नहीं; मैं यहाँ upvotes पर बहुत चकित हूँ
git diff --unified=0 | grep -Po '^\+\+\+ ./\K.*|^@@ -[0-9]+(,[0-9]+)? \+\K[0-9]+(,[0-9]+)?(?= @@)'