स्थानांतरित / नामांकित फ़ाइल पर एक अंतर कैसे करना है?


128

मैंने एक फ़ाइल का उपयोग करके स्थानांतरित किया git mv। अब मैं पुरानी फ़ाइल (पुराने, अब गैर-मौजूद नाम के साथ) के साथ तुलना करने के लिए नई फ़ाइल पर एक अंतर करना चाहूंगा।

मैं यह कैसे करु?


4
जल्द ही (git 2.9, जून 2016), एक सरल git diff -- yourRenamedFileपर्याप्त होगा। देखें नीचे मेरा उत्तर
VonC

जवाबों:


145

आप -M का उपयोग करने की जरूरत है जब अंतर फ़ाइल को स्थानांतरित करने के लिए ऑटोडेक्ट करें। बस के git diffरूप में उल्लेख knittl का उपयोग करना मेरे लिए काम नहीं करता है।

तो बस: git diff -Mयह करना चाहिए।

इस स्विच के लिए प्रलेखन है:

-M[<n>], --find-renames[=<n>]
       Detect renames. If n is specified, it is a threshold on the similarity index 
       (i.e. amount of addition/deletions compared to the file’s size). For example, 
       -M90% means git should consider a delete/add pair to be a rename if more than
       90% of the file hasn’t changed.

7
Lifesaver! मेरे git diffs अब बहुत बेहतर हैं। 1) क्या इस विकल्प का उपयोग करना हमेशा सुरक्षित है? 2) क्या मैं इस विकल्प को डिफ़ॉल्ट व्यवहार के रूप में जोड़ सकता हूं ~/.gitconfig?
केविनरपे

5
ध्यान दें कि नाम का पता लगाने का कार्य केवल तब होता है जब पुरानी और नई दोनों फाइलें संसाधित की गई फाइलों के संग्रह में दिखाई देती हैं git diff। चल रहा है git diff -Mएक एकल (नाम बदला) फ़ाइल पर नाम बदलने रिपोर्ट नहीं करता।
लियोन

1
यह मेरे लिए काम नहीं करता है, लेकिन git log --follow -- file_after_move.txtअच्छी तरह से काम करता है। यह चाल से पहले सहित पूरे इतिहास को दर्शाता है। कोई विचार? मैं दौड़ रहा हूं git version 2.11.0.windows.1
19

1
-Cप्रतियों का पता लगाने का विकल्प उपयोगी और समान है। मैंने इसका उपयोग -Mएक ऐसे रूप को देखने के लिए किया था जहाँ मैंने एक फ़ाइल को दो में बदल दिया था (न कि मूल नाम से मेल खाते हुए)।
cp.engr

85

निट ने जो लिखा उसके अलावा , आप हमेशा उपयोग कर सकते हैं:

git diff HEAD:./oldfilename newfilename

जहां HEAD:./oldfilenameमौजूदा प्रतिबद्धता के सापेक्ष अंतिम प्रतिबद्धता (HEAD में) का पुराना अर्थ है।

यदि आपके पास नए पर्याप्त गिट नहीं हैं, तो आपको इसके बजाय उपयोग करना होगा:

git diff HEAD:path/to/oldfilename newfilename

8
इसके लिए धन्यवाद। आप सिर के बजाय एक विशिष्ट वचन भी निर्दिष्ट कर सकते हैं, अर्थातgit diff 39fa7c77e85c51d43ea0cf30d33aec8721812e9e:./oldfilename newfilename
क्रिस ब्लूम

8
यदि यह अस्पष्ट है, तो आप शाखा के नाम या किसी अन्य संदर्भ को भी निर्दिष्ट कर सकते हैं, जैसे:git diff branch:old/filen.name newfilename
jricher

पहला फॉर्म मेरे लिए काम करता है, अगर आप cdडायरेक्टरी में जाते हैं और जोड़ी --से पहले नहीं जोड़ते हैं commit:path। यहाँ वाक्यविन्यास के साथ Git बहुत अचूक प्रतीत होता है।
१dy:४dy बजे धारी २ d

1
@ डार्डी <commit-ish>:<pathname>वाक्यविन्यास एक वस्तु पहचानकर्ता है, कुछ Git-ish; --Git के बाद ही फाइलनेम की उम्मीद है।
जकूब नारबस्की

18

Git 2.9 (जून 2016) के साथ, आपको -Mअब और नहीं जोड़ना होगा। डिफ़ॉल्ट रूप से git diffउपयोग करता -Mहै।

5404c11 देखें , 9501d19 को कमिट करें , a9276a6 को कमिट करें , f07fc9e को कमिट करें , Matthieu Moy ( ) द्वारा 62df1e6 (25 Feb 2016) के लिए प्रतिबद्ध करें(द्वारा विलय Junio सी Hamano - - में प्रतिबद्ध 5d2a30d , 03 अप्रैल 2016)moy
gitster

diff: diff.renamesडिफ़ॉल्ट रूप से सक्रिय करें

नाम का पता लगाना एक बहुत ही सुविधाजनक सुविधा है, और नए उपयोगकर्ताओं को इससे लाभ पाने के लिए दस्तावेज़ में खुदाई नहीं करनी चाहिए।

नाम का पता लगाने को सक्रिय करने की संभावित आपत्तियां हैं कि यह कभी-कभी विफल हो जाता है, और यह कभी-कभी धीमा होता है। लेकिन नाम का पता लगाना पहले से ही " git status" और " git merge" जैसे कई मामलों में डिफ़ॉल्ट रूप से सक्रिय है , इसलिए सक्रिय diff.renamesरूप से स्थिति को मौलिक रूप से नहीं बदलता है। जब नाम का पता लगाना विफल हो जाता है, तो यह अब " git diff" और " git status" के बीच लगातार विफल रहता है ।

यह सेटिंग प्लंबिंग कमांड को प्रभावित नहीं करती है, इसलिए अच्छी तरह से लिखी गई स्क्रिप्ट प्रभावित नहीं होगी।

इस सुविधा के लिए नए परीक्षण यहाँ हैं


1

git diff -Mजैसा कि दूसरों ने कहा है (और जैसा @VonC ने बताया है, उसका नाम बदलना सक्रिय करता है, यह git 2.9 से डिफ़ॉल्ट रूप से सक्रिय होता है)। लेकिन अगर आपके पास एक बड़ा बदलाव है, तो सटीक नाम बदलना फिर भी बंद हो सकता है। Git निम्नलिखित की तरह एक चेतावनी प्रदर्शित करेगा, जो आप देख रहे हैं, के बीच याद करना आसान है:

warning: inexact rename detection was skipped due to too many files.
warning: you may want to set your diff.renameLimit variable to at least 450 and retry the command.

उदाहरण के लिए, उदाहरण के लिए, git द्वारा सुझाए गए कॉन्फ़िगरेशन विकल्प को सेट करें

git config diff.renamelimit 450

और अपने अलग कमांड को फिर से चलाएं।


0

जो भी कारण HEAD:./oldfilename(या निरपेक्ष पथ) मेरे लिए काम नहीं किया, लेकिन HEAD:oldfilenameकिया (धन्यवाद cmn):

git diff HEAD:oldfilename newfilename
git diff 2a80f45:oldfilename f65f3b3:newfilename

HTH


शायद आपका गिट समझने के लिए बहुत पुराना है HEAD:./oldfilename?
जैकब नार

-4

बस git diffकिसी भी तर्क के बिना, या git diff -- newfilename। git सही फ़ाइलों / सामग्रियों की तुलना करने के लिए पर्याप्त स्मार्ट है (अर्थात नाम बदलने से पहले मूल सामग्री का नाम बदलने के बाद)


2
अधिकांश मामलों में गिट बिल्कुल स्मार्ट नहीं है। बस git mvएक भी फ़ाइल आईएनजी और फिर एक और अन्यथा-समान शाखा के मंचन की स्थिति की तुलना "सब कुछ हटा दिया गया था और फिर से बनाया गया" तब तक अलग होगा जब तक कि -Mइसका उपयोग नहीं किया जाता है।
Reinderien
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.