2009-05-13 12 views
178

क्या इसके diff आउटपुट में अनचाहे फ़ाइलों को शामिल करने के लिए गिट diff से पूछना संभव है? या मेरे द्वारा बनाई गई नई फाइलों को जोड़ने औरक्या मैं अनचाहे फ़ाइलों पर गिट डिफ का उपयोग कर सकता हूं?

git diff --cached 

का उपयोग करने के लिए मेरी सबसे अच्छी शर्त है?

उत्तर

179
हाल Git संस्करण आप फ़ाइल (या --intent-to-add) है, जो उस स्थान पर सूचकांक करने के लिए एक शून्य लंबाई ब्लॉब कहते हैं git add -N कर सकते हैं

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

git diff 

echo "this is a new file" > new.txt 
git diff 

git add -N new.txt 
git diff 
diff --git a/new.txt b/new.txt 
index e69de29..3b2aed8 100644 
--- a/new.txt 
+++ b/new.txt 
@@ -0,0 +1 @@ 
+this is a new file 

दुख की बात है, के रूप में बताया है, इसलिए जब आप एक --intent-to-add फ़ाइल इस तरह लंबित नहीं git stash कर सकते हैं। यद्यपि यदि आपको छेड़छाड़ की आवश्यकता है, तो आप केवल नई फाइलें जोड़ते हैं और फिर उन्हें छीन लेते हैं।

git update-index --add --cacheinfo \ 
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt 

(एक उपनाम सेट अपने दोस्त यहाँ है): या आप अनुकरण तरीके का उपयोग कर सकते हैं।

+0

यह पता चला है कि गिट की मेरी प्रति हाल ही में ऐड-एन रखने के लिए पर्याप्त नहीं है, लेकिन यह मेरे प्रश्न का उत्तर देती है। –

+1

आप का अनुकरण कर सकते हैं के साथ "Git अद्यतन सूचकांक 100,644 --add --cacheinfo e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 नया" Git एन new.txt जोड़ें "।txt " (मैंने इसे गलत उत्तर पर कैसे रखा?) – araqnid

+20

हेड-अप के रूप में, 'गिट एड-एन' ब्रेक' गिट स्टैश '। http://bit.ly/hLDfHq –

63

मेरा मानना ​​है कि आप दोनों फ़ाइलों के लिए पथ की आपूर्ति करके अपनी अनुक्रमणिका और अनचाहे फ़ाइलों में फ़ाइलों के खिलाफ भिन्न हो सकते हैं।

git diff --no-index tracked_file untracked_file 
+2

कि काम आपको लगता है कि आप के बाद से पिछले प्रतिबद्ध बना लिया है एक से अधिक ट्रैक न किए गए फ़ाइल मिल गया है, तो करता है? –

+8

हाँ, सही जवाब! मैं तो Git diff --no-सूचकांक untracked_file_1 untracked_file_2' उपयोग कर सकते हैं '' डिफ पर प्राप्त करने के लिए Git diff' वाक्य रचना रंग आदि ... सुंदर। –

+25

मुझे समझ नहीं नहीं तुम क्यों *** साथ एक असंबंधित ट्रैक न किए गए फ़ाइल एक ट्रैक किए गए फ़ाइल तुलना कर रहे हैं। *** तुम सिर्फ ट्रैक न किए गए फ़ाइल के लिए diff उत्पादन प्राप्त करना चाहता था, तो आप बस का उपयोग कर सकते [ '/ dev/null' ] (https://en.wikipedia.org/wiki/Null_device) इसके बजाए: 'git diff --no-index -/dev/null '। –

26

के लिए मेरी इंटरैक्टिव दिन के लिए दिन के gitting (जहां मैं हर समय प्रमुख के खिलाफ काम कर रहे पेड़ diff, और ट्रैक न किए गए फ़ाइलों के लिए diff में शामिल करना चाहते हैं), add -N/--intent-to-add व्यर्थ है, क्योंकि यह breaksgit stash

तो यहां मेरा git diff प्रतिस्थापन है। यह एक विशेष रूप से स्वच्छ समाधान नहीं है, लेकिन जब से मैं वास्तव में केवल यह सहभागी उपयोग करते हैं, मैं एक हैक के साथ ठीक कर रहा हूँ:

d() { 
    if test "$#" = 0; then 
     (
      git diff --color 
      git ls-files --others --exclude-standard | 
       while read -r i; do git diff --color -- /dev/null "$i"; done 
     ) | `git config --get core.pager` 
    else 
     git diff "[email protected]" 
    fi 
} 

टंकण सिर्फ d (diff में ट्रैक न किए गए फ़ाइलों को शामिल करेगा जो है मैं क्या में के बारे में परवाह मेरी वर्कफ़्लो), और d args... नियमित git diff की तरह व्यवहार करेंगे।

नोट्स:

  • हम इस तथ्य है कि यहाँ git diff वास्तव में सिर्फ व्यक्तिगत डिफ concatenated है, इसलिए यह एक "वास्तविक diff" से d उत्पादन बताने के लिए संभव नहीं है का उपयोग कर रहे - तथ्य यह है कि के अलावा सभी अनचाहे फ़ाइलों को आखिरी क्रमबद्ध किया जाता है।
  • इस फ़ंक्शन के साथ एकमात्र समस्या यह है कि आउटपुट रंगीन होने पर भी रंगीन होता है; लेकिन इसके लिए तर्क जोड़ने के लिए मुझे परेशान नहीं किया जा सकता है।
  • मुझे git diff के लिए एक स्लिम तर्क सूची को जोड़कर अनचाहे फ़ाइलों को शामिल करने का कोई तरीका नहीं मिला। अगर कोई यह बताता है कि यह कैसे करें, या यदि भविष्य में किसी बिंदु पर git में कोई सुविधा जोड़ा जा सकता है, तो कृपया यहां एक नोट छोड़ दें!बात करने के लिए,
+3

विडंबना यह है कि, मेरा 'गिट अपडेट-इंडेक्स - मैड - कैशिनोफो 100644 ई 6 डी 2 9 2 बीबी 2 डी 1 डी 6434582929775ad8c2e48c5391 पुराना गिट्स के लिए सुझाए गए नए.txt' वर्कअराउंड * * गिट स्टैश के साथ काम करता है, मानते हुए कि आपको पहले से ही e69de29bb मिल गया है डीबी, उदाहरण के लिए पहले 'एड-एन' का उपयोग करने की कोशिश कर रहा है। तो स्पष्ट ly यह किसी भी तरह से 'git add -N' के बराबर नहीं है: tbh मुझे यकीन नहीं है कि कैसे। – araqnid

+0

आप रास्ते में अपने 'test' कमांड के साथ संख्यात्मक समानता जांच के बजाय स्ट्रिंग तुलना कर रहे हैं। किसी भी चीज़ को प्रभावित नहीं करना चाहिए, लेकिन 'परीक्षण "$ #" -eq 0' अधिक सटीक रूप से इरादा है। – Wildcard

-1

मान लिया जाये कि आप स्थानीय प्रतिबद्ध नहीं है

git diff origin/master 
+4

प्रश्न 'गिट diff' कमांड के लिए पूछता है जिसमें अनचाहे फ़ाइलें शामिल हैं। इस आदेश में उन्हें शामिल नहीं किया गया है। साथ ही, स्थानीय काम मौजूद है या नहीं, इस सवाल के साथ बिल्कुल कुछ नहीं है। – toon81

+0

जेएफटीआर, मैं 'गिट विलय - स्क्वैश माइब्रैंच ', और' गिट डिफ मास्टर 'ने मुझे अनचाहे फ़ाइलों में बदलाव दिखाए। – muammar

+1

यह असंभव है। आप "अनचाहे" साधनों के बारे में उलझन में प्रतीत होते हैं। अनचाहे का मतलब यह नहीं है कि एक शाखा में एक फाइल को ट्रैक किया जाता है और दूसरा नहीं, इसका मतलब है कि यह किसी भी तरह से कहीं भी "गिट में" नहीं है। चाहे आप स्क्वैश करें या कोई फर्क नहीं पड़ता है। 'गिट diff' अनचाहे फ़ाइलों में मतभेद नहीं दिखाता है: क्योंकि वे अनचाहे हैं, परिभाषा के अनुसार, दिखाने के लिए कभी भी कोई अंतर नहीं होता है। यह गिट काम करता है। :) – toon81

11

नहीं 100% है, लेकिन बाद से वहाँ कोई वास्तव में संतोषजनक जवाब है, यहाँ अभी तक उस तरह का एक और एक है,) फ़ाइलें हैं ट्रैक न किए गए, स्पष्ट रूप से अंतर पूरी फ़ाइल है, तो आप सिर्फ कम के साथ देख सकते हैं: के साथ उन दोनों के बीच

less $(git ls-files --others --exclude-standard) 

नेविगेट: n और: अगले और पिछले के लिए पी ..

+0

आप 'git diff/dev/null ' भी चला सकते हैं और पैच प्रारूप में पैच को "बस" फ़ाइल के बजाय प्राप्त कर सकते हैं – SimSimY

15

इस आदेश के साथ चरणबद्ध और गैर-चरणबद्ध होने पर कार्य बदलता है। नई फाइलें काम करते समय काम करती हैं:

$ git diff HEAD 

यदि वे चरणबद्ध नहीं हैं, तो आप केवल फ़ाइल अंतर देखेंगे।

+3

'HEAD' [डिफ़ॉल्ट मान] है (https: // git-scm .com/docs/git-diff # git-diff-emgitdiffem - विकल्प - cachedltcommitgt - ltpathgt82308203), इसलिए यह 'git diff' जैसा ही है जो समस्या को हल नहीं करता है। –

2
इस

मेरे लिए काम करता है:

git add my_file.txt 
git diff --cached my_file.txt 
git reset my_file.txt 

अंतिम चरण वैकल्पिक है, यह पहले वाली स्थिति में फ़ाइल (ट्रैक न किए गए)

उपयोगी यदि आप एक पैच भी पैदा कर रहे छोड़ देंगे:

git diff --cached my_file.txt > my_file-patch.patch 
+0

प्रश्न कहता है: "गिट करने के लिए मेरी सबसे अच्छी शर्त मैंने बनाई गई नई फाइलें और मौजूदा फाइलों को संपादित किया है, और 'गिट diff --cached'' का उपयोग करें? तो आप मूल रूप से सवाल नहीं पढ़ा? उपयोगी सुधार 'गिट ऐड-ए' होगा; गिट diff - cached; गिट रीसेट '। – catpnosis

+0

क्या आपको वास्तव में उस अशिष्ट @catpnosis होने की आवश्यकता है? क्या आपको लगता है कि मैंने संदेश पढ़ने के बिना किसी की मदद करने की कोशिश करने में कुछ समय व्यतीत किया होगा ?? –

+0

Pls, व्यक्तिगत रूप से मत लें। – catpnosis

0

आमतौर पर जब मैं दूरस्थ स्थान टीमों के साथ काम यह मेरे लिए महत्वपूर्ण मैं पहले से जानकारी है कि क्या परिवर्तन एक ही फाइल में अन्य टीमों द्वारा किया जाता है, इससे पहले कि मैं पालन Git untrack चरण -> मंचन -> कॉम उस के लिए एमआईटी मैं एक bash स्क्रिप्ट जो मेरी मदद कर दूरस्थ टीम के साथ अनावश्यक संकल्प मर्ज संघर्ष से बचने के लिए या नए स्थानीय शाखा बनाने के लिए और तुलना और मुख्य शाखा

#set -x 
branchname=`git branch | grep -F '*' | awk '{print $2}'` 
echo $branchname 
git fetch origin ${branchname} 
for file in `git status | grep "modified" | awk "{print $2}" ` 
do 
echo "PLEASE CHECK OUT GIT DIFF FOR "$file 
git difftool FETCH_HEAD $file ; 
done 
ऊपर स्क्रिप्ट में

मैं लाने दूरदराज के मुख्य शाखा पर विलय (नहीं लिखा था आवश्यक अपने गुरु शाखा) उन्हें FETCH_HEAD को सिर्फ अपने संशोधित फ़ाइल की एक सूची बनाने के लिए और difftool

यहाँ कई difftool Git द्वारा समर्थित है, मैं कॉन्फ़िगर 'मिलकर एक हो जाना Diff व्यूअर' अच्छा जीयूआई तुलना के लिए git करने के लिए संशोधित फ़ाइलों की तुलना करें।

संबंधित मुद्दे