किसी भी शाखा में स्ट्रिंग पेश करने वाले Git को कैसे खोजें?


396

मैं एक निश्चित स्ट्रिंग ढूंढने में सक्षम होना चाहता हूं जिसे किसी भी शाखा में किसी भी प्रतिबद्ध में पेश किया गया था, मैं यह कैसे कर सकता हूं? मुझे कुछ मिला (जो मैंने Win32 के लिए संशोधित किया है), लेकिन git whatchangedयह अलग-अलग शाखाओं में नहीं दिखता है (py3k chunk को अनदेखा करें, यह सिर्फ एक msys / जीत लाइन फ़ीड फिक्स है)

git whatchanged -- <file> | \
grep "^commit " | \
python -c "exec(\"import sys,msvcrt,os\nmsvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)\nfor l in sys.stdin: print(l.split()[1])\")" | \
xargs -i% git show origin % -- <file>

यह वास्तव में कोई फर्क नहीं पड़ता अगर आपका समाधान धीमा है।


जवाबों:


685

तुम कर सकते हो:

git log -S <whatever> --source --all

उन सभी कमिटों को खोजने के लिए जो निश्चित स्ट्रिंग को जोड़ते या हटाते हैंwhatever--allपैरामीटर साधन हर शाखा और से शुरू करने के लिए --sourceदिखाने के लिए जो उन शाखाओं की खोज है कि प्रतिबद्ध करने के लिए नेतृत्व का मतलब है। यह अक्सर जोड़ने के लिए उपयोगी है-pपैच दिखाने के कि इनमें से प्रत्येक कमिट के रूप में अच्छी तरह से लागू होगा।

1.7.4 के बाद से git के संस्करणों में भी एक समान -Gविकल्प होता है, जो एक नियमित अभिव्यक्ति लेता है । यह वास्तव में अलग-अलग (और बल्कि अधिक स्पष्ट) शब्दार्थ है, जूनियो हैमनो के इस ब्लॉग पोस्ट में समझाया गया है

जैसा कि थमेरा टिप्पणियों में बताते हैं, आपको खोज शब्द के आसपास उद्धरण देने की आवश्यकता है यदि इसमें रिक्त स्थान या अन्य विशेष वर्ण हैं, उदाहरण के लिए:

git log -S 'hello world' --source --all
git log -S "dude, where's my car?" --source --all

यहाँ की -Gघटनाओं को खोजने के लिए एक उदाहरण दिया गया है function foo() {:

git log -G "^(\s)*function foo[(][)](\s)*{$" --source --all

19
उत्कृष्टता के लिए +1। -S पर इशारा करना एक बात है, चीजों को समझाना, बेहतर। इसके अलावा, मैं उपयोग करना पसंद करता हूं - यह देखने के लिए कि कौन सी शाखाएं आती हैं
सेह

7
@sehe: आपकी अच्छी टिप्पणी के लिए धन्यवाद। मुझे लगता है कि यह ध्यान देने योग्य है कि --decorateकेवल शाखा का नाम प्रत्येक शाखा के सिरे पर प्रतिबद्ध है। वास्तव में मैं वास्तव में उपयोग नहीं करता हूं --sourceया --decorateइसके बजाय, git branch -a --contains <commit-hash>यह जानने के लिए उपयोग करता हूं कि कौन सी शाखाएं हैं जिसमें मैं दिलचस्पी रखता हूं।
मार्क लॉन्गेयर

3
ऐड-इन इनलाइन को देखने के लिए अलग है, साथ ही, FWIW
rogerdpack

1
@MarkLongair यह मर्ज में किए गए बदलावों को नहीं दिखाता है। उन लोगों को भी दिखाने के लिए कोई सुझाव?
पहलवी फिक्री औलिया

2
मेरे लिए यह केवल तभी काम करता है जब मैं -S और खोज शब्द के बीच के स्थान को हटा देता हूं , अर्थात git log -S"dude, where's my car?" --source --all। @ribamar ने यह भी लिखा कि नीचे दिए गए उत्तर में , लेकिन यह आसानी से इस शीर्ष उत्तर के बगल में अनदेखी हो सकती है।
बग 313


20

मार्क लॉन्गेयर का उत्तर उत्कृष्ट है, लेकिन मुझे मेरे लिए काम करने के लिए यह सरल संस्करण मिला है।

git log -S whatever

24
बस स्पष्ट करने के लिए, यह ठीक काम करता है यदि आप जिस कमिटमेंट की तलाश में हैं HEAD, लेकिन यह विशेष रूप से एक रिपॉजिटरी में सभी शाखाओं को देखने के बारे में विशेष रूप से पूछा गया सवाल है।
मार्क लॉन्गेयर

18

उसी उत्तरों के साथ संदेश भेजना:

$ git config --global alias.find '!git log --color -p -S '
  • ! जरूरत है क्योंकि दूसरे तरीके से, git तर्क को सही ढंग से पास नहीं करता है। देखिये यह प्रतिक्रिया
  • --color और -p वास्तव में "whatchanged" दिखाने में मदद करता है

अब आप कर सकते हैं

$ git find <whatever>

या

$ git find <whatever> --all
$ git find <whatever> master develop

6
git log -S"string_to_search" # options like --source --reverse --all etc

एस और "string_to_search" के बीच रिक्त स्थान का उपयोग न करने पर ध्यान दें। कुछ सेटअपों (1.7.1 git) में, आपको एक त्रुटि मिलेगी:

fatal: ambiguous argument 'string_to_search': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions

2

हालांकि यह सीधे आपके सवाल का जवाब नहीं देता है, लेकिन मुझे लगता है कि यह भविष्य में आपके लिए एक अच्छा समाधान हो सकता है। मैंने अपने कोड का एक हिस्सा देखा, जो खराब था। पता नहीं किसने इसे लिखा है या कब। मैं फ़ाइल से सभी परिवर्तन देख सकता था, लेकिन यह स्पष्ट था कि कोड को किसी अन्य फ़ाइल से स्थानांतरित कर दिया गया था। मैं यह जानना चाहता था कि वास्तव में इसे पहली जगह में किसने जोड़ा है।

ऐसा करने के लिए, मैंने गिट बाइसक्ट का उपयोग किया , जो मुझे पापी को खोजने की जल्दी देता है।

मैं भाग गया git bisect startऔर फिर git bisect bad, क्योंकि संशोधन की जांच में समस्या थी। चूंकि मुझे नहीं पता था कि समस्या कब हुई थी, इसलिए मैंने "अच्छा" के लिए पहली प्रतिबद्धता का लक्ष्य रखा git bisect good <initial sha>

फिर मैं बस खराब कोड के लिए रेपो खोजता रहा। जब मैंने इसे पाया, तो मैं भाग गया git bisect bad, और जब यह नहीं था git bisect good:।

~ 11 चरणों में, मैंने ~ 1000 कमिट्स को कवर किया था और सटीक कमिटमेंट पाया था, जहाँ इस मुद्दे को पेश किया गया था। बहुत शानदार।


2

सुनिश्चित नहीं हैं कि स्वीकृत उत्तर मेरे वातावरण में काम क्यों नहीं करता है, आखिरकार मुझे जो चाहिए, उसे प्राप्त करने के लिए मैं कमांड से नीचे चलता हूं

git log --pretty=format:"%h - %an, %ar : %s"|grep "STRING"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.