अपने Mac पर किसी स्थानीय Git प्रोजेक्ट में किसी लाइन को अंतिम बार बदलने वाले कमिट को खोजने के लिए, टर्मिनल खोलें, रिपॉजिटरी में जाएं, और लाइन नंबर रेंज के साथ फ़ाइल पर git blame चलाएं। फिर उसका संदेश और diff पढ़ने के लिए git show के साथ उस कमिट का निरीक्षण करें। Blame वर्तमान लाइन में हुए अंतिम बदलाव की पहचान करता है; यह हमेशा यह उजागर नहीं करता कि लाइन पहली बार कब दिखाई दी या इसे क्यों लिखा गया था।
1. टर्मिनल में रिपॉजिटरी खोलें
यदि आपके पास Finder में प्रोजेक्ट पहले से ही खुला है, तो टर्मिनल खोलें और cd टाइप करें, फिर प्रोजेक्ट फ़ोल्डर को टर्मिनल विंडो में खींचें और Return दबाएं। macOS फ़ोल्डर का पाथ सम्मिलित कर देगा; इससे टाइपिंग की गलतियों से बचा जा सकता है। वैकल्पिक रूप से, पाथ को स्वयं दर्ज करें और यदि इसमें स्पेस शामिल हैं तो इसे इनवर्टेड कॉमा (quote) में रखें, उदाहरण के लिए:
cd "/Users/sam/Projects/My App"
जांचें कि आप Git वर्किंग ट्री के अंदर हैं और Git उपलब्ध है:
git status --short
git --version
यदि पहला कमांड रिपोर्ट करता है कि वर्तमान डायरेक्टरी कोई Git रिपॉजिटरी नहीं है, तो प्रोजेक्ट की वास्तविक रिपॉजिटरी डायरेक्टरी में नेविगेट करें। यदि git अनुपलब्ध है, तो आगे बढ़ने से पहले किसी विश्वसनीय सेटअप के माध्यम से Git इंस्टॉल या सक्षम करें। नीचे दिए गए कमांड मानक शेल सिंटैक्स का उपयोग करते हैं और macOS टर्मिनल के डिफ़ॉल्ट शेल के साथ-साथ अन्य सामान्य शेल्स में भी काम करते हैं।
2. जिस लाइन की आपको आवश्यकता है उसके लिए blame चलाएं
अपने एडिटर में लाइन नंबर खोजें, फिर नीचे दिए गए फ़ाइल पाथ और लाइन नंबर को प्रतिस्थापित करें। यह पाथ रिपॉजिटरी रूट के सापेक्ष (relative) है; जब इसमें स्पेस या शेल मेटाकैरेक्टर शामिल हों तो इसे इनवर्टेड कॉमा में रखें।
git blame -L 42,42 -- "Sources/Settings.swift"
-L 42,42 एनोटेशन को लाइन 42 तक सीमित करता है। Git लाइनों की गिनती 1 से शुरू करता है। आसपास के संदर्भ का निरीक्षण करने के लिए, -L 38,46 जैसी रेंज का उपयोग करें। Git एक कमिट पहचानकर्ता (identifier), लेखक का विवरण, दिनांक जानकारी और लाइन का टेक्स्ट प्रिंट करता है। इसके दस्तावेज़ में blame को प्रत्येक लाइन को अंतिम बार संशोधित करने वाले रिविजन और लेखक को दिखाने के रूप में वर्णित किया गया है, और यह -L के साथ लाइन रेंज चुनने का समर्थन करता है। Git blame documentation
यदि आपको लाइन नंबर नहीं पता है, तो फ़ाइल को अपने एडिटर में खोलें और उसमें प्रदर्शित लाइन नंबरों का उपयोग करें। आप -L को छोड़कर पूरी फ़ाइल के लिए भी blame चला सकते हैं:
git blame -- "Sources/Settings.swift"
जब आप रिपॉजिटरी रूट पर न हों, तो उस डायरेक्टरी के सापेक्ष पाथ का उपयोग करें जहां आपने कमांड चलाया था। यदि Git कहता है कि पाथ मौजूद नहीं है, तो अपनी वर्तमान डायरेक्टरी (pwd) और पाथ के सटीक कैपिटलाइज़ेशन और वर्तनी दोनों की जांच करें।
3. blame द्वारा पहचाने गए कमिट को पढ़ें
लक्षित लाइन के लिए दिखाए गए कमिट पहचानकर्ता को कॉपी करें और इसे git show को पास करें:
git show --format=fuller --stat a1b2c3d
a1b2c3d को अपने आउटपुट से मिले पहचानकर्ता से बदलें। यह कमिट मेटाडेटा और एक फ़ाइल सारांश प्रदर्शित करता है। पैच को भी पढ़ने के लिए, --stat को छोड़ दें:
git show --format=fuller a1b2c3d
लक्षित लाइन के आसपास बदली गई लाइनों, कमिट संदेश और उसी कमिट में बदली गई अन्य फ़ाइलों को देखें। ये विवरण बदलाव के संदर्भ को समझाने में मदद कर सकते हैं। कमिट संदेश यह रिकॉर्ड करता है कि उसके लेखक ने क्या लिखा था; यह डिज़ाइन के औचित्य का प्रमाण नहीं है। Git git show को कमिट जानकारी और उसके टेक्स्टुअल diff को प्रदर्शित करने के रूप में प्रलेखित करता है। Git show documentation
जब blame किसी फॉर्मेटिंग या मूव कमिट की ओर संकेत करता है
हो सकता है कि किसी लाइन को बड़े पैमाने पर फॉर्मेटिंग, नाम बदलने (rename) या कोड मूव द्वारा छुआ गया हो। उस स्थिति में, आरोपित (blamed) कमिट वह नहीं हो सकता जिसने मूल रूप से लॉजिक पेश किया था। मूव और कॉपी पहचान (detection) का प्रयास करें:
git blame -M -C -L 42,42 -- "Sources/Settings.swift"
-M Git को एक फ़ाइल के भीतर स्थानांतरित (moved) लाइनों का पता लगाने के लिए कहता है, जबकि -C अन्य फ़ाइलों से कॉपी या स्थानांतरित की गई लाइनों को भी देखता है। ये विकल्प Git को कुछ रिफैक्टरों को ट्रैक करने में मदद करते हैं, लेकिन पहचान मेल खाने वाली सामग्री पर निर्भर करती है और हो सकता है कि यह हर इतिहास का समाधान न करे। Git blame documentation
यदि किसी रिपॉजिटरी में फॉर्मेटिंग जैसे व्यापक परिवर्तनों के लिए .git-blame-ignore-revs फ़ाइल है, तो आप Git से इसका उपयोग करने के लिए कह सकते हैं:
git blame --ignore-revs-file .git-blame-ignore-revs -L 42,42 -- "Sources/Settings.swift"
यह प्रासंगिक बदलाव को पहचानना आसान बना सकता है, लेकिन अनदेखा किए गए रिविजन एनोटेशन को प्रभावित करते हैं; यदि परिणाम अप्रत्याशित लगता है तो रिपॉजिटरी की इग्नोर फ़ाइल का निरीक्षण करें या उस विकल्प के बिना blame चलाकर तुलना करें। Git दस्तावेज़ इस विकल्प को सूचीबद्ध करता है, और GitHub समान ignore-revisions फ़ाइल परंपरा का दस्तावेज़ीकरण करता है। Git blame documentation
blame आपको क्या नहीं बता सकता
Blame उन लाइनों को एनोटेट करता है जो चयनित फ़ाइल संस्करण में मौजूद हैं। यह हटाई गई या प्रतिस्थापित लाइनों को सीधे नहीं दिखाता है, और सबसे हालिया संशोधन करने वाला कमिट मूल परिचय से भिन्न हो सकता है। हटाए गए टेक्स्ट या पहले की फ़ाइल स्थितियों के लिए, कमिट diffs और इतिहास का निरीक्षण करें; Git का blame दस्तावेज़ सामग्री को हटाने या बदलने वाले परिवर्तनों के लिए git diff और इतिहास खोजों की ओर संकेत करता है। Git blame documentation
यदि रिपॉजिटरी GitHub पर होस्ट की गई है और आपके पास इसकी पहुंच है, तो आप फ़ाइल भी खोल सकते हैं और ब्राउज़र में लाइन-दर-लाइन इतिहास देखने के लिए Blame का चयन कर सकते हैं। उस बदलाव का निरीक्षण करने के लिए किसी कमिट संदेश पर क्लिक करें, या उससे पहले फ़ाइल को देखने के लिए संस्करण नियंत्रण का उपयोग करें। GitHub Docs: Viewing and understanding files
स्रोत
Git blame documentation — Git
Git show documentation — Git
Viewing and understanding files — GitHub Docs