2013-01-22 45 views
16

के पिछले संस्करण का अंतर देखने पर git diff HEAD^ -- <filename> लेकिन साथ प्रतिबद्ध वहाँ एक विशेष फ़ाइल के लिए एक अंतर देखने के लिए के बाद से यह पिछले था प्रतिबद्ध एक बराबर आशुलिपि है, इस पर ध्यान दिए बिना कि कितने काम हुए हैं? या वापस उस विशेष फ़ाइल के एन काम करता है?आशुलिपि पिछले के बाद से मैं आसानी से पता कर सकते हैं क्या एक फ़ाइल के लिए बदल फ़ाइल

प्रसंग:। मैं एक फ़ाइल में एक त्रुटि पाया और मैं नीचे ट्रैक करने के लिए जब यह में snuck चाहते यह केवल करता है कि उस में परिवर्तन शामिल दिखाने के लिए git log -<n> <filename> साथ एक विशेष फ़ाइल के लिए एक लॉग रिपोर्ट प्राप्त करने के लिए पर्याप्त आसान है फ़ाइल। तो स्पष्ट रूप से मैं केवल log रिपोर्ट से SHA को कॉपी और पेस्ट कर सकता हूं, लेकिन जो मैं वास्तव में चाहता हूं वह git diff^-- <filename> या git diff ~2 -- <filename> जैसे कुछ करने में सक्षम होना है।

+2

क्या आप वाकई 'गिट दोष' नहीं चाहते हैं? –

उत्तर

34
$ git log -p <filename> 

आपको नामित फ़ाइल को छूने वाले प्रत्येक प्रतिबद्धता के लिए लॉग संदेश और एक अंतर दिखाएगा।

पिछले संस्करण में अंतर केवल दिखाने के लिए, लॉग इतिहास में केवल एक चरण के लिए पूछना:

$ git log -1 -p <filename> 
+1

मुझे यह अजीब लगता है कि यह ओपी की तलाश में सबसे नज़दीकी चीज प्रतीत होता है, लेकिन फिर भी यह काफी उपयोगी है। धन्यवाद। –

+0

@MattMcHenry वास्तव में अच्छा है। ओपी में पूछे गए अनुसार, मैंने अंतिम उत्तर में बदलाव दिखाने के लिए अपना उत्तर और जोड़ा वाक्यविन्यास संपादित किया। –

1

git blame बहुत तेजी से अपने गंतव्य के लिए आप मिलना चाहिए।

3

आप git log स्वरूपण का उपयोग कर सकते हैं ताकि फ़ाइल में पिछले कामों के हैंश प्राप्त हो सकें। उदाहरण के लिए,

git log --pretty=format:'%h' -1 --skip=1 <filename> 

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

[alias] 
    prior-hash = "!ph() { git log --pretty=format:'%h' -1 --skip=$1 $2; }; ph" 

इसका इस्तेमाल करने के लिए आपको git prior-hash n <filename>, जहां n (एन + 1) वें है की तरह कुछ टाइप करेंगे: पुराने हैश प्राप्त करने के लिए, आप एक Git उर्फ ​​एक खोल फ़ंक्शन को कॉल करने, इस तरह सेट कर सकते हैं फ़ाइल का सबसे हालिया संस्करण। तो फ़ाइल को अंतिम प्रतिबद्ध करने के लिए दूसरा 2 होगा, 2 अंतिम से तीसरा होगा, आदि, और 0 उस फ़ाइल को छूने के लिए सबसे हालिया प्रतिबद्धता होगी। और फिर, फ़ाइल नाम वैकल्पिक है, यदि आप पूरी तरह से रेपो की जांच करना चाहते हैं।

मुझे यकीन है कि आप यह पता लगाने सकता है वहाँ से एक diff आदेश का निर्माण करने के लिए कैसे कर रहा हूँ:

[alias] 
    prior-hash = "!ph() { git log --pretty=format:'%h' -1 --skip=$1 $2; }; ph" 
    diff-prev-easy = "!dp() { git diff $(git prior-hash $1 $2).. $2; }; dp" 

जो पूर्व-हैश उर्फ, git diff-prev-easy n <filename> के समान इस्तेमाल किया जाएगा। यह फ़ाइल के सबसे हालिया संशोधन के लिए अंतिम संशोधन (एन + 1) की तुलना करेगा।

[alias] 
    prior-hash = "!ph() { git log --pretty=format:'%h' -1 --skip=$1 $2; }; ph" 
    diff-prev = "!dp() { git diff $(git prior-hash $1 $2)..$(git prior-hash $(($1 - 1)) $2) $2; }; dp" 

, फिर से, एक ही तरह से प्रयोग किया जाता है जो: git diff-prev n <filename>

एक संभावित आप के बजाय वें पिछले संशोधन के वें पिछले संशोधन (n + 1) की तुलना करना चाहते हैं तो यह एक साधारण परिवर्तन है हालांकि, देखने के लिए समस्या यह है कि git log सूचियां क्रोनोलॉजिकल ऑर्डर में होती हैं, जो आप नहीं चाहते हैं। इस इतिहास पर विचार करें:

1 - 2 - - - 4 - 5 master 
     \  /
     3 - -  develop 

हमारे git diff-prev 1 आदेश की उम्मीद के रूप में, के बीच प्रतिबद्ध 4 और 5 diff का उत्पादन होगा। लेकिन git diff-prev 2 प्रतिबद्धता 3 और 4 के बीच अंतर दिखाएगा, जो संभवतः अवांछित है।

+0

मुझे ओपी के बारे में पता नहीं है, लेकिन यह वही है जो मुझे चाहिए था। धन्यवाद। –