git: कैसे एक पुल के बाद परिवर्तित फ़ाइलों बनाम पिछले संस्करणों में?


117

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

कैसे किया जाता है?

मैं मान रहा हूँ कि यह "git diff" के लिए कुछ मापदंडों के साथ प्रतिबद्ध x बनाम प्रतिबद्ध y के लिए है, लेकिन मैं वाक्यविन्यास प्राप्त नहीं कर सकता। मुझे "git log" भी थोड़ा भ्रमित करने वाला लगता है और मुझे यकीन नहीं है कि मेरे नए बनाम फ़ाइल के नवीनतम संस्करण की प्रतिबद्ध आईडी कहां मिलेगी।


1
आप अपने स्वाद के लिए gitk ग्राफिकल टूल को ढूंढ सकते हैं।
crazyscot

stackoverflow.com/questions/61002/… यह एक जैसा हो सकता है
VonC

जवाबों:


158

कमिट निर्दिष्ट करने के लिए सभी प्रकार के अद्भुत तरीके हैं - अधिक विवरण के लिए निर्दिष्ट संशोधन अनुभाग man git-rev-parseदेखें। इस मामले में, आप शायद चाहते हैं:

git diff HEAD@{1}

इसका @{1}मतलब है "रेफ की पिछली स्थिति जो मैंने निर्दिष्ट की है", ताकि आप जो पहले चेक आउट कर चुके हैं, उसका मूल्यांकन - पुल से ठीक पहले हो। आप हमले कर सकते हैं HEADवहाँ अंत पर अगर आप भी अपने काम के पेड़ में कुछ बदलाव किया है और आप उनके लिए डिफ को देखने के लिए नहीं करना चाहती।

मुझे यकीन नहीं है कि आप "फ़ाइल के मेरे नवीनतम संस्करण की प्रतिबद्ध आईडी" के साथ क्या पूछ रहे हैं - प्रतिबद्ध "आईडी" (SHA1 हैश) आउटपुट में हर प्रविष्टि के शीर्ष पर 40-वर्ण हेक्स है। गिट लॉग की। यह संपूर्ण कमिट के लिए हैश है, किसी दिए गए फ़ाइल के लिए नहीं। आपको वास्तव में कभी भी अधिक की आवश्यकता नहीं है - यदि आप पुल में सिर्फ एक फ़ाइल को फैलाना चाहते हैं, तो करें

git diff HEAD@{1} filename

यह एक सामान्य बात है - यदि आप दिए गए कमिट में किसी फाइल की स्थिति के बारे में जानना चाहते हैं, तो आप कमिट और फाइल को निर्दिष्ट करते हैं, न कि फाइल के लिए एक आईडी / हैश।


VonC की लिंक की गई पिछली पोस्ट अनिवार्य रूप से इस तरह से एक ही बात कहती है, लेकिन स्पष्टीकरण थोड़ा अलग है, इसलिए मैं इसे अभी के लिए छोड़ दूंगा। (यह भी @{1}एक आशुलिपि के रूप में उपयोग करता है HEAD@{1})
Cascabel

सच है, लेकिन मुझे भी स्पष्टीकरण पसंद है। +1
वॉनसी

यह वही है जो मैं खोज रहा था। समझाने के लिए धन्यवाद।
ल्यूकपेट

+1 जो मैं कर रहा था, उसके लिए। बहुत बढ़िया होगा यदि इसे उत्तर के रूप में चुना गया और शीर्ष पर पहुंच गया ... :)
longda

@ लोंगडा यदि आप वोटों के आधार पर छांट रहे हैं (जो मुझे लगता है कि डिफ़ॉल्ट था) यह पहले से ही शीर्ष पर होना चाहिए।
Cascabel

57

मुझे उपयोग करना पसंद है:

git diff HEAD^

या अगर मैं केवल एक विशिष्ट फ़ाइल को अलग करना चाहता हूं:

git diff HEAD^ -- /foo/bar/baz.txt

5
-1: HEAD^पेरेंट pull
कमिटमेंट है

1
यदि HEADएक मर्ज कमिट है, HEAD^तो पहली पेरेंट कमेटी है, इसलिए हां, यह मेर से पहले की प्रतिबद्धता हो सकती है pull। अन्य माता-पिता (दो तरफा मर्ज के लिए) प्राप्त करने के लिए, का उपयोग करें HEAD^2। लेकिन फिर, उपरोक्त उत्तर वास्तव में पहली जगह में सवाल का जवाब नहीं दे रहा है, इसलिए -1 को छोड़; ;-)
माइकल वाइल्ड

स्पष्टीकरण के लिए धन्यवाद। प्रश्न को बहुत ध्यान से नहीं पढ़ा, क्योंकि मैं किसी और चीज़ के लिए जा रहा था और परिणाम पृष्ठ पर यह लिंक उच्च आया। मुझे लगा कि मैं एक नया उपयोगकर्ता हूँ और मैं कोई कर्म नहीं करूँगा (यदि ऐसा है तो इसे SO कहा जाता है)। मेरी गलती =)
कैडिजम

3
@ मिचेलविल्ड यह नहीं हो सकता है कि पूछने वाला क्या पूछ रहा था, लेकिन यह वही था जिसकी मुझे तलाश थी जब मैंने यह पाया। यह मेरे लिए उपयोगी था। Upvoting।
जॉन ड्वोरक

यह वह है जो कछुआ "पिछले संस्करण के साथ डिफ" करता है। और वही है जिसकी मुझे तलाश थी।
फेबिन हदादी 3

15

यदि आप एक सीधा करते हैं git pullतो आप या तो 'फास्ट-फॉरवर्ड' होंगे या रिमोट रिपॉजिटरी से अज्ञात संख्या को मर्ज करेंगे। हालांकि यह एक एक्शन के रूप में होता है, इसलिए अंतिम खींचतान से पहले आप जिस समय थे, वह रिफ्लॉग में अंतिम प्रविष्टि होगी और इसे एक्सेस किया जा सकता है HEAD@{1}। इसका मतलब है कि आप कर सकते हैं:

git diff HEAD@{1}

हालांकि, मैं दृढ़ता से अनुशंसा करूंगा कि यदि यह ऐसा कुछ है जो आप खुद को बहुत कुछ करते हुए पाते हैं, तो आपको git fetchमैन्युअल रूप से विलय करने या उस पर फिर से काम करने से पहले बस एक ए और भ्रूण की शाखा की जांच करने पर विचार करना चाहिए । जैसे अगर आप मास्टर हैं और मूल / मास्टर में खींचने जा रहे हैं:

git fetch

git log HEAD..origin/master

 # looks good, lets merge

git merge origin/master

यहाँ के git logबजाय का अच्छा उपयोग git diff(भले ही वाक्यविन्यास '..' के लिए git logऔर '...' के बीच थोड़ा असंगत हो git diff); +1 देखें stackoverflow.com/questions/53569/… और stackoverflow.com/questions / 850,607 / ...
VonC

सौभाग्य से अगर आप एक git diff कमांड git में '..' 'सिंटैक्स का उपयोग करते हैं "सही काम करता है"।
सीबी बेली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.