क्या मैं अनटैक की गई फ़ाइलों में भिन्नता का उपयोग कर सकता हूं?


270

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

git diff --cached

?

जवाबों:


267

हाल के गिट संस्करणों के साथ आप git add -Nफ़ाइल (या --intent-to-add) कर सकते हैं, जो उस स्थान पर सूचकांक में एक शून्य-लंबाई बूँद जोड़ता है। अपशॉट यह है कि आपकी "अनट्रेक्टेड" फाइल अब इस शून्य-लंबाई वाली फाइल में सभी कंटेंट को जोड़ने के लिए एक संशोधन बन जाती है, और यह "git 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

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

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

(एक उपनाम स्थापित करना यहाँ आपका मित्र है)।


यह पता चला है कि Git की मेरी प्रति हाल ही में ऐड-एन के लिए पर्याप्त नहीं है, लेकिन यह मेरे सवाल का जवाब देता है।
एंड्रयू ग्रिम

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

1.6.1 में जोड़ा गया फीचर: github.com/git/git/blob/master/Documentation/RelNotes/1.6.1.txt
MarcH

1
क्या होगा यदि आपके पास बहुत सी नई फाइलें हैं, क्या उन सभी को जोड़ने और फिर अलग करने का एक आसान तरीका है?
विक

1
@Vicgit add -N .
नाथन

92

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

git diff --no-index tracked_file untracked_file

3
क्या यह काम करता है अगर आपको एक से अधिक अनट्रैक फ़ाइल मिली है जो आपने पिछले कमिटमेंट के बाद बनाई है?
एंड्रयू ग्रिम

12
हाँ, एकदम सही जवाब! मैं तो अलग रंग पर वाक्यविन्यास रंग आदि git diff --no-index untracked_file_1 untracked_file_2प्राप्त करने के लिए उपयोग कर सकते हैं git diff... सुंदर।
कॉलिन डी बेनेट

40
मुझे समझ में नहीं आता है कि आप एक असंबंधित अनट्रैक फ़ाइल के साथ ट्रैक की गई फ़ाइल की तुलना क्यों कर रहे हैं तुम सिर्फ ट्रैक न किए गए फ़ाइल के लिए diff उत्पादन प्राप्त करना चाहता था, तो आप बस का उपयोग कर सकते /dev/nullबजाय: git diff --no-index -- /dev/null <untracked_file>

4
या बस cat untracked_file_1, या शायद printf '\e[1;32m%s\e[0m\n' "$(cat untracked_file_1)"अगर आपको वास्तव में हरी आउटपुट की आवश्यकता है। :) (हालांकि अधिक गंभीर नोट पर, कृपया ध्यान दें कि कमांड प्रतिस्थापन आपकी फ़ाइल से अनुगामी नए सिरे को हटा देगा।)
वाइल्डकार्ड

8
यह स्वीकृत उत्तर होना चाहिए - इसमें गिट के सूचकांक को बदलने की आवश्यकता नहीं है; जैसा कि मूल लेखक कहते हैं, इसका नकारात्मक पक्ष है
DIMMSum

38

मेरे संवादात्मक दिन-प्रतिदिन के अंतराल के लिए (जहां मैं हर समय हेड के खिलाफ काम करने वाले पेड़ को अलग करता हूं, और चाहूंगा कि इसमें मौजूद फ़ाइलों को शामिल नहीं किया गया है) add -N/--intent-to-addअनुपयोगी है, क्योंकि यह टूट जाता है git 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 "$@"
    fi
}

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

टिप्पणियाँ:

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

4
विडंबना यह है कि मेरी git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txtworkaround मैं बड़ा Gits के लिए सुझाव दिया करता है के साथ काम git stashसंभालने उपयोग करने के लिए कोशिश कर रहा द्वारा आप पहले से ही अपने डाटाबेस, जैसे में e69de29bb मिल गया है, add -Nपहले से। तो जाहिरा तौर पर यह बिल्कुल git add -Nकिसी तरह से बराबर नहीं है : tbh मुझे यकीन नहीं है कि कैसे।
araqnid

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

1
हाँ, अभी भी ऐसा लगता है कि आपको इसे जोड़ीदार करने की आवश्यकता है ... लेकिन इसे एक में नकली कर सकते हैं lessताकि आपको qप्रत्येक फ़ाइल के लिए प्रेस न करना पड़े और ऐसा लगता है कि git diffप्रति फ़ाइल पृष्ठांकन ( -P) को हटाकर , इसे बाद में जोड़ दिया जाए। ( | less), रंग का संरक्षण ( --color=always) और इसे रंग ( less -rया less -R) के रूप में व्याख्या करना । तो कुल मिलाकर यह है:do git -P diff --color=always -- /dev/null "$i"; done | less -r
हाइपरपैलियम

यदि आप भविष्य में परेशान होना चाहते हैं, test -t 1(तो उदाहरण के लिए if [ -t 1 ]; then color_arg=--color; fiया कुछ) शेल के लिए यह जांचने का एक तरीका है कि क्या इसका आउटपुट एक टर्मिनल है, जो कि रंग निर्धारण का एक उपयोगी तरीका है। और xargsलूप से छुटकारा पाने का एक तरीका दे सकता है। आप अभी भी उस -n 1पर की आवश्यकता होगी , तो यह अभी भी समय का एक गुच्छा लॉन्च करेंगे, और अभी भी इस तरह से जोड़ीदार होने की जरूरत है, लेकिन ... यह से छुटकारा मिल जाता है , whileऔर readशायद यह बेहतर है? मैं उस पाठक को छोड़ता हूं।
lindes

28

इस बिंदु पर 100% नहीं, लेकिन अगर किसी कारण से आप अपनी फ़ाइलों को अनुक्रमणिका में जोड़ना नहीं चाहते हैं तो स्वीकृत उत्तर द्वारा सुझाया गया है, यहां एक और विकल्प है:

यदि फाइलें अनट्रैक हैं, तो जाहिर है कि पूरी फाइल अलग है, इसलिए आप उन्हें केवल कम देख सकते हैं:

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

साथ उन दोनों के बीच नेविगेट :nऔर :pअगले और पिछले के लिए ..

टिप्पणियों से अपडेट करें: यदि आपको एक पैच प्रारूप की आवश्यकता है, तो आप इसे इसके साथ जोड़ सकते हैं git diff:

git ls-files --others --exclude-standard | xargs -n 1 git --no-pager diff /dev/null | less

आप आउटपुट को फ़ाइल में पुनर्निर्देशित कर सकते हैं या इस मामले में अन्य भिन्न कमांड का उपयोग कर सकते हैं।


6
आप git diff /dev/null <untracked_tile>फ़ाइल को "सिर्फ" के बजाय पैच स्वरूप में चला सकते हैं और प्राप्त कर सकते हैं
SimSimY

2
git diff के साथ संयुक्त यह उत्तर सही समाधान है।
9

22
git add -A
git diff HEAD

पैच उत्पन्न करें यदि आवश्यक हो, और फिर:

git reset HEAD

इसमें सब कुछ जोड़कर पूर्व (पूर्व) काम को खोने की क्षमता है। विशेष रूप से मामला अगर कोई git add -pबहुत बार उपयोग करता है (जो मैं आमतौर पर सलाह देता हूं, वैसे) ... यह मूल काम करने का एक तरीका देता है, यह सिर्फ ... ध्यान दिया जाना चाहिए कि इसमें अवांछित पक्ष की क्षमता है प्रभाव।
lindes

13

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

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

इस ऐड / रिसेट जोड़ी की विशिष्टता स्टैकओवरफ्लो के शॉटगन दृष्टिकोण के लिए एक अच्छा विपरीत है। एक / 50486906/313756 ... इसके लिए धन्यवाद।
lindes

9

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

$ git diff HEAD

यदि उनका मंचन नहीं किया जाता है, तो आप केवल फ़ाइल अंतर देखेंगे।


26
HEADहै डिफ़ॉल्ट मान तो यह एक ही रूप है, git diffजो समस्या का समाधान नहीं है।
इयूलियन ओनोफ्रेई

4
यह git addप्रत्येक ट्रैक नहीं की गई फ़ाइल से आवश्यक है
SilvioQ

यदि आप इस उत्तर को शामिल करने के लिए git addइसे संपादित करते हैं तो यह सबसे सरल है यदि आपका उपयोग मामला यह जांचने के लिए है कि आपने अभी क्या जोड़ा / जोड़ना चाहते हैं
KCD

8

एक फ़ाइल के लिए:

git diff --no-index /dev/null new_file

सभी नई फ़ाइलों के लिए:

for next in $( git ls-files --others --exclude-standard ) ; do git --no-pager diff --no-index /dev/null $next; done;

उर्फ के रूप में:

alias gdnew="for next in \$( git ls-files --others --exclude-standard ) ; do git --no-pager diff --no-index /dev/null \$next; done;"

सभी संशोधित और नई फ़ाइलों के लिए एक कमांड के रूप में संयुक्त:

{ git --no-pager diff; gdnew }

2

आमतौर पर जब मैं दूरस्थ स्थान की टीमों के साथ काम करता हूं तो मेरे लिए यह महत्वपूर्ण है कि मुझे पहले से पता हो कि अन्य टीमों ने एक ही फाइल में क्या बदलाव किया है, इससे पहले कि मैं git स्टेज अनट्रैक का पालन करूं -> मंचन -> इसके लिए मैंने एक 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 को करने के लिए करें

यहाँ git द्वारा समर्थित कई difftool, मैं अच्छे GUI तुलना के लिए 'Meld Diff Viewer' कॉन्फ़िगर करता हूँ।


-9

मान लें कि आपके पास स्थानीय कमिट नहीं हैं,

git diff origin/master

8
प्रश्न git diffउस आदेश के लिए पूछता है जिसमें अनट्रैक फ़ाइलें शामिल हैं। इस आदेश में उन्हें शामिल नहीं किया गया है। इसके अलावा, स्थानीय आवागमन मौजूद है या नहीं, इसका सवाल से कोई लेना-देना नहीं है।
तून81

JFTR, I git merge --squash mybranch, और git diff masterमुझे अनटैक की गई फ़ाइलों में परिवर्तन दिखाया।
मुअम्मर

2
यह असंभव है। आप इस बात को लेकर असमंजस में हैं कि "अनट्रैक" का क्या मतलब है। अनट्रैकड का मतलब यह नहीं है कि एक फाइल को एक ब्रांच में ट्रैक किया जाता है और दूसरे को नहीं, इसका मतलब है कि यह किसी भी तरह से "गिट" में कहीं भी नहीं है। चाहे आप स्क्वैश करें या न करें इससे कोई फर्क नहीं पड़ता। git diffअनटैक की गई फ़ाइलों में अंतर नहीं दिखाता है: क्योंकि वे अनट्रैक हैं, परिभाषा के अनुसार दिखाने के लिए कभी कोई अंतर नहीं होता है। यह वैसे ही है जैसे Git काम करता है। :)
तून81
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.