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


100

अगर मैं दौड़ता हूं git stash -u, तो मैं अनट्रैक की गई फाइलों को स्टैश कर सकता हूं। हालाँकि, कहा गया है कि बिना पढ़ी हुई फाइलें बिल्कुल नहीं दिखती हैं git stash show stash@{0}। क्या कोई तरीका है बिना स्टैक्ड फाइल किए बिना स्टैक्ड फाइल दिखाने का?

जवाबों:


121

स्टैक्ड कमिट के तीसरे माता-पिता में अनट्रैक की गई फ़ाइलें संग्रहीत हैं। (यह वास्तव में प्रलेखित नहीं है, लेकिन इस बात से बहुत स्पष्ट है , जो -u सुविधा, 787513 ... , और जिस तरह से वाक्यांशों के लिए बाकी दस्तावेज़ीकरण की git-stashशुरुआत की गई है ... या बस करके git log --graph stash@{0})

आप स्टाॅश के "अनट्रैक" भाग को देख सकते हैं:

git show stash@{0}^3

या, केवल "अनट्रेक्टेड" ट्री ही, इसके द्वारा:

git show stash@{0}^3:

या, ट्री में एक विशेष "अनट्रैक" फ़ाइल के माध्यम से:

git show stash@{0}^3:<path/to/file>

दुर्भाग्यवश, सभी मंचित + अस्थिर + अनियंत्रित बनाम "वर्तमान" स्थिति के बीच के अंतर का सारांश प्राप्त करने का कोई अच्छा तरीका नहीं है। अर्थात: git show stash@{0}अनट्रैक की गई फ़ाइलों को शामिल करने के लिए नहीं बनाया जा सकता। इसका कारण यह है कि स्टैश की ट्री ऑब्जेक्ट खुद को प्रतिबद्ध करती है, जिसे संदर्भित किया जाता है stash@{0}:, तीसरे, "अस्थिर" माता-पिता से कोई भी बदलाव शामिल नहीं है।

यह उस तरह से होता है जिस तरह से स्टैम्स को फिर से लागू किया जाता है: ट्रैक की गई फ़ाइलों को पैच के रूप में आसानी से लागू किया जा सकता है, जबकि अनट्रैक की गई फ़ाइलों को केवल "संपूर्ण फ़ाइलों" के रूप में, सिद्धांत रूप में लागू किया जा सकता है।


तो स्टैस कमिट के माता-पिता हैं (1. कमिट स्टैश 2 के खिलाफ बनाया गया है। इंडेक्स 3. अनट्रैकड वर्किंग कॉपी), और स्टैस कमिट में ही ट्रैक की गई वर्किंग कॉपी होती है? git stash showकार्य की प्रतिलिपि और # 1 के बीच अंतर दिखाने के लिए प्रकट होता है (git-stash.sh से प्रासंगिक कोड: git diff ${FLAGS:---stat} $b_commit $w_commitजिसमें $ b_commit # 1 है और $ w_commit स्‍टैश कमिट है); क्या git stash show# 3 को भी शामिल करने के लिए कोई अंतर्निहित तरीका है ?
मैक्स नानसी

आप कहते हैं के रूप में, मैं एक गुप्त कोष की एक एकल सारांश दृश्य प्राप्त करने के लिए एक तरह से नहीं मिला है, लेकिन आप के साथ एक आदेश में अपनी पूरी जानकारी देख सकते हैं: git log --graph --topo-order -m -uMatthewlmcclure.com/s/2014/01/10/…
मैट मैकक्लेर

4
ध्यान दें कि आपको एक बदसूरत त्रुटि मिलती है ( fatal: ambiguous argument 'stash@{0}^3': unknown revision or path not in the working tree.) यदि आपके पास वास्तव में उस स्टैश में अनट्रैक की गई फाइलें नहीं हैं (लेकिन आपने जो सोचा था)।
रान्डेल

2
@antak: नहीं, git stash showहै नहीं ट्रैक न किए गए फ़ाइलें (कम से कम Git 2.7.4 के लिए सच) दिखाने:
नॉर्बर्ट Bérci

1
नोट (2.13.2-linux): git stash popपहले अनट्रैक्ड फाइल्स को रिस्टोर करने का प्रयास करेंगे, फिर ट्रैक की गई फाइल्स को रिस्टोर करने का प्रयास करेंगे। यदि बाद वाला ऑपरेशन विफल हो जाता है (उदाहरण के लिए संघर्ष), पहला ऑपरेशन रोल-बैक नहीं है (अनट्रैकड-फाइल-स्टैश इस तरह रहेगा लेकिन फाइलें डिस्क से नहीं हटाई जाती हैं), इसलिए यदि आप संघर्ष को ठीक करते हैं, तो अगला पॉप विफल हो जाएगा वैसे भी।
मैरिनो एक

22

आप निम्न कमांड के साथ सभी स्टैट्स कमिट्स को सूचीबद्ध कर सकते हैं:

git rev-list -g stash

चूंकि स्टैड्स को HEAD, इंडेक्स के 3-वे मर्ज कमेटी के रूप में दर्शाया जाता है, और बिना फाइल की एक पैरेंट-लेस "रूट" कमेटी, उपरोक्त आउटपुट को निम्न में पाइपिंग करके अनट्रैक फाइल स्टैम्स को सूचीबद्ध किया जा सकता है:

git rev-list -g stash | git rev-list --stdin --max-parents=0

उपरोक्त के उपयोगी अनुप्रयोग:

केवल अनरेटेड, स्टैक्ड फ़ाइलों को दिखाएं

git rev-list -g stash | git rev-list --stdin --max-parents=0 | xargs git show --stat

बेशक, --statफ़ाइलों की सामग्री को देखने के लिए निकालें ।

एक विशिष्ट फ़ाइल ढूँढें

git rev-list -g stash | xargs -n1 git ls-tree -r | sort -u | grep <pattern>

फ़ाइलों को अनट्रैक करें

git rev-list -g stash | git rev-list --stdin --max-parents=0 | xargs git grep <pattern>

सभी स्‍टैड की सभी सामग्रियों को सूचीबद्ध करें

git rev-list -g stash | git rev-list --stdin | xargs git show --stat

10

स्टाॅक में अनट्रैक की गई फाइलों को सूचीबद्ध करने के लिए:

git ls-tree -r stash@{0}^3 --name-only

सभी अनटैक की गई फ़ाइलों का पूर्ण रूप दिखाने के लिए (सामग्री के साथ):

git show stash@{0}^3

ये कमांड अंतिम (सबसे हालिया) स्टैश पढ़ते हैं। पहले के स्टैच के लिए, "स्टेश @" के पीछे की संख्या बढ़ाएं, उदाहरण के stash@{2}लिए अंतिम स्टैश से दूसरे के लिए।

इसका कारण यह है कि git stashप्रत्येक स्टैश के लिए एक मर्ज कमिट बनाता है, जिसे इस प्रकार संदर्भित किया जा सकता है stash@{0}, stash@{1}आदि। इस कमिट का पहला अभिभावक स्टैश के समय HEAD है, दूसरे पैरेंट में ट्रैक की गई फ़ाइलों में परिवर्तन हैं, और तीसरा (जो मौजूद नहीं हो सकता है) अनट्रैक फ़ाइलों में परिवर्तन।

यह "चर्चा" के तहत मैनपेज में आंशिक रूप से समझाया गया है ।


5

सभी फाइलों को देखने के लिए (दोनों ट्रैक किए गए और अनट्रैक किए गए), मैंने इस उपनाम को अपने कॉन्फ़िगरेशन में जोड़ा:

showstash = "!if test -z $1; then set -- 0; fi; git show --stat stash@{$1} && git show --stat stash@{$1}^3 2>/dev/null || echo No untracked files -"

यह एक एकल तर्क लेता है कि आप कौन सा रोकना चाहते हैं। ध्यान दें कि यह अभी भी दो बैक-टू-बैक सूची में प्रस्तुत करेगा।

if...fiअनुभाग बैश तर्क बदलता है $ 1 0 करने के लिए करता है, तो कोई भी पारित किया गया था।


5

वर्कअराउंड: फ़ाइलों को स्टेज करने से पहले उन्हें मंचित करने से उम्मीद के मुताबिक git stash show -pकाम हो जाएगा ।

git add .
git stash save

नोट: यह तरीका इंटरएक्टिव भागों को जोड़ने वाली शक्ति भी देता है, यहाँ बताया गया है कि कैसे
सावधानी: सुनिश्चित करें कि आपके पास पहले काम नहीं है, या आप इसे भेद नहीं पाएंगे।
यह उपयोग का हो सकता है।

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