मैं git में दो कमिट्स के बीच परिवर्तित लाइनों की संख्या की गणना कैसे कर सकता हूं?


746

क्या गिट में दो कमिट के बीच बदली गई लाइनों की संख्या की गणना करने का कोई आसान तरीका है?

मुझे पता है कि मैं एक कर सकता हूं git diff, और लाइनों को गिन सकता हूं , लेकिन यह थकाऊ लगता है। मैं यह भी जानना चाहूंगा कि मैं यह कैसे कर सकता हूं, जिसमें लिनेक्स्ट में केवल मेरे खुद के कमिट्स शामिल हैं।


3
आप BitBucket को देखें।
एलेक्स

जवाबों:


1111

आप का --statविकल्प चाहते हैं git diff, या यदि आप इसे स्क्रिप्ट में पार्स करना चाहते हैं, तो --numstatविकल्प।

git diff --stat <commit-ish> <commit-ish>

--statमर्ज के बाद आपके द्वारा देखे जाने वाले मानव-पठनीय आउटपुट का उत्पादन करता है; --numstatएक अच्छा टेबल लेआउट पैदा करता है जिसे स्क्रिप्ट आसानी से व्याख्या कर सकते हैं।

मैंने किसी तरह याद किया कि आप एक ही समय में कई कमिट पर ऐसा करना चाह रहे थे - यह एक काम है git log। रॉन डेवेरा इस पर स्पर्श करते हैं, लेकिन आप वास्तव में उनके द्वारा उल्लेखित बातों से बहुत अधिक कर सकते हैं। चूंकि git logआंतरिक रूप से अनुरोधित जानकारी को प्रिंट करने के लिए अलग मशीनरी को कॉल किया जाता है, आप इसे किसी भी भिन्न स्टेट विकल्प में दे सकते हैं - न कि सिर्फ --shortstat। आप क्या उपयोग करना चाहते हैं:

git log --author="Your name" --stat <commit1>..<commit2>

लेकिन आप --numstatया --shortstatसाथ ही उपयोग कर सकते हैं । git logकई अन्य तरीकों से भी कमिट्स का चयन कर सकते हैं - प्रलेखन पर एक नज़र डालें । आपको चीजों में दिलचस्पी हो सकती है --since( जैसे कमिट कमिटमेंट्स को निर्दिष्ट करने के बजाय, पिछले सप्ताह से कमिट्स का चयन करें) और --no-merges(मर्ज कमिट्स वास्तव में बदलावों का परिचय नहीं देते हैं), साथ ही साथ सुंदर आउटपुट विकल्प ( --pretty=oneline, short, medium, full...)।

जीआईटी लॉग से प्रति-प्रतिबद्ध परिवर्तनों के बजाय कुल परिवर्तन प्राप्त करने के लिए यहां एक-लाइनर है (प्रतिबद्ध चयन विकल्पों को वांछित के रूप में बदलें - यह आपके द्वारा प्रतिबद्ध है, कमेट से कमिट 2 तक):

git log --numstat --pretty="%H" --author="Your Name" commit1..commit2 | awk 'NF==3 {plus+=$1; minus+=$2} END {printf("+%d, -%d\n", plus, minus)}'

(आपको कमिट के बारे में कुछ पहचानने वाली सूचनाओं को लॉग इन प्रिंट करने देना है; मैंने मनमाने ढंग से हैश चुना, फिर तीन क्षेत्रों वाली लाइनों को चुनने के लिए awk का उपयोग किया, जो स्टेट्स जानकारी वाले हैं)


2
यह "परिवर्तित लाइनों" के बारे में मूल प्रश्न का उत्तर नहीं देता है। एक पंक्ति परिवर्तन को सम्मिलित और हटाई गई रेखा दोनों के रूप में परिकलित किया जाता है। परिवर्तित लाइनों की संख्या की गणना यहां वर्णित से अधिक काम की आवश्यकता है।
विले लाटिला

12
@ वीलीलाटिला: यह उतना ही करीब है जितना आप बिना किसी प्रयास के प्राप्त कर सकते हैं, और यह ओपी और 15 अन्य लोगों के लिए काफी अच्छा था। (जब आप एक परिवर्तित रेखा और एक हटाई गई रेखा के रूप में परिभाषित करते हैं तो आप कैसे परिभाषित करते हैं? - - और + रेखा के बीच की दूरी को संपादित करके, रेखा की लंबाई के एक अंश के रूप में;) हम सभी जानते हैं कि परिवर्तन दोगुने हो जाते हैं। हम बस यह कह सकते हैं कि परिवर्तन की मात्रा का एक उपयोगी मीट्रिक, और हमारे जीवन के साथ आगे बढ़ें।
Cascabel

188
git diff --shortstat <commit1> <commit2>मैं जो चाहता था।
किम

9
संदर्भ के लिए, के लिए दिनांक स्वरूप --sinceऔर --until: की तरह कुछ है yesterday, 1 month 2 weeks 3 days 1 hour 1 second agoया1979-02-26 18:30:00
juanmirocks

4
@Bryson हाँ, इसीलिए वह पंक्ति कहती है <commit-ish>- यह किसी भी चीज़ के साथ काम करती है जो सामान्य रूप से कमिट, कमिट, टैग और रीफ़ सहित एक कमिट का प्रतिनिधित्व करती है। यह भी देखें stackoverflow.com/questions/23303549/…
Cascabel

193

आलसी के लिए, का उपयोग करें git log --stat


14
मुझे यह उपयोगी लगा, -10पिछले दस कमिट्स को दिखाने के लिए एक जोड़ा गया ।
चॉयलटन बी। हिगिनबॉटम

2
जब आप प्रतिबद्ध इतिहास देख रहे हों, Qतो टर्मिनल पर वापस आने के लिए टाइप करें।
स्टीवोइसक

180
git diff --shortstat

आप बस लाइनों की संख्या बदल गया और जोड़ा गया। यह केवल अस्थिर परिवर्तनों के साथ काम करता है। एक शाखा के खिलाफ तुलना करने के लिए:

git diff --shortstat some-branch

3
ठंडा! लेकिन .. ध्यान रखें कि यह केवल अस्थिर परिवर्तनों के साथ काम करता है
टॉमकोबो

3
यदि आपने परिवर्तनों का मंचन किया है git add, तो सुनिश्चित करेंgit diff --shortstat --cached
TomNash

2463 फाइलें बदल गईं, 39745 सम्मिलन (+), 21383 विलोपन (-) मैंने वास्तव में पिछले महीने में लगभग 5k से 10k तक हटा दिया है। यह लगभग सब कुछ है जो मैं चारों ओर घूम रही चीजों से अलग कर रहा हूं। कुछ गड़बड़ है। इसमें हटाई गई फ़ाइलें या कुछ शामिल नहीं है?
jgmjgm

46
git diff --stat commit1 commit2

संपादित करें: आपको कमिट को भी निर्दिष्ट करना होगा (मापदंडों के बिना यह सूचकांक के खिलाफ काम करने वाली निर्देशिका की तुलना करता है)। उदाहरण के लिए

git diff --stat HEAD^ HEAD

की मूल की तुलना करने के HEADसाथ HEAD


1
वहाँ वास्तव में किसी भी उपयोग करने की आवश्यकता नहीं है diff-index- diffदृश्यपटल सब कुछ संभाल सकता है; के मामले से diff-indexकवर किया गया है --cached/--staged, मुझे विश्वास है। (और diff-indexओपी के पूछे अनुसार दो मनमाने तरीके से तुलना करने का उपयोग करने का कोई तरीका नहीं है ।)
कैस्केबेल

इस का आउटपुट मेरे लिए कुछ भी नहीं है।
माइक

@ मायके: क्या आपने एक कैरेट को छोड़ दिया? क्या आपका सबसे हालिया मर्ज कमिट था? अगर कहते हैं कि कोई अंतर नहीं है, यह इसलिए है क्योंकि वहाँ कोई अंतर नहीं है।
Cascabel

6
या अगर git diff --stat HEAD
अनमैक्ड

1
इसके अलावा, आप का उपयोग करके सिर्फ माता-पिता की तुलना में आगे वापस तुलना कर सकते हैं HEAD~n, जहां nहै आप कितनी दूर वापस जाना चाहता हूँ। git diff --stat HEAD~5 HEADपिछले 5 के लिए संयुक्त आँकड़े दिखाएगा जो HEAD के सापेक्ष है।
नाथन बेक

18

यह मानते हुए कि आप abcd123 (पहली प्रतिबद्ध) और wxyz789 (अंतिम प्रतिबद्ध) के बीच अपने सभी कमिट्स की तुलना करना चाहते हैं, समावेशी:

git log wxyz789^..abcd123 --oneline --shortstat --author="Mike Surname"

यह रसीला उत्पादन देता है जैसे:

abcd123 Made things better
 3 files changed, 14 insertions(+), 159 deletions(-)
wxyz789 Made things more betterer
 26 files changed, 53 insertions(+), 58 deletions(-)

इसका आउटपुट मेरे लिए कुछ भी नहीं है (मैंने कमिट किया है और सत्यापित किया है - यह गिट लॉग और किसी अन्य तर्क के साथ उपयोग करके सही है)।
माइक

यह मेरे साथ भी हुआ। दो कमिट गलत क्रम में थे, उन्हें तय करने के लिए चारों ओर स्वैप किया गया।
बॉब एस्पोनाजा

1
प्रतिबद्ध आदेश को अपडेट किया और स्पष्ट किया कि दोनों SHAs क्या दर्शाते हैं। इसे पकड़ने के लिए धन्यवाद :)
Ron DeVera

3
--shortstatझंडा भयानक है, यह के साथ काम करता git diffहै, हालांकि (नहीं git log)।
भाग्यदेव

उन्हें कैसे संक्षेप में प्रस्तुत करना है?
xpto

13

एक निश्चित अवधि में सभी परिवर्तन लॉग प्राप्त करने का दूसरा तरीका

git log --author="Tri Nguyen" --oneline --shortstat --before="2017-03-20" --after="2017-03-10"

आउटपुट:

2637cc736 Revert changed code
 1 file changed, 5 insertions(+), 5 deletions(-)
ba8d29402 Fix review
 2 files changed, 4 insertions(+), 11 deletions(-)

एक लंबी आउटपुट सामग्री के साथ, आप अधिक पढ़ने योग्य फ़ाइल के लिए निर्यात कर सकते हैं

git log --author="Tri Nguyen" --oneline --shortstat --before="2017-03-20" --after="2017-03-10" > /mnt/MyChangeLog.txt

2

यद्यपि उपरोक्त सभी उत्तर सही हैं, यदि किसी को पिछले कई कमिट्स की गिनती की आवश्यकता है, तो नीचे का उपयोग करना आसान है

नीचे एक अंतिम 5 कमिट्स की गिनती प्राप्त करना है

git diff $(git log -5 --pretty=format:"%h" | tail -1) --shortstat

पिछले 10 कमिट्स की गिनती प्राप्त करने के लिए

git diff $(git log -10 --pretty=format:"%h" | tail -1) --shortstat

जेनेरिक - एन पिछले कई की गिनती के साथ परिवर्तन की जरूरत है

git diff $(git log -N --pretty=format:"%h" | tail -1) --shortstat

शुरू होने से सभी कमिट्स की गणना करने के लिए

git diff $(git log --pretty=format:"%h" | tail -1) --shortstat


यह "" पूंछ "को आंतरिक या बाहरी कमांड, ऑपरेबल प्रोग्राम या बैच फ़ाइल के रूप में मान्यता नहीं देता है।"
चार्ल्स रोडी


1

मैंने सिर्फ अपने लिए इस समस्या को हल किया है, इसलिए मैं जो कुछ भी आया हूं उसे साझा करूंगा। यहाँ अंतिम परिणाम है:

> git summary --since=yesterday
total: 114 file changes, 13800 insertions(+) 638 deletions(-)

अंतर्निहित कमांड इस तरह दिखता है:

git log --numstat --format="" "$@" | awk '{files += 1}{ins += $1}{del += $2} END{print "total: "files" files, "ins" insertions(+) "del" deletions(-)"}'

$@अपने तर्क जैसे --author="Brian"या पर पारित करने के लिए लॉग कमांड में ध्यान दें --since=yesterday

एक गीदड़ उर्फ ​​में गड़बड़ करने के लिए awk से बचना गन्दा था, इसलिए इसके बजाय, मैंने इसे अपने पथ पर एक निष्पादन योग्य स्क्रिप्ट में डाल दिया ( ~/bin/git-stat-sum), फिर मेरे उर्फ ​​में स्क्रिप्ट का उपयोग किया .gitconfig:

[alias]
    summary = !git-stat-sum \"$@\"

और यह वास्तव में अच्छी तरह से काम करता है। ध्यान देने वाली एक अंतिम बात यह है कि file changesफाइलों में परिवर्तन की संख्या है, न कि विशिष्ट फ़ाइलों की संख्या। यही मैं ढूंढ रहा था, लेकिन यह वह नहीं हो सकता है जिसकी आप उम्मीद करते हैं।

यहाँ एक और उदाहरण है या दो

git summary --author=brian
git summary master..dev
# combine them as you like
git summary --author=brian master..dev
git summary --all

वास्तव में, आपको किसी भी git logकमांड को बदलने में सक्षम होना चाहिए git summary

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