git ने अपने अंतिम परिवर्तन के खिलाफ फाइल को अलग कर दिया


236

क्या किसी विशिष्ट फ़ाइल के बीच अंतर उत्पन्न करने के लिए यह संभव है कि यह अभी मौजूद है, और जैसा कि अंतिम प्रतिबद्ध के पहले अस्तित्व में था जिसने इसे बदल दिया?

अगर हम जानते हैं कि:

$ git log --oneline myfile
123abc Fix some stuff
456def Frobble the foos
789dba Initial commit

फिर git diff 456def myfileमायफाइल में अंतिम परिवर्तन दिखाता है। द्वारा उत्पादित ज्ञान के बिना भी ऐसा करना संभव है git log; 123abc में क्या बदला?


8
मैं उपयोग करने को प्राथमिकताgit diff HEAD^ <file_path>
asgs

4
@asgs - वह नहीं करता जो मैं पूछ रहा था (दो कारणों से - HEAD^है 123abc, HEAD^^है 456def, और यदि अन्य HEAD^
कमिटियाँ

आप रहे हों तो सही, याद किया "पिछले है कि यह बदल प्रतिबद्ध" भाग
asgs

जवाबों:


215

यह मौजूद है, लेकिन यह वास्तव में इसकी एक विशेषता है git log:

git log -p [--follow] [-1] <path>

ध्यान दें कि -pइनलाइन को एक ही कमिट से अलग दिखाने के लिए भी इस्तेमाल किया जा सकता है:

git log -p -1 <commit>

उपयोग किए गए विकल्प:

  • -p(भी -uया --patch) git-logमैन पेज में छिपा हुआ डीपाइप है , और वास्तव में इसके लिए एक प्रदर्शन विकल्प है git-diff। जब इसका उपयोग किया जाता है log, तो यह उस पैच को दिखाता है जो प्रत्येक कमिट के लिए उत्पन्न होता है , साथ ही साथ कमिटेड जानकारी - और छुपाता है कि निर्दिष्ट को स्पर्श न करें <path>। (यह व्यवहार पैराग्राफ में वर्णित है --full-diff, जिसके कारण प्रत्येक के पूर्ण भिन्न रूप को दिखाया जा सकता है।)
  • -1निर्दिष्ट फ़ाइल में अभी हाल के परिवर्तन दिखाता है ( इसके बजाय इसका उपयोग किया जा सकता है ); अन्यथा, उस फ़ाइल के सभी गैर-शून्य भिन्न दिखाए जाते हैं।-n 1-1
  • --follow नाम बदलने से पहले होने वाले परिवर्तनों को देखना आवश्यक है।

जहां तक ​​मैं बता सकता हूं, यह एक ऐसा तरीका है जो बिना किसी फ़ाइल का उपयोग किए हुए परिवर्तनों के अंतिम सेट को तुरंत देखने git log(या समान) के लिए या तो हस्तक्षेप करने वाले संशोधनों की संख्या की गणना करने या कमिट के हैश को निर्धारित करने का है।

पुराने संशोधनों को देखने के लिए, बस लॉग के माध्यम से स्क्रॉल करें, या एक कमिट या टैग निर्दिष्ट करें जिससे लॉग शुरू करना है। (बेशक, एक प्रतिबद्ध या टैग निर्दिष्ट करना आपको सही समस्या या टैग क्या है, यह पता लगाने की मूल समस्या पर लौटता है।)

जो प्रशंसा का पात्र है, उसकी प्रशंसा करें:

  • मुझे इस उत्तर केlog -p लिए धन्यवाद मिला
  • इसका श्रेय फ्रांसिस्कोपोगा को और इसका जवाब मुझे --followविकल्प दिखाने के लिए ।
  • -n 1विकल्प का उल्लेख करने के लिए क्रिसटाटी का श्रेय और वैरिएंट का उल्लेख करने के लिए एट्टाको -1
  • मुझे वास्तव में प्रलेखन पढ़ने के लिए और यह पता लगाने के लिए कि -p"अर्थ" का अर्थ क्या है, के लिए sweaver2112 को क्रेडिट ।

6
यह मेरे लिए एक महान समाधान था। जब मैंने भाग लिया तो प्रत्येक फाइल और वर्तमान फ़ाइल में इसके अंतर को दिखायाgit log -p filename
इयान जेमिसन

4
उत्तम। बस अंतिम परिवर्तन देखने के लिए, -n 1पैरामीटर जोड़ना उतना ही सरल है । git log -p -n 1 filename
क्रिस बेट्टी

@ क्रिसब्रेटी धन्यवाद; मैंने उसे अपने उत्तर में शामिल कर लिया है!
काइल स्ट्रैंड

1
-n 1द्वारा भी प्रतिस्थापित किया जा सकता है -1, यह परिणाम नहीं बदलता है मैं सिर्फ वाक्यविन्यास पसंद करता हूं:git log -p -1 filename
atatko

1
एक उपयोगी विकल्प है "--स्काइप = [एन]"। आप git log -p -1 --skip=1 <path>दूसरी प्रतिबद्धता प्रदर्शित करने के लिए टाइप कर सकते हैं।
मैकीक ńoziński

220

गिट भिन्न का उपयोग करने के तरीकों में से एक है:

git diff <commit> <path>

और अंतिम प्रतिबद्ध की एक प्रतिबद्धता को संदर्भित करने का एक सामान्य तरीका वास्तविक HEAD के सापेक्ष पथ है। आप HEAD ^ (आपके उदाहरण में यह 123abc होगा) या HEAY ^ ^ (आपके उदाहरण में 456def), आदि के रूप में पिछले कमिट्स का संदर्भ दे सकते हैं ...

तो आपके प्रश्न का उत्तर है:

git diff HEAD^^ myfile

6
ओह बेशक। मैंने कोशिश की HEAD^, लेकिन निश्चित रूप से कुछ भी नहीं पैदा किया। कोशिश करने के लिए नहीं सोचा था HEAD^^
चौलेट

17
हो सकता है लंबे समय से पहले के लिए आसान वाक्यविन्यास:HEAD~2
ibizaman

19
यह सच नहीं है (कम से कम गैट 1.9.0 के लिए) जो HEAD^^ myfileवास्तव में दूसरे-से-अंतिम प्रतिबद्ध को बदल देगा myfile; यह समग्र रूप से दूसरे-से-अंतिम प्रतिबद्ध का उल्लेख करेगा। क्या "फ़ाइल में किए गए अंतिम परिवर्तन को मैं देखना चाहता हूं" या तो यह निर्दिष्ट करने का कोई तरीका नहीं है कि "प्रतिबद्ध हैश का हिस्सा है या उस फ़ाइल में किए गए अंतिम परिवर्तन और वर्तमान संशोधन के बीच कमिट की संख्या की गणना करता है ?"
काइल स्ट्रैंड

3
हम्म, ऐसा लगता है git log -pकि बहुत करीब है।
काइल स्ट्रैंड

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

8

यदि आप एक ग्राफिकल टूल का उपयोग करके ठीक हैं तो यह बहुत अच्छा काम करता है:

gitk <file>

gitk अब सभी कमिट्स दिखाता है जहाँ फ़ाइल अपडेट की गई है। एक कमिटिंग को चिह्नित करना आपको सूची में पिछली कमिट के खिलाफ अंतर दिखाएगा। यह निर्देशिकाओं के लिए भी काम करता है, लेकिन फिर आपको चयनित कमिट के लिए फ़ाइल का चयन करने के लिए भी मिलता है। सुपर उपयोगी!


1
इसके अलावा बहुत उपयोगी: git difftool HEAD^ fileयाgit difftool -d HEAD^ path
हमेशा के लिए 18
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.