Git में एक फ़ाइल को मनमाने ढंग से कैसे अलग करें?


324

मैं एक फ़ाइल को कैसे अलग कर सकता हूँ, कह सकते हैं pom.xml, मास्टर शाखा से Git में एक पुराने संस्करण में?

जवाबों:


347

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

git diff master~20:pom.xml pom.xml

... अपने वर्तमान की तुलना पहले माता-पिता के माध्यम pom.xmlसे master20 संशोधनों से एक से करें । आप master~20निश्चित रूप से, किसी संशोधन के ऑब्जेक्ट नाम (SHA1sum) के साथ या किसी अन्य संशोधन के कई अन्य तरीकों से बदल सकते हैं

ध्यान दें कि यह वास्तव में पुराने की तुलना pom.xmlआपके वर्किंग ट्री में संस्करण से कर रहा है, न कि संस्करण में प्रतिबद्ध master। यदि आप ऐसा चाहते हैं, तो आप इसके बजाय निम्नलिखित कर सकते हैं:

git diff master~20:pom.xml master:pom.xml

12
ध्यान दें कि यह केवल फाइलों के लिए काम नहीं करता है, यह उदाहरण के लिए (उप) निर्देशिकाओं के लिए भी काम करता है git diff <revision>:foo/ HEAD:foo/

2
यह भी ध्यान दें कि खिड़कियों पर आपको निर्देशिकाओं के लिए फ़ॉरवर्ड स्लैश का उपयोग करने की आवश्यकता है यदि आप एक संशोधन स्पेसिफायर का उपयोग कर रहे हैं या गिट आपको उस संशोधन में मौजूद फ़ाइल / निर्देशिका के बारे में कोई त्रुटि देगा।
डायलन निस्ले

1
@DylanNissley या यह आपको कोई त्रुटि नहीं और कोई अंतर नहीं देगा। यही मैं देख रहा हूं। किसी भी मामले में, बैकस्लैश के बजाय फ़ॉरवर्ड स्लैश का उपयोग करने के बारे में संकेत के लिए धन्यवाद।
गैरी एस।

विंडोज़ फाइल्स के साथ मैंने डायरेक्टरी बदलना आसान कर दिया है और फिर git diff Master ~ 20: ./ pom.xml ./pom.xml
lloyd

Git के कुछ संस्करण के लिए "-" <संशोधन> & <पथ> के बीच की आवश्यकता है
जोश

140
git diff <revision> <path>

उदाहरण के लिए:

git diff b0d14a4 foobar.txt

संस्करण 1.7.11 के लिए काम नहीं करता है यदि फ़ाइल वर्तमान निर्देशिका में नहीं है। उदाहरण: 'git diff f76d078 परीक्षण / विन्यास' पैदावार "त्रुटि:" परीक्षण / f76d078 'तक नहीं पहुँच सका "
simpleuser

1
@ user1663987 परियोजना रूट के सापेक्ष पूर्ण पथ को पास करें git diff <revision> root/path/file:।

1
परीक्षा / कॉन्फ़िग है जड़ के सापेक्ष (परीक्षण के रूप में जड़ का एक उप-निर्देशिका है)। लेकिन तब आपका उदाहरण रूट / पथ / फ़ाइल रूट को सम्मिलित करने के लिए प्रतीत होता है?
सरल जुआन

41

यदि आप किसी एकल फ़ाइल की अंतिम प्रतिबद्धताओं के बीच अंतर देखना चाहते हैं, तो आप कर सकते हैं:

git log -p -1 filename

यह आपको git में फ़ाइल का रूप देगा, आपकी स्थानीय फ़ाइल की तुलना नहीं कर रहा है।


2
यह कुछ भी नहीं लौट रहा है
आंद्रेई क्रिस्टियन प्रोडान

@AndreiCristianProdan तब आपके पास वहाँ कोई परिवर्तन नहीं है। -1जब तक आप बदलाव नहीं लेते तब तक आप कदम से कदम बढ़ा सकते हैं।
कैसर

यह बहुत अच्छा है। मैं एक पार्टी समारोह है कि उपयोगी हो सकता है बनाया: gitlog () { git log -${3:-p} -${2:-1} $1; } की तरह उपयोग किया: gitlog Rakefileया gitlog Rakefile 5और gitlog Rakefile 10 s। पहले एक अंतर दिखाता है; दूसरा पांच भिन्न दिखाता है; तीसरा दस दिखाता है --no-patch
ऑक्सबस

18

यह देखने के लिए कि पिछली कमिट में फ़ाइल में क्या बदला गया था:

git diff HEAD~1 path/to/file.

आप उस नंबर (~ 1) को n-वें कमेट में बदल सकते हैं जिसके साथ आप अंतर करना चाहते हैं।


इस उत्तर वास्तव में से केवल एक विशिष्ट मामला है यह अधिक सामान्य जवाब है, जहां HEAD~1के लिए प्रतिस्थापित किया गया है <revision>, जो इस सवाल का जवाब कोई डुप्लिकेट बनाता है।

1
यह काम नहीं कर रहा है! घातक: अस्पष्ट तर्क 'HEAD ~ 1': अज्ञात संशोधन या कार्यशील पेड़ में पथ नहीं। संशोधन से पथों को अलग करने के लिए '-' का प्रयोग करें
आंद्रेई क्रिस्टियन प्रोडन

यह उत्तर मेरे लिए सरल और क्रियात्मक है।
डगलस फ्रायरी

6

सामान्य वाक्य रचना:

$git diff oldCommit..newCommit -- **FileName.xml > ~/diff.txt

आपके रेपो में कहीं भी "FileName.xml" नाम की सभी फाइलों के लिए।

"-" और "**" के बीच का स्थान देखें

अपने प्रश्न का उत्तर दें:

$git checkout master
$git diff oldCommit..HEAD -- **pom.xml 
or
$git diff oldCommit..HEAD -- relative/path/to/pom.xml 

हमेशा की तरह, आप कमिट करने के लिए एक टैग / sha1 / "HEAD ^" का उपयोग कर सकते हैं।

Ubuntu पर git 1.9.1 के साथ परीक्षण किया गया।


6

अगर न तो कमिटेड आपका HEAD है तो बैश का ब्रेस विस्तार वास्तव में उपयोगी साबित होता है, खासकर यदि आपके फ़ाइलनाम लंबे हैं, उदाहरण के लिए:

git diff master~20:pom.xml master:pom.xml

बन जाएगा

git diff {master~20,master}:pom.xml

बैश के साथ ब्रेस विस्तार पर अधिक ।


6

वर्तमान के लिए 5 प्रतिबद्ध की तुलना करने के लिए, दोनों पर master, बस करो:

git diff master~5:pom.xml master:pom.xml

इसके अलावा आप हैश नंबर का उल्लेख कर सकते हैं, उदाहरण के लिए यदि हैश नंबर है x110bd64, तो आप अंतर देखने के लिए कुछ ऐसा कर सकते हैं:

git diff x110bd64 pom.xml



2

यदि आप एक ग्राफिकल टूल का उपयोग करके ठीक हैं (या इसे पसंद भी कर सकते हैं):

gitk pom.xml

Gitk में आप पॉपअप मेनू में किसी भी कमिट ("इसे" सेलेक्ट "" पर क्लिक कर सकते हैं और "डिफ दिस -> सिलेक्टेड" या "डिफाइंड सिलेक्टेड -> दिस") को सेलेक्ट करने के लिए किसी भी अन्य कमेंट पर क्लिक करें।



0

यदि आपको उदाहरण के लिए स्टैश में किसी एकल फ़ाइल में अंतर करने की आवश्यकता है तो आप कर सकते हैं

git diff stash@{0} -- path/to/file

-1

यदि आप किसी विशिष्ट कमिट पर फ़र्क की तलाश कर रहे हैं और आप कमांड लाइन के बजाय github UI का उपयोग करना चाहते हैं (कहते हैं कि आप इसे अन्य लोगों से जोड़ना चाहते हैं), आप कर सकते हैं:

https://github.com/<org>/<repo>/commit/<commit-sha>/<path-to-file>

उदाहरण के लिए:

https://github.com/grails/grails-core/commit/02942c5b4d832b856fbc04c186f1d02416895a7e/grails-test-suite-uber/build.gradle

शीर्ष दाईं ओर दिए गए पिछले और अगले लिंक पर ध्यान दें जो आपको प्रतिबद्ध सभी फाइलों के माध्यम से नेविगेट करने की अनुमति देता है।

यह केवल एक विशिष्ट प्रतिबद्ध के लिए काम करता है, किसी भी दो मनमाने संस्करणों के बीच तुलना करने के लिए नहीं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.