git का नाम बदला गया फ़ाइल है


105

मेरे पास एक फाइल है a.txt

cat a.txt
> hello

की सामग्री a.txt"हैलो" है।

मैं एक कमिट करता हूं।

git add a.txt
git commit -m "first commit"

मैं फिर a.txtएक testचक्कर में चला गया।

mkdir test
mv a.txt test

मैं तब अपना दूसरा कमिटमेंट करता हूं।

git add -A
git commit -m "second commit"

अंत में, मैं a.txtइसके बजाय "अलविदा" कहने के लिए संपादित करता हूं।

cat a.txt
> goodbye

मैं अपना आखिरी कमिटमेंट करता हूं।

git add a.txt
git commit -m "final commit"

अब यहाँ मेरा सवाल है:

मैं a.txtअपनी पिछली प्रतिबद्धताओं और मेरी पहली प्रतिबद्धताओं के बीच अंतर कैसे कर सकता हूं ?

मैंने कोशिश की है: git diff HEAD^^..HEAD -M a.txtलेकिन वह काम नहीं किया। git log --follow a.txtठीक से नाम का पता लगाता है, लेकिन मैं इसके लिए एक समकक्ष नहीं मिल सकता है git diff। वहाँ एक है?


मुझे लगता है कि अगर आप 'git mv a.txt टेस्ट' करते हैं तो यह वही होगा? IE आपने इसे उपनिर्देशिका में स्थानांतरित करने के बजाय केवल फ़ाइल का नाम बदला।
मैक्स वाटरमैन

जवाबों:


107

के बीच का अंतर HEAD^^और मुद्दा यह HEADहै कि आपके पास a.txtदोनों कमिट्स में एक है, इसलिए केवल उन दो कॉमिट्स पर विचार करना (जो कि क्या फर्क पड़ता है), कोई नाम नहीं है, एक कॉपी और एक बदलाव है।

प्रतियों का पता लगाने के लिए, आप उपयोग कर सकते हैं -C:

git diff -C HEAD^^ HEAD

परिणाम:

index ce01362..dd7e1c6 100644
--- a/a.txt
+++ b/a.txt
@@ -1 +1 @@
-hello
+goodbye
diff --git a/a.txt b/test/a.txt
similarity index 100%
copy from a.txt
copy to test/a.txt

संयोग से, यदि आप अपने अंतर को सिर्फ एक पथ तक सीमित रखते हैं (जैसा कि आप करते हैं तो git diff HEAD^^ HEAD a.txtआप कभी भी नाम या प्रतियों को देखने के लिए नहीं जा रहे हैं क्योंकि आपने एक पथ से अलग सभी चीज़ों को छोड़ दिया है और नाम या प्रतियां - परिभाषा के अनुसार - दो को शामिल करते हैं पथ।


2
कहते हैं कि कमिट में कई फ़ाइल परिवर्तन होते हैं। मैं इसे एकल फ़ाइल के एक हिस्से तक कैसे सीमित करूंगा?
केन हिराकवा

3
@KenHirakawa का उपयोग करें -- <old-path> <new-path>... मेरा उत्तर देखें।
नोलन एमी

मेरे मामले में, मैं एक कमिट का विवरण दिखाना चाहता था जहाँ फ़ाइल का नाम बदला गया था, लेकिन यह मुझे दिखा रहा था कि एक फ़ाइल हटा दी गई थी और एक फ़ाइल जोड़ दी गई थी ... मैं भागा git show -C [commit]और उसने फ़ाइल का नाम बदला और मुझे दिखाया फ़ाइलों के बीच अंतर करें। उत्तम।
जेसन

83

किसी विशिष्ट फ़ाइल का नाम बदलने के लिए, उपयोग -M -- <old-path> <new-path>( -Cभी काम करता है)।

तो अगर आप दोनों का नाम बदला और आखिरी में एक फ़ाइल परिवर्तित करने के लिए, आप के साथ परिवर्तन देख सकते हैं:

git diff HEAD^ HEAD -M -- a.txt test/a.txt

यह उत्पादन करता है:

diff --git a/a.txt b/test/a.txt
similarity index 55%
rename from a.txt
rename to test/a.txt
index 3f855b5..949dd15 100644
--- a/a.txt
+++ b/test/a.txt
@@ -1,3 +1,3 @@
 // a.txt

-hello
+goodbye

( // a.txtलाइनों का नाम बदलने में मदद करने के लिए जोड़ा गया)


यदि जीआईटी नाम का पता नहीं लगा रहा है, तो आप -M[=n]1% के साथ एक कम समानता सीमा बता सकते हैं :

git diff HEAD^ HEAD -M01 -- a.txt test/a.txt

Git से अलग डॉक्स :

-एम [<n>]

नाम का पता लगाएं। यदि nनिर्दिष्ट किया गया है, तो यह समानता सूचकांक (फ़ाइल के आकार की तुलना में अतिरिक्त / विलोपन की राशि) पर एक सीमा है। उदाहरण के लिए, -M90%इसका मतलब यह है कि गिट को हटाने / जोड़े को पुनर्नामित करने पर विचार करना चाहिए , यदि फ़ाइल का 90% से अधिक हिस्सा नहीं बदला है। एक %संकेत के बिना , संख्या को अंश के रूप में पढ़ा जाना है, इसके पहले दशमलव बिंदु के साथ। Ie, -M50.5 हो जाता है, और इस प्रकार के रूप में ही है -M50%। इसी तरह, -M05जैसा है वैसा ही है -M5%। सटीक नाम का पता लगाने को सीमित करने के लिए, का उपयोग करें -M100%। डिफ़ॉल्ट समानता सूचकांक 50% है।


... बेशक, यह भी काम करता है जब मूल उदाहरण के रूप में परिवर्तन और नाम अलग-अलग तरीके से होते हैं:git diff HEAD^^ HEAD -M -- a.txt test/a.txt
नोलन एमी

1
केवल जब फ़ाइलों की सामग्री एक समानता सूचकांक के साथ आने के लिए पर्याप्त अंतर के करीब हैं। दोनों विकल्पों (-M और -C) का उपयोग / a / dev / null से a / dev / null के फ़ाइल में दिए गए / / null के अंतर को दिखा रहा है जिसे बदल दिया गया था और पूरी तरह से बदल गया है (इंडेंट वार सहित), इसे अनदेखा करने पर भी इसे पकड़ नहीं पाता है खाली स्थान के।
डेविड जीज

37

आप भी कर सकते हैं:

git diff rev1:file1 rev2:file2

जो, आपके उदाहरण के लिए, होगा

git diff HEAD^^:./a.txt HEAD:./test/a.txt

स्पष्ट पर ध्यान दें ./- यह प्रारूप अन्यथा रेपो की जड़ के सापेक्ष पथ को मानता है। (यदि आप रेपो की जड़ में हैं, तो आप निश्चित रूप से इसे छोड़ सकते हैं।)

यह नाम का पता लगाने पर बिल्कुल भी निर्भर नहीं करता है, क्योंकि उपयोगकर्ता स्पष्ट रूप से बता रहा है कि तुलना क्या है। (इसलिए, यह कुछ अन्य परिस्थितियों में भी काम में आता है, जैसे कि git-svac पर्यावरण में विभिन्न svn शाखाओं के बीच फाइलों की तुलना करना।)


1
ऊह, यह अच्छा है!
नोलन एमी

मर्ज के माध्यम से लाए गए अतिरिक्त फ़ाइल परिवर्तनों के साथ नाम बदलने के लिए यह एकमात्र उत्तर है जो मेरे लिए काम करता है। धन्यवाद!
लेन रेटिग

1

यदि आपका नाम बदलकर किया गया है, लेकिन अभी तक प्रतिबद्ध नहीं हैं, तो आप उपयोग कर सकते हैं:

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