'git स्टेटस' परिवर्तित फ़ाइलों को दिखाता है, लेकिन 'git diff' नहीं है


181

मैंने सभी समान प्रश्नों पर एक नज़र डाली है। हालाँकि, मैंने डबल जाँच की है और कुछ अजीब जरूर हो रहा है।

एक सर्वर पर (Solaris with Git 1.8.1) मैंने Git रिपॉजिटरी को क्लोन किया। फिर .IT फोल्डर को मेरी अन्य लाइव फ़ाइलों में कॉपी किया। यह पूरी तरह से काम करता है, मैं चला सकता हूं

git status

फिर

git diff [filename]

किसी भी फाइल की जांच करना जो अलग थी।

एक अन्य सर्वर पर (सोलिटिस विथ जीआईटी 1.7.6) मैं बिल्कुल वैसा ही कर रहा हूं

git diff [filename]

कुछ भी नहीं दिखाता है, भले ही फ़ाइल की सामग्री निश्चित रूप से अलग हो। मैंने एक नई फ़ाइल जोड़कर, उसे कमिट करने और फिर संपादन का परीक्षण भी किया है। एक ही समस्या, git statusफ़ाइल को परिवर्तित के रूप में git diffदिखाता है , लेकिन कुछ भी नहीं दिखाता है। यदि मैं बदली हुई फ़ाइल को डाउनलोड करता हूं और स्थानीय रूप से एक अंतर चलाता हूं तो मुझे अलग आउटपुट मिलता है।


9
क्या यह आपके सूचकांक में है? यदि हां, तो आप के साथ अंतर देख सकते हैं git diff --cached
jeremyharris

2
git diff --cachedबस मुझे खाली आउटपुट देता है।
ओलिवर पी।

git logकोई आउटपुट भी नहीं देता है।
ओलिवर पी

यह मानते हुए कि वास्तव में एक बग है, आपको एक न्यूनतम उदाहरण बनाने में सक्षम होना चाहिए। इसे पुन: पेश करने और नमूना साझा करने का प्रयास करें।
mheinzerling

1) फ़ाइल मोड बदल दिया गया था? के लिए देखो core.fileModeविकल्प यहाँ 2) इसके अलावा, मैं Console2 config (मैं इसे Git के तहत है) के साथ इसी तरह इस मुद्दे का सामना करना पड़ रहा है जब Console2 वास्तव में चल रहा है। हो सकता है कि किसी फ़ाइल लॉक का थोथा फ़ाइल को बदल दिया गया हो।
माडहेड

जवाबों:


81

मैंने फ़ाइल को इंडेक्स में जोड़ा :

git add file_name

और फिर भाग गया:

git diff --cached file_name

आप देख सकते हैं कि git का विवरण यहाँ भिन्न है

यदि आपको अपने git ऐड को पूर्ववत् करने की आवश्यकता है, तो कृपया यहाँ देखें: कमिट करने से पहले 'git add' को पूर्ववत् कैसे करें?


63

ऐसे कुछ कारण git statusहैं जो अंतर दिखा सकते हैं लेकिन git diffहो नहीं सकता।

  • फ़ाइल का मोड (अनुमति बिट्स) बदल गया है - उदाहरण के लिए, 777 से 700 तक।

  • लाइन फ़ीड शैली CRLF (DOS) से LF (UNIX) में बदल गई

यह पता लगाने का सबसे आसान तरीका है कि क्या हुआ है git format-patch HEAD^और यह देखने के लिए कि उत्पन्न पैच क्या कहता है।


11
यदि परिवर्तन अनुमति फ़ाइलें लागू होती हैं: git config core.filemode फ़ाइलों की अनुमति को अनदेखा करने के लिए गलत है
jruzafa

आपको यह कैसे पता चला कि लाइन फीड CRLF से LF में बदलती है, उन स्थितियों में से एक है जहां git की स्थिति में अंतर दिखाई देगा और git में अंतर नहीं होगा?
एलेक्स स्पर्लिंग

सह-कार्यकर्ता, जो विंडोज का उपयोग करते हैं, आपको लाइन अंत के बारे में सभी प्रकार की मजेदार चीजों का पता लगाने में मदद करेंगे। मुझे लगता है कि ऐसे मामले हो सकते हैं जहां "git diff" CRLF से LF में परिवर्तन दिखाता है, हालांकि - यह संभवतः आपके कॉन्फ़िगरेशन पर निर्भर करता है। मैंने कुछ समय में विंडोज के साथ काम नहीं किया है, इसलिए मुझे नहीं पता कि चूक अब क्या हैं।
cmccabe

59

मेरे लिए, यह फ़ाइल अनुमतियों के साथ कुछ करना था। मेरी परियोजना पर मैक / लिनक्स के साथ कोई व्यक्ति गैर-डिफ़ॉल्ट अनुमतियों के साथ कुछ फाइलें करना चाहता है जिसे मेरा विंडोज गिट क्लाइंट पुन: पेश करने में विफल रहा। मेरे लिए समाधान फ़ाइल अनुमतियों को अनदेखा करने के लिए बताने के लिए था:

git config core.fileMode false

अन्य जानकारी: मैं Git को फ़ाइल मोड (chmod) परिवर्तनों को अनदेखा कैसे करूँ?


इसने एक समस्या को हल किया जो मैं फाइलों के एक समूह के साथ कर रहा था, हालांकि मुझे लगता है कि इसके बजाय फ़ाइल बनाई / संशोधित समय के साथ थी।
डेरेक

इससे मेरे लिए हल हो गया। फ़ाइलकोड मान मैक / लिनक्स वॉल्यूम पर सही और विंडोज वॉल्यूम पर गलत प्रतीत होता है। मैंने मैक से विंडोज के लिए एक परियोजना को स्थानांतरित किया और इसे झूठे पर स्विच करने की आवश्यकता थी।
जिंकिनिट

1
यह भी मदद करता है अगर आप VSCode का उपयोग डॉकटर कंटेनर का उपयोग करके चला रहे हैं जो विंडोज 10. पर आपकी निर्देशिका को मापता है, तो कंटेनर के बाहर, गिट की स्थिति की जांच करके, सही ढंग से दिखाता है कि आपने कोई फाइल नहीं बदली है। लेकिन अगर आप कंटेनर के अंदर गिट स्थिति की जांच करते हैं, तो यह दिखाता है कि फाइलें बदल गई हैं। कंटेनर के अंदर उपरोक्त कमांड चलाने से मेरी समस्या ठीक हो गई।
फ्रेडरिक ओलिंगर

39

मेरे पास एक मुद्दा था जहां सैकड़ों लाइन एंडिंग को किसी कार्यक्रम द्वारा संशोधित किया गया था और git diffसभी स्रोत फ़ाइलों को बदल दिया गया था। लाइन अंत को ठीक करने के बाद, git statusअभी भी फ़ाइलों को संशोधित के रूप में सूचीबद्ध किया है।

मैं सभी फ़ाइलों को अनुक्रमणिका में जोड़कर और फिर अनुक्रमणिका को रीसेट करके इस समस्या को ठीक करने में सक्षम था।

git add -A
git reset

core.filemode असत्य पर सेट किया गया था।


धन्यवाद! एक जादू की तरह काम किया!
Starwave

1
मैंने साथ हल किया git add --renormalize ., मेरा जवाब नीचे देखें।
स्टेफानो एम

17

मुझे संदेह है कि आपके Git इंस्टॉलेशन या आपके रिपॉजिटरी में कुछ गड़बड़ है।

चलाने की कोशिश करें:

GIT_TRACE=2 git <command>

देखें कि आपको कुछ उपयोगी मिलता है या नहीं। यदि वह मदद नहीं करता है, तो केवल स्ट्रेस का उपयोग करें और देखें कि क्या गलत हो रहा है:

strace git <command>

6
@towi: चूँकि यह आपके लिए एक इनाम के लायक था, मुझे यह देखने में दिलचस्पी होगी कि आपने अपनी समान विफलताओं के कारण के बारे में क्या सीखा है।
सीएफ

5
मेरे मामले में, मैंने -Fध्वज को LESSenv वेरिएबल में जोड़ा, जो कि बाहर निकलने के लिए कम बताता है अगर दिखाने के लिए जानकारी से भरी एक से कम स्क्रीन हो। चूंकि गिट एक पेजर के रूप में कम उपयोग करता है, और मेरे पास एक छोटा सा अंतर था, कुछ भी नहीं दिखाया जा रहा था। या तो मैं जोड़ने के लिए किया था -Xकरने के लिए LESSकम से बाहर निकलता है के बाद भी env जो स्क्रीन पर सामग्री से पता चलता है या सिर्फ हटाने -FGIT_TRACEयह दिखाया lessगया कि निष्पादित किया जा रहा है जिसने मुझे याद दिलाया कि मैंने LESSहाल ही में चर को बदल दिया है । @ Rwwxok के उत्तर में समान कारण, लेकिन इस पर टिप्पणी करना चाहता था कि कैसे GIT_TRACEमदद की।
रघु डोड्डा

यह उत्तर मुझे "पेजर" का संकेत प्रदान करता है और मुझे सेटिंग के समाधान की ओर ले जाता core.pagerहै .gitconfig, जो मेरे लिए पूरी तरह से काम करता है।
यतु

10

मुझे एक समान समस्या थी: git diffमतभेद दिखाएगा, लेकिन git diff <filename>नहीं। यह पता चला कि मैं LESSसहित एक स्ट्रिंग पर सेट -F( --quit-if-one-screen)। उस झंडे को हटाने से समस्या हल हो गई।


1
हटाने के बजाय -F, जोड़ने से -Xभी काम चल सकता है, इसी तरह के मामले के लिए नीचे मेरा जवाब देखें।
avivr

इसके लिए शुक्रिया! मुझे पागल कर रहा था।
हैकल

9

जैसा कि पहले से ही एक पिछले उत्तर में उल्लेख किया गया है , यह स्थिति लाइन-एंडिंग समस्याओं (सीआर / एलएफ बनाम एलएफ) के कारण उत्पन्न हो सकती है। मैंने इस कमांड के साथ इस समस्या को (Git संस्करण 2.22.0 के तहत) हल किया:

git add --renormalize .

मैनुअल के अनुसार:

       --renormalize
           Apply the "clean" process freshly to all tracked files to
           forcibly add them again to the index. This is useful after
           changing core.autocrlf configuration or the text attribute in
           order to correct files added with wrong CRLF/LF line endings.
           This option implies -u.

यह नया सबसे अच्छा जवाब है।
PHPst

5

संक्षिप्त जवाब

दौड़ना git addकभी-कभी मदद करता है।

उदाहरण

जीआईटी स्थिति बदल गई फ़ाइलों को दिखा रही है और जीआईटी अंतर कुछ भी नहीं दिखा रहा है ...

> git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   package.json

no changes added to commit (use "git add" and/or "git commit -a")
> git diff
> 

... रनिंग गिट जोड़ विसंगति को हल करता है।

> git add
> git status
On branch master
nothing to commit, working directory clean
> 

2
यह मुझे 'बीमारी का इलाज' करने के बजाय 'लक्षणों से लड़ने' की तरह लगता है ...;)
ईंजोनोह

@ejjohn आपको क्या लगता है इस मामले में बीमारी क्या है?
शॉन लुटिन

1
बीमारी कई चीजें हो सकती है। जैसा कि दूसरों ने उल्लेख किया है, यह एक अनुमति समस्या या लाइन अंत के साथ कुछ हो सकता है। यह पहले से ही परिवर्तन का मंचन किया जा सकता है। हालाँकि, यह अंतिम संभावना आपके उदाहरण के अनुरूप नहीं है। फिर भी, आपके समाधान से आपको कारण (बीमारी) का पता नहीं चलेगा, आप बस समस्या को खत्म कर देंगे (एक प्रतीत होता है दोषपूर्ण खाली अंतर (लक्षण))। स्पष्ट होना: मैं यह नहीं कह रहा कि यह एक बुरा समाधान है। यह किसी की मदद कर सकता है, यदि वह / वह सिर्फ समस्या को गायब करना चाहता है। ... उम्मीद है कि मैंने अपनी बीमारी-रूपक पर कुछ प्रकाश डाला है। :)
ईंजोन

@ejjohn यह ज्यादातर समय लाइन एंडिंग लगता है। ऐसा लगता है statusऔर diffउन लोगों को संभालने के अलग तरीके हैं।
शॉन लुटिन

5

मैं इस समस्या में भाग गया। मेरे मामले के समान था मुद्दा rcwxok द्वारा पोस्ट की गईLESS

मेरे मामले में, मैंने PAGERपर्यावरण चर को निर्धारित किया है PAGER='less -RSF'

हालांकि, पिछले उत्तरों के विपरीत, मैं -Fविकल्प को हटाना नहीं चाहता था , क्योंकि मैंने स्पष्ट रूप से इसे वहां दिखाने से रोकने की उम्मीद की थी, lessअगर यह एक स्क्रीनफुल से कम है।

बजाय हटाने की, वांछित परिणाम प्राप्त करने के लिए -F, मैं जोड़ा -X: PAGER='less -RSFX'। इस git diffमुद्दे को दोनों ने हल किया और इसके अलावा यह कम भिन्नता को दिखाने से रोकता है less


पूंजीकरण अजीब लगता है। क्या आपको "LESS -RSFX" के बजाय "कम -RSFX" से मतलब है? क्या विकल्प सही मामला है?
स्टैकज़ोफ़ज़टफ

1
हां, धन्यवाद, यह एक गलती थी। यकीन नहीं हुआ कि यह कैसे हुआ। अब तय हो गया।
avivr

3

मैं सिर्फ इसी तरह के मुद्दे पर चला हूं। git diff fileकुछ नहीं दिखाया क्योंकि मैंने अपरकेस में इसके नाम के कुछ हिस्से के साथ Git इंडेक्स में फ़ाइल जोड़ी थी GeoJSONContainer.js:।

बाद में, मैंने इसका नाम GeoJsonContainer.jsबदल दिया और परिवर्तनों को ट्रैक करना बंद कर दिया। git diff GeoJsonContainer.jsकुछ भी नहीं दिखा रहा था। मुझे इंडेक्स से फाइल को फोर्स फ्लैग के साथ हटाना था, और फाइल को फिर से जोड़ना था:

git rm -f GeoJSONContainer.js
git add GeoJSONContainer.js

2

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

आपके उपयोग के मामले में मेरी धारणा:

आपके पास एक मौजूदा निर्देशिका है जिसमें फ़ाइलें और निर्देशिकाएं हैं और अब इसे एक Git रिपॉजिटरी में बदलना चाहते हैं जो आपके वर्तमान निर्देशिका में कोई डेटा बदले बिना किसी अन्य स्थान से क्लोन किया गया है ।

वास्तव में दो तरीके हैं।

क्लोन रेपो - mv .git- git रिसेट --हार्ड

यह विधि आपके द्वारा की गई - मौजूदा रिपॉजिटरी को एक खाली निर्देशिका में क्लोन करने के लिए है, फिर .gitनिर्देशिका को गंतव्य निर्देशिका में स्थानांतरित करें । समस्याओं के बिना काम करने के लिए, इसे आम तौर पर आपको चलाने की आवश्यकता होती है

git reset --hard

हालाँकि, यह आपकी वर्तमान निर्देशिका में फ़ाइलों की स्थिति को बदल देगा। आप अपनी निर्देशिका की पूर्ण प्रतिलिपि / rsync पर यह कोशिश कर सकते हैं और अध्ययन कर सकते हैं कि क्या परिवर्तन होता है। कम से कम बाद में आपको git logऔर के बीच की विसंगतियों को नहीं देखना चाहिए status

Init new repository - उत्पत्ति की ओर इशारा करता है

दूसरा कम परेशान है: cdअपने गंतव्य में, और एक नया भंडार शुरू करें

git init

फिर आप उस नए भंडार को बताते हैं, कि उसका पूर्वज कहीं और है:

git remote add origin original_git_repo_path

फिर सुरक्षित रूप से

git fetch origin master

अपनी स्थानीय फ़ाइलों को बदले बिना डेटा पर कॉपी करने के लिए। अब सब कुछ ठीक होना चाहिए।

मैं हमेशा कम त्रुटि वाले होने के लिए दूसरा तरीका सुझाता हूं।


आपको लगता है कि यह एक त्रुटि है । ठीक है, हो सकता है। मुझे अभी भी लगा कि मेरे पास उचित समझ की कमी है, क्योंकि मैं लिनस के रूप में स्मार्ट नहीं हूं ;-)
टावी

@towi: नहीं, मैं यह नहीं कह रहा हूं कि यह एक त्रुटि है, और न ही मैं इसके विपरीत को लागू कर रहा हूं। मैं गिट इंटर्न से परिचित नहीं हूं। लेकिन अंगूठे के एक सामान्य नियम के रूप में, .gitअन्य कार्य क्षेत्रों में फ़ोल्डर्स के चारों ओर घूमने से , हम संभावित रूप से गिट की धारणाओं का उल्लंघन कर रहे हैं। यदि यह अनिश्चित व्यवहार के कारण होता है तो हम गिट को दोष नहीं दे सकते हैं, हमें खुद को दोष के साथ खेलने के लिए दोष देना होगा। गिट प्रदान करता है, जैसे कि ठीक करने के लिए साधन reset --hard। यह सिर्फ इतना है कि हम क्या चाहते हैं। यही कारण है कि जिस init/remote addतरह से सिफारिश की जाती है, और सब ठीक है।
cfi

@towi और ओलिवर पी: जबकि मैं समझता हूं कि आप चाहेंगे कि आपका विशेष त्रुटि का मामला हल हो, कभी-कभी यह केवल सामान्य सिफारिशों के साथ जाने की सलाह दी जाती है - खासकर यदि वे आपके उपयोग के मामले को पूरी तरह से फिट करते हैं। डेटा हानि भी नहीं है। और remote addचीजों को करने का तरीका अभी भी एक गड़बड़ स्थिति पर लागू किया जा सकता है जैसे कि ओलिवर पी द्वारा वर्णित एक है
सीएफआई

1
एक टिप्पणी के बिना एक downvote इस उत्तर को बेहतर बनाने में मदद नहीं करता है, और न ही साइट एक पूरे के रूप में। जो कोई भी डाउनवोट करता है, कृपया एक टिप्पणी छोड़ दें ताकि समस्या हल हो सके।
cfi

1

मैं फिर से इस समस्या पर ठोकर खाई। लेकिन इस बार यह एक अलग कारण से हुआ। मैंने पिछले संस्करणों को अधिलेखित करने के लिए रेपो में फ़ाइलों की प्रतिलिपि बनाई थी। अब मैं देख सकता हूँ कि फाइलें संशोधित हुई हैं, लेकिन diff में अंतर नहीं है।

उदाहरण के लिए, मेरे पास एक mainpage.xaml फ़ाइल है। फ़ाइल एक्सप्लोरर में मैंने अपने वर्तमान रेपो में एक नया मुख्यपृष्ठ। Xaml फ़ाइल चिपकाया है। मैंने दूसरी मशीन पर काम किया और बस यहाँ फाइल को चिपकाया।
git संशोधित दिखाता है

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

git diff कुछ नहीं दिखाता है

आप देख सकते हैं कि जब मैं फ़ाइल पर अलग-अलग चलता हूं तो यह कुछ भी नहीं दिखाता है, बस प्रॉम्प्ट देता है।


1

मुझे निम्न तरीके से वर्णित एक ही समस्या थी: यदि मैंने टाइप किया

$ git diff

Git बस बिना किसी त्रुटि के प्रॉम्प्ट पर लौट आया।

अगर मैंने टाइप किया

$ git diff <filename>

Git बस बिना किसी त्रुटि के प्रॉम्प्ट पर लौट आया।

अंत में, चारों ओर पढ़कर मैंने देखा कि git diffवास्तव mingw64\bin\diff.exeमें काम करने के लिए कॉल करता है।

यहाँ सौदा है। मैं विंडोज चला रहा हूं और एक और बैश यूटिलिटी लगाई है और इसने मेरा रास्ता बदल दिया है इसलिए यह मेरे mingw64 \ bin डायरेक्टरी की ओर इशारा नहीं करता है ।

इसलिए यदि आप टाइप करते हैं:

git diff

और यह सिर्फ उस प्रॉम्प्ट पर लौटता है जिसमें आपको यह समस्या हो सकती है।

आपके द्वारा चलाया गया वास्तविक diff.exe gitआपके mingw64 \ bin डायरेक्टरी में स्थित है

अंत में, इसे ठीक करने के लिए, मैंने वास्तव में अपनी mingw64\binनिर्देशिका को उस स्थान पर कॉपी कर लिया, जिसे Git में ढूंढ रहा था। मैंने इसे आज़माया और यह अभी भी काम नहीं किया।

फिर, मैंने अपनी गिट बैश विंडो को बंद कर दिया और इसे फिर से खोला मेरी उसी रिपॉजिटरी में गया जो विफल हो रही थी और अब यह काम करती है।

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