Git दोष - पूर्व प्रतिबद्ध है?


390

यह देखने के लिए है जो एक विशिष्ट लाइन संपादित संभव है से पहले द्वारा रिपोर्ट प्रतिबद्ध git blameएक दिया लाइन के लिए प्रतिबद्ध का एक इतिहास की तरह?

उदाहरण के लिए, मैं निम्नलिखित (शानदार uncrustifyपरियोजना पर) चलाता हूं :

$ git blame -L10,+1 src/options.cpp
^fe25b6d (Ben Gardner 2009-10-17 13:13:55 -0500 10) #include "prototypes.h"

मैं यह कैसे पता लगा सकता हूं कि प्रतिबद्ध होने से पहले उस पंक्ति को किसने संपादित किया था fe25b6d। और कौन इसे पहले संपादित कि प्रतिबद्ध?


7
यदि आप पिछले कमिट्स का कारण खोज रहे हैं तो व्हॉट्सएप परिवर्तन -wविकल्प का उपयोग करते हैं । -Mस्थानांतरित / कॉपी किए गए कोड के लिए भी है
brita_

सभी कमिट्स को देखने के लिए, जिसमें दिए गए शब्द शामिल हैं, मेरी स्क्रिप्ट नीचे देखें
VonC

यहाँ इस कार्यशीलता को जोड़ने के लिए एक उपयोगी स्क्रिप्ट है github greasyfork.org/en/scripts/…
आरोन हॉफमैन

3
@AaronHoffman द्वारा पोस्ट किए जाने पर यह निश्चित नहीं है कि github कैसा दिख रहा है, लेकिन यह बहुत आसान है कि दोष दें - और पिछले संस्करणों के लिए दोष प्राप्त करें - अब github में
रफिन

जवाबों:


389
git blame -L 10,+1 fe25b6d^ -- src/options.cpp

आप से वापस शुरू करने के लिए गिट दोष के लिए एक संशोधन निर्दिष्ट कर सकते हैं (डिफ़ॉल्ट के बजाय HEAD); fe25b6d^का जनक है fe25b6d


106
क्या आप अलग-अलग हैश के साथ कई बार कमांड को फिर से दर्ज किए बिना एक पूरा इतिहास प्राप्त कर सकते हैं?
एंडर्स ज़ोमारिन

13
मुझे विश्वास नहीं है कि गिट के पास प्रत्येक दोष प्राप्त करने का एक अंतर्निहित तरीका है जो एक लाइन नंबर को छूता है (जो कि किस तरह का अर्थ है, क्योंकि किसी दिए गए लाइन में प्रविष्टि और विलोपन के कारण फ़ाइल के इतिहास में एक सुसंगत लाइन नंबर नहीं हो सकता है लाइनों के)।
एम्बर

17
@ एम्बर: बहुत यकीन है कि आप सही कह रहे हैं कि यह सुविधा मौजूद नहीं है, लेकिन यह ऐसा लगता है जैसे यह भोलेपन से लागू किया जा सकता है, बस एक इंसान क्या कर सकता है: इसे एक बार दोष दें, रिपोर्ट की गई जानकारी को पकड़ो, दोष दें , और इसी तरह।
कैस्केबेल

15
git gui लाइन के इतिहास की जांच करना काफी आसान बनाता है क्योंकि संस्करण क्लिक करने योग्य हैं।
ज़िट्रैक्स

5
@shadyabhi --को आमतौर पर कमांड लाइन के तर्कों में विभाजक के रूप में उपयोग किया जाता है - गिट के मामले में, आमतौर पर कमिटेड हैश जैसी चीजों को फ़ाइलनाम की सूची से अलग करने के लिए उपयोग किया जाता है।
अम्बर

191

आप लाइनों की एक श्रृंखला के विकास को देखने के लिए git log -L का उपयोग कर सकते हैं ।

उदाहरण के लिए :

git log -L 15,23:filename.txt

का अर्थ है "फ़ाइलनाम 15 नाम की पंक्तियों का विकास 15 से 23 तक।


12
यह एक ठोस उत्तर है और समय के साथ विशिष्ट रेखाओं में परिवर्तन को कैसे देखा जाए, इसके बारे में एंडर्स ज़ोमेरिन के सवाल पर संबोधित किया गया है।
bigtex777

4
FYI करें: git log -L <start>, <end>: <file> के लिए Git 1.8.4+ की आवश्यकता है: git-scm.com/docs/git-log#git-log--Laxstartgtltendgtltfgt सिंटैक्स विकल्पों के लिए
नियॉन

30

एम्बर का जवाब सही है लेकिन मुझे यह स्पष्ट नहीं मिला; वाक्य रचना है:

git blame {commit_id} -- {path/to/file}

नोट: --ट्री-ईश sha1 को सापेक्ष फ़ाइल पथों से अलग करने के लिए उपयोग किया जाता है। 1

उदाहरण के लिए:

git blame master -- index.html

सभी चीजों को जानने के लिए एम्बर को पूरा श्रेय ! :)


1
मैं आपकी भावना से सहमत हूं। टिप्पणी प्रणाली हालांकि सभी सूचनाओं को स्पष्ट रूप से प्रस्तुत करने के लिए बहुत सीमित है। मैंने एक टिप्पणी में इस उत्तर की सामग्री को जोड़ा है; हालाँकि, मैं इस उत्तर को छोड़ने के लिए कहता हूं कि यह आसानी से उपलब्ध है।
थोरसुमोनर

1
यह या तो एक अलग पोस्ट या एक संपादन होना चाहिए। मुझे यह एक अलग उत्तर के रूप में पसंद है।
15

27

आप जाँच करना चाहते हैं:

git gui blame <filename>

आपको "गिट दोष" जैसे परिवर्तनों का एक अच्छा चित्रमय प्रदर्शन देता है, लेकिन प्रति पंक्ति क्लिक करने योग्य लिंक के साथ, पहले के कमिट में स्थानांतरित करने के लिए। प्रतिबद्ध विवरण के साथ पॉपअप प्राप्त करने के लिए लिंक पर होवर करें। नहीं मेरे क्रेडिट ... यह यहाँ पाया:

http://zsoltfabok.com/blog/2012/02/git-blame-line-history/

git guigit के लिए एक ग्राफिकल Tcl / Tc इंटरफ़ेस है। किसी भी अन्य परम के बिना यह फाइल, हॉक या यहां तक ​​कि एकल लाइनों और अन्य समान कमांड जैसे संशोधन, रिवर्ट, पुश करने के लिए एक बहुत ही सरल लेकिन उपयोगी ग्राफिकल ऐप शुरू करता है ... यह गिट स्टॉक सूट का हिस्सा है। खिड़कियों पर यह इंस्टॉलर में शामिल है। डेबियन पर - मुझे अन्य * निक्स सिस्टम के बारे में पता नहीं है - इसे अलग से स्थापित करना होगा:

apt-get install git-gui

डॉक्स से:

https://git-scm.com/docs/git-gui

विवरण

गिट के लिए एक Tcl / Tk आधारित ग्राफिकल यूजर इंटरफेस। git gui उपयोगकर्ताओं को नए कमिट करके, मौजूदा वाले को संशोधित करने, शाखाएं बनाने, स्थानीय मर्ज का प्रदर्शन करने और दूरस्थ रिपॉजिटरी पर पुश / पुश करने के द्वारा अपने भंडार में बदलाव करने की अनुमति देने पर ध्यान केंद्रित करता है।

Gitk के विपरीत, git gui प्रतिबद्ध पीढ़ी और एकल फ़ाइल एनोटेशन पर केंद्रित है और प्रोजेक्ट इतिहास नहीं दिखाता है। हालाँकि यह git gui के भीतर से gitk सत्र शुरू करने के लिए मेनू क्रियाओं की आपूर्ति करता है।

git gui को सभी लोकप्रिय UNIX सिस्टम, Mac OS X और Windows (Cygwin और MSYS दोनों के तहत) पर काम करने के लिए जाना जाता है। कुछ हद तक OS विशिष्ट उपयोगकर्ता इंटरफ़ेस दिशानिर्देशों का पालन किया जाता है, जिससे उपयोगकर्ताओं के लिए git gui एक काफी देशी इंटरफ़ेस बन जाता है।

कमानों

दोष

दिए गए संस्करण (या निर्दिष्ट नहीं होने पर काम करने वाली निर्देशिका) पर निर्दिष्ट फ़ाइल पर एक दोष दर्शक शुरू करें।

ब्राउज़र

एक ट्री ब्राउज़र शुरू करें जो निर्दिष्ट कमेटी में सभी फाइलों को दिखा रहा है। ब्राउज़र के माध्यम से चुनी गई फ़ाइलें दोष दर्शक में खोली जाती हैं।

citool

गिट गिनी शुरू करें और बाहर निकलने और शेल पर लौटने से पहले वास्तव में एक प्रतिबद्ध बनाने की व्यवस्था करें। इंटरफ़ेस केवल कमिटमेंट एक्शन तक सीमित है, एप्लिकेशन के स्टार्टअप समय को थोड़ा कम करता है और मेनूबार को सरल करता है।

संस्करण

Git gui का वर्तमान में चल रहा संस्करण प्रदर्शित करें।


यह मेरे लिए काम नहीं करता है। मैं दिए गए लाइन में परिवर्तन पर क्लिक कर सकता हूं, लेकिन यह सिर्फ उस कमिट के लिए होने वाले दृश्य को बदलता है, और वर्तमान लाइन अब के रूप में दिखाता है this: लेकिन मैं लाइन के पिछले संस्करण को कैसे देख सकता हूं और जब इसे जोड़ा गया था?
BeeOnRope

यह एक उपयोग मामला है, जहां मुझे पता है कि कहां
गिट्टी

17

पिछले उत्तर पर निर्माण, यह बैश वन-लाइनर आपको वह देना चाहिए जो आप खोज रहे हैं। यह पिछले 5 संशोधनों के माध्यम से एक विशेष फ़ाइल की एक विशेष पंक्ति के लिए गिट दोष इतिहास को प्रदर्शित करता है:

LINE=10 FILE=src/options.cpp REVS=5; for commit in $(git rev-list -n $REVS HEAD $FILE); do git blame -n -L$LINE,+1 $commit -- $FILE; done

इस कमांड के आउटपुट में, आप किसी विशेष कमिट के लिए, लाइन परिवर्तन की सामग्री या प्रदर्शित लाइन नंबर भी बदल सकते हैं।

यह अक्सर इंगित करता है कि उस विशेष प्रतिबद्ध के बाद पहली बार लाइन को जोड़ा गया था। यह यह भी संकेत कर सकता है कि लाइन फ़ाइल के दूसरे भाग से स्थानांतरित की गई थी।


5
ध्यान दें कि यह अंतिम $ REVS संशोधन है जिसमें $ FILE बदल गया है, बजाय पिछले $ REVS संशोधन के जिसमें $ LINE बदल गया।
मैक्स नानसी

आप किस उत्तर का जिक्र कर रहे हैं?
15

मुझे अब याद नहीं है। संभवत: मैं अपने उत्तर को बेहतर ढंग से भविष्य में प्रमाणित कर सकता था।
विल शेपर्ड


11

इस समस्या के लिए एक बहुत ही अनूठा समाधान गिट लॉग का उपयोग कर रहा है:

git log -p -M --follow --stat - path / to / your / file

जैसा कि यहां आंद्रे द्वारा समझाया गया है


1
मैंने इसका उपयोग करने के लिए एक उपनाम बनाया: git config --global alias.changes 'log -p -M --follow --stat --'और फिर मैं बस टाइप कर सकता हूंgit changes path/to/your/file
Tizio Fittizio

यह अब तक का सबसे अच्छा जवाब है और वास्तव में मैं क्या देख रहा था। सरल और सुरुचिपूर्ण।
18

10

यदि आप JetBrains Idea IDE (और डेरिवेटिव) का उपयोग कर रहे हैं, तो आप कई पंक्तियों का चयन कर सकते हैं, संदर्भ मेनू के लिए राइट क्लिक करें, फिर Git -> चयन के लिए इतिहास दिखाएं। आप उन कमिट्स की सूची देखेंगे जो चयनित लाइनों को प्रभावित कर रहे थे:

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


यह मेरे लिए अन्य उत्तरों (इंटेलीज का उपयोग करके) से बेहतर काम करता था। सभी संशोधनों को लोड करने के लिए कुछ समय लिया गया, लेकिन प्रतीक्षा के लायक।
स्टीव चेम्बर्स

1

विल शेपर्ड के उत्तर पर निर्माण, उनके आउटपुट में उन कमियों के लिए डुप्लिकेट लाइनें शामिल होंगी जहां कोई बदलाव नहीं हुआ था, इसलिए आप उन्हें निम्नानुसार फ़िल्टर कर सकते हैं (इस उत्तर का उपयोग करके )

LINE=1 FILE=a; for commit in $(git rev-list HEAD $FILE); do git blame -n -L$LINE,+1 $commit -- $FILE; done | sed '$!N; /^\(.*\)\n\1$/!P; D'

ध्यान दें कि मैंने REVS तर्क को हटा दिया है और यह रूट कमिट में वापस चला जाता है। यह मैक्स नानसी के ऊपर अवलोकन के कारण है।


1

डेविडएन के उत्तर पर निर्माण और मैं नाम बदलकर फ़ाइल का पालन करना चाहता हूं:

LINE=8 FILE=Info.plist; for commit in $(git log --format='%h%%' --name-only --follow -- $FILE | xargs echo | perl -pe 's/\%\s/,/g'); do hash=$(echo $commit | cut -f1 -d ','); fileMayRenamed=$(echo $commit | cut -f2 -d ','); git blame -n -L$LINE,+1 $hash -- $fileMayRenamed; done | sed '$!N; /^\(.*\)\n\1$/!P; D'

रेफरी: जीआईटी लॉग में अच्छी तरह से फ़ाइल का नाम बदलें इतिहास


1

Git 2.23 के रूप में आप उपयोग कर सकते हैं git blame --ignore-Rev का

प्रश्न में दिए गए उदाहरण के लिए यह होगा:

git blame -L10,+1 src/options.cpp --ignore-rev fe25b6d

(हालाँकि यह एक ट्रिक प्रश्न है क्योंकि fe25b6d फ़ाइल का पहला संशोधन है!)


0

मैं इस छोटे से बश लिपि का उपयोग एक दोषपूर्ण इतिहास को देखने के लिए करता हूं।

पहला पैरामीटर: देखने के लिए फ़ाइल

इसके बाद के पैरामीटर: दोष देने के लिए पारित किया गया

#!/bin/bash
f=$1
shift
{ git log --pretty=format:%H -- "$f"; echo; } | {
  while read hash; do
    echo "--- $hash"
    git blame $@ $hash -- "$f" | sed 's/^/  /'
  done
}

आप -L 70, + 10 जैसे दोष-मापदंडों की आपूर्ति कर सकते हैं , लेकिन गिट दोष के रेगेक्स-खोज का उपयोग करना बेहतर है क्योंकि समय के साथ लाइन-संख्याएं आमतौर पर "परिवर्तन" करती हैं।


0

स्टैंगल्स के जवाब पर बनाएँ , मैंने इस पटकथा को अपने पैट (विंडोज पर भी) git-bh के रूप में रखा:

इससे मुझे उन सभी कमिटों को देखने की अनुमति मिलती है जहाँ एक शब्द शामिल था:

git bh path/to/myfile myWord

स्क्रिप्ट:

#!/bin/bash
f=$1
shift
csha=""
{ git log --pretty=format:%H -- "$f"; echo; } | {
  while read hash; do
    res=$(git blame -L"/$1/",+1 $hash -- "$f" 2>/dev/null | sed 's/^/  /')
    sha=${res%% (*}
    if [[ "${res}" != "" && "${csha}" != "${sha}" ]]; then
      echo "--- ${hash}"
      echo "${res}"
      csha="${sha}"
    fi
  done
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.