एक स्टाॅश के प्रति भिन्नता


1356

मैं उन परिवर्तनों को कैसे देख सकता हूँ जो वर्तमान में काम कर रहे पेड़ से टकराएंगे? मैं जानना चाहूंगा कि उन्हें लागू करने से पहले क्या बदलाव होंगे!



1
संबंधित पोस्ट यहाँ
RBT

जवाबों:


1869

सबसे हालिया कड़ी देखें:

git stash show -p

देखें एक मनमाना टकराव:

git stash show -p stash@{1}

से git stashmanpages:

डिफ़ॉल्ट रूप से, कमांड डिफॉल्ट को दिखाता है, लेकिन यह git diff के लिए जाने जाने वाले किसी भी प्रारूप को स्वीकार करेगा (जैसे, git stash show -p stash @ {1} को पैच के रूप में दूसरा सबसे नया स्टैश देखने के लिए)।


72
stash@{0}डिफ़ॉल्ट है; यदि आपको पिछली स्‍तंभों को देखना है तो आपको केवल एक तर्क की आवश्‍यकता है।
कास्केबेल

52
सही। मैंने इसे केवल आपूर्ति की ताकि यह स्पष्ट हो सके कि इसके अलावा अन्य बाधाओं को कैसे देखा जाए {0}
अंबर

74
यह स्‍टैश और वर्तमान वर्किंग डायर के बीच के अंतर को नहीं दिखाएगा, लेकिन स्‍टैश और इसके मूल माता-पिता के बीच। सही? मैनपेज से: "स्टैश में दर्ज बदलावों को स्टैक्ड अवस्था और उसके मूल माता-पिता के बीच अंतर के रूप में दिखाएं।"
मैग्ने

14
@ एम्बर - सच है, हालांकि अगर आपका वर्तमान काम करने वाला पेड़ गंदा है, तो यह मायने रखता है, और यह थोड़ा और अधिक जटिल बनाता है। मैं उस कोण से इस पर आया, और एक प्रक्रिया मिली जिसे मैंने नीचे अपने उत्तर में साझा किया।
मैग्ने

6
किस लिए -pखड़ा है?
गेराल्ड

308

सबसे हालिया कड़ी देखने के लिए:

git stash show -p

एक मनमाना संघर्ष देखने के लिए:

git stash show -p stash@{1}

इसके अलावा, मैं किसी भी शाखा के साथ टकराव की तुलना करने के लिए गिट भिन्न का उपयोग करता हूं।

आप उपयोग कर सकते हैं:

git diff stash@{0} master

शाखा मास्टर की तुलना में सभी परिवर्तनों को देखने के लिए।


या आप उपयोग कर सकते हैं:

git diff --name-only stash@{0} master

केवल आसान फ़ाइल नाम खोजने के लिए।


10
यह विशिष्ट प्रश्न का उत्तर नहीं देता है। यदि आपने मास्टर से स्टैश बनाया है (बाद में काम बचाने के लिए), तो मास्टर पर अन्य काम के लिए कुछ कमिट करें, फिर करें git diff stash@{0} master, आपको वर्तमान मास्टर के खिलाफ अपने स्टैश का एक अंतर मिलता है (जिसमें स्टैश के बाद मास्टर पर किया गया काम भी शामिल है। बनाया गया था), न कि फाइलें / लाइनें जो कि स्टैश बदल जाएंगी, जो कि सवाल है।
टॉम डे लेउ

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

6
यह कस्टम अंतर दर्शक का उपयोग करके अंतरों को देखने की भी अनुमति देता है, जैसेgit difftool --tool=... stash@{0} HEAD
आंद्रे होल्जनर

9
@TomDeLeu अच्छा अवलोकन और एक महत्वपूर्ण बिंदु। अपने माता-पिता के साथ एक स्टैश आइटम की तुलना करने के लिए, यह काम करने लगता है:git diff stash@{0}^ stash@{0}
erikprice

1
साथ ही, आप git diff stash@{0} master -- filenameकिसी विशिष्ट फ़ाइल में परिवर्तन प्राप्त करने के लिए फ़ाइल नाम जोड़ सकते हैं ।
डेविड

104

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

git diff stash@{0}^!

यह तुलना के आधार पर किए गए संघर्ष की तुलना करता है।


बहुत अच्छा मैंने एक उपनाम जोड़ा ~/.gitconfig:laststash = diff stash@{0}^!
sbeam

5
परफेक्ट जोड़ी: git difftool stash^!आखिरी git difftool stash HEAD
स्ट्रैस के डिफरेंस के


"git diff stash @ {0} ^!" फोड़े के नीचे "git diff stash @ {0} ^ stash @ {0} ~ 1 ^ stash @ {0} ~ 2 ......." होता है, लेकिन git diff में केवल 2 ही लगते हैं, यह stash के बीच के अंतर को दर्शाता है @ {0} और ^ स्टैश @ {0} ~ 1 और 2 की शुरुआत में ^ लगता है कि कोई भी अलग नहीं करता है और इसे अनदेखा नहीं करता है।
नागा किरण

मैं इस संस्करण को अपने पसंदीदा डिफरेंशियल टूल (बियॉन्ड तुलना की तुलना में!) का उपयोग करने में सक्षम होना पसंद करता हूं। यह इस स्टाॅक में बदलाव को भी दर्शाता है, जो मुझे लगता है कि मूल प्रश्न है, जैसा कि उपरोक्त टिप्पणियों में वर्णित एक विकल्प के विपरीत है "git diff stash @ {X} ^ stash @ {X}" जो केवल स्टैक्ड अंतर से अधिक दिखाता है।
user107172

44

अगर आपका वर्किंग ट्री गंदा है , तो आप पहले गंदे काम करने वाले पेड़ से टकराकर उसकी तुलना कर सकते हैं, और फिर उसकी तुलना डंडे से कर सकते हैं। बाद में, आप गंदे काम करने वाले पेड़ के साथ प्रतिबद्ध कर सकते हैं (क्योंकि आप चाहते हैं कि आपके कमिट लॉग में वह गंदा काम न हो)।

आप दो दृष्टिकोणों की एक दूसरे के साथ तुलना करने के लिए निम्नलिखित दृष्टिकोण का उपयोग कर सकते हैं (जिस स्थिति में आप पहली बार किसी एक स्टैम्प को पॉप करते हैं)।

  • अपना गंदा काम करने वाला पेड़ लगाएँ:

    git add .
    git commit -m "Dirty commit"
    
  • उस प्रतिबद्धता के साथ टकराव को दूर करें:

    git diff HEAD stash@{0}
    
  • फिर, बाद में, आप कमिट वापस कर सकते हैं, और इसे काम कर रहे डायर में वापस रख सकते हैं:

    git reset --soft HEAD~1
    git reset .
    

अब आप अपने स्टाफ़ के साथ गंदे काम करने वाले पेड़ को अलग कर चुके हैं, और शुरू में आप जहां थे वहां वापस आ गए हैं।


क्या ऐसा करने का एक तरीका है, लेकिन केवल फ़ाइलों का एक हिस्सा देखने के लिए जो स्टैश में है, उसे बदल दिया जाएगा?
लैगवेज़ल

में 2020 यह बहुत सरल है; मेरे अप-टू-डेट उत्तर देखें
डेविड डेप्रोस्ट

दिलचस्प है, मैं इसके बारे में नहीं जानता था git stash show -l । क्या यह काम करने वाली (गंदी) कॉपी के खिलाफ नवीनतम कड़ी है? बिना पाने के आप इसका उपयोग कैसे करते हैं error: switch l requires a value?
मैग्ने

हां वास्तव में, यह (संभवतः गंदे) काम करने वाली कॉपी के खिलाफ अलग है। आप इसे केवल दर्ज करके उपयोग करें git stash show -l। जैसे कि यह आपके लिए काम क्यों नहीं करता है, मैं केवल अनुमान लगा सकता हूं कि आप पुराने संस्करण पर हो सकते हैं? मैं git v2.20.1 पर हूं, और यह बिना त्रुटियों के त्रुटिपूर्ण काम करता है।
डेविड डेप्रोस्ट

25

@ मैग्ने का उत्तर केवल (बहुत देर से) तारीख है, जो प्रश्न की सबसे अधिक लचीली / उपयोगी व्याख्या का उत्तर देता है, लेकिन इसकी निष्पक्ष आवश्यकता से अधिक जटिल है। कमिट करने और रीसेट करने के बजाय, बस अपनी वर्किंग कॉपी को स्टैश करें, तुलना करें, फिर अनस्टैश करें।

git stash save "temp"
git diff stash@{0} stash@{1}
git stash pop

यह आपको स्टैस स्टैक के शीर्ष और आपके काम करने वाले फ़ोल्डर के बीच के अंतर को अस्थायी रूप से आपके काम करने वाले फ़ोल्डर में बदलाव करके दिखाता है, मूल स्टैक के शीर्ष (stash @ {0}) बन जाते हैं, जो मूल शीर्ष को नीचे ले जाता है (stash @ {1}) ) तब 'नए सेट' की स्थिति में मूल शीर्ष का उपयोग करने की तुलना करना ताकि आप अपने वर्तमान काम के शीर्ष पर इसे लागू करने के परिणामस्वरूप होने वाले परिवर्तनों को देखेंगे।

"लेकिन क्या होगा अगर मेरे पास कोई मौजूदा काम नहीं है?" फिर आप सामान्य उबाऊ मामले में हैं। बस @ अंबर के उत्तर का उपयोग करें

git stash show

या @ czerasz का जवाब

git diff stash@{0}

या स्वीकार करते हैं कि तेज और अस्थिर वैसे भी तेज और आसान है, बस परिवर्तनों को अनस्टैश करें और उनका निरीक्षण करें। यदि आप उन्हें पल में फेंकना नहीं चाहते हैं (वर्तमान सूचकांक / कार्य फ़ोल्डर परिवर्तन) दूर। पूरी तरह से

git stash apply
git diff
git reset
git checkout

3
यह सरल दृष्टिकोण (स्टैश और फिर दूसरे स्टेश की तुलना) सुरक्षित और समझने में आसान है। कुछ उपयोग के मामलों के लिए आप git stash save -u
अनचाहे

19

यह मेरे लिए git संस्करण 1.8.5.2 पर काम करता है:

git diff stash HEAD

2
गुमराह करने वाले! सवाल यह है कि वर्तमान में काम कर रहे पेड़ को अन-स्टैशिंग करने वाले परिवर्तनों को मैं कैसे देख सकता हूं? यह स्टैश और HEAD के बीच के अंतर को दर्शाता है जो कि इसके साथ लागू किए जाने की तुलना में बहुत भिन्न हो सकता है git stash apply
मिकजेनसेन

कृपया प्रश्न पर अधिक पढ़ें "मैं जानना चाहूंगा कि उन्हें लागू करने से पहले क्या बदलाव होंगे!"। मैं इसका तेजी से जवाब दे रहा हूं।
येरिलबिल्बिन

इसके अलावा, आप देख सकते हैं कि सभी अन्य उत्तर किसी भी तरह वर्तमान सिर (या काम करने वाले सेट) को स्टैश के खिलाफ अलग करने के बारे में हैं। केवल मेरा उत्तर भ्रामक क्यों है? यह उचित नहीं है।
येरिलबिल्बिन

@yerlilbilgin नीचे दिए गए आपके जवाब पर मेरी प्रतिक्रिया देखें।
14

हम हेड कर सकते हैं, यह डिफ़ॉल्ट रूप से है, है ना?
अल.जी.

10

बस मामले में, काम करने वाले पेड़ में एक फाइल की तुलना करने और स्टैश में, नीचे दिए गए कमांड का उपयोग करें

git diff stash@{0} -- fileName (with path)

9

यदि आपके पास भिन्न उपकरण हैं (जैसे तुलना से परे)

git difftool stash HEAD

1
गुमराह करने वाले! सवाल यह है कि वर्तमान में काम कर रहे पेड़ को अन-स्टैशिंग करने वाले परिवर्तनों को मैं कैसे देख सकता हूं? यह स्टैश और HEAD के बीच के अंतर को दर्शाता है जो कि इसके साथ लागू किए जाने की तुलना में बहुत भिन्न हो सकता है git stash apply
मिकजेनसेन

1
यदि आपको लगता है कि यह भ्रामक है, तो कृपया अन्य सभी उत्तरों की जाँच करें। यह उचित नहीं है!
yerlilbilgin

1
आप ध्यान देंगे कि मैंने उसी टिप्पणी को दूसरे उत्तर में कॉपी किया था जो कि भ्रामक थी (बहुत ही समान उत्तर)। अन्य उत्तर जो पहले से ही एक समान टिप्पणी थी, मैंने अकेले छोड़ दिया। यदि आप समझते हैं कि गिट स्टैश कैसे काम करता है, तो आपको एहसास होगा कि HEAD के खिलाफ स्टैश को अलग करना लागू नहीं होता है (जो कि ओपी पूछता है)। वास्तविक "स्टैश" स्टैश कमिट के बीच का अंतर है और इसके पहले क्या था। यह पैच तब HEAD पर लागू होता है। इसलिए यदि आप यह जानना चाहते हैं कि ओपी ने क्या पूछा है, तो आपको इससे पहले स्टैश और कमिट के बीच का अंतर दिखाना होगा, जो कि सही उत्तर देते हैं।
मिकजेनसेन

1
यह किसी भी अन्य (बेवजह) लंबे उत्तर की तुलना में सीधे प्रश्न का उत्तर देता है, और ओपी ने जो पूछा, उसे हटाने का अधिकार है HEAD। मैं HEAD को हटाने के लिए @ yerlilbilgin के उत्तर को संशोधित कर सकता था, लेकिन मुझे लगता है कि कोई भी व्यक्ति जो git का उपयोग करता है, वह उस भाग का पता लगा सकता है और मुझे उत्तर को लंबा करने से यह कम पठनीय होगा। @Yerlibilgin पर कोई दोष नहीं।
श्रीधर सरनोबत

4

बिना किसी चीज़ को आगे बढ़ाए ऐसा करने का एक तरीका है कि इस तथ्य का फायदा उठाया जाए कि patchपढ़ सकते हैं git diff's (एकीकृत रूप से भिन्न होता है)

git stash show -p | patch -p1 --verbose --dry-run

यह आपको एक कदम-दर-चरण पूर्वावलोकन दिखाएगा कि पैच आमतौर पर क्या करेगा। इसके अतिरिक्त लाभ यह है कि पैच खुद को काम करने वाले पेड़ को पैच लिखने से रोक नहीं पाएगा, अगर किसी कारण से आपको वास्तव में कमिटिंग-से-संशोधित करने के बारे में चुप रहने की आवश्यकता है, तो आगे बढ़ें और हटाएं-dry- क्रिया निर्देशों का पालन करें और पालन करें।


2

इस सूत्र में और इस एक में मैंने जो सीखा है, उसे जोड़ते हुए , जब मैं देखना चाहता हूं कि "स्टैश के अंदर क्या है", मैं पहली बार दौड़ता हूं:

git stash show stash@{0}

यह दिखाएगा कि क्या फ़ाइलों को संशोधित किया गया था। फिर, मल्टिफ्टफूल में एक अच्छा दृश्य प्राप्त करने के लिए, मैं करता हूं:

git difftool --dir-diff stash@{0} stash@{0}^

यह अपने माता-पिता के खिलाफ दिए गए टकराव के समय सभी अंतरों को प्रदर्शित करेगा।

आप Meld के~/.gitconfig साथ, उदाहरण के लिए अलग टूल को कॉन्फ़िगर कर सकते हैं :

...
[diff]
    tool = meld

1

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

git stash show --helpआपको वह सब देना चाहिए जो आपको चाहिए; जिसमें स्टश शो की जानकारी शामिल है।

शो [<स्लेश>]

स्टैश में दर्ज परिवर्तनों को स्टैक्ड अवस्था और उसके मूल माता-पिता के बीच अंतर के रूप में दिखाएं। जब नहीं दिया जाता है, तो नवीनतम दिखाता है। डिफ़ॉल्ट रूप से, कमांड डिफॉल्ट को दिखाता है, लेकिन यह git diff के लिए जाने जाने वाले किसी भी प्रारूप को स्वीकार करेगा (जैसे, git stash show -p stash @ {1} को पैच के रूप में दूसरा सबसे नया स्टैश देखने के लिए)। आप डिफ़ॉल्ट व्यवहार को बदलने के लिए stash.showStat और / या stash.showPatch कॉन्फ़िगरेशन चर का उपयोग कर सकते हैं।


1

वह स्टैश की सूची है

git stash list 
stash@{0}: WIP on feature/blabla: 830335224fa Name Commit
stash@{1}: WIP on feature/blabla2: 830335224fa Name Commit 2

तो स्टैश नंबर प्राप्त करें और करें:

तुम कर सकते हो:

 git stash show -p stash@{1}

लेकिन अगर आप एक अंतर चाहते हैं (यह दिखावा दिखाने के लिए अलग है, इसलिए मैं यह उत्तर लिखता हूं। Diff अपनी शाखा में वर्तमान कोड पर विचार करें और showबस दिखाएं कि आप क्या लागू करेंगे। )

आप उपयोग कर सकते हैं:

git diff stash@{0}

या

git diff stash@{0} <branch name>

एक और दिलचस्प बात यह है:

git stash apply
git stash apply stash@{10}

यह सूची से हटाए बिना स्टैश लागू करता है, आप कर सकते हैं git checkout . उन बदलावों को हटा हैं या यदि आप git stash drop stash@{10}सूची से एक स्लैश हटाने के लिए खुश हैं ।

यहां से मैं कभी भी git stash popसंयोजन का उपयोग करने और उपयोग करने की अनुशंसा नहीं करता हूं git stash applyऔर git stash dropयदि आप गलत शाखा में एक स्लैश लागू करते हैं ... तो कभी-कभी आपके कोड को पुनर्प्राप्त करना मुश्किल होता है।


1

इस पर निर्भर करते हुए कि आप (स्थानीय कामकाजी वृक्ष / माता-पिता / मुखिया की प्रतिबद्धता के साथ) की तुलना करना चाहते हैं, वास्तव में कई कमांड उपलब्ध हैं, जिनमें से अच्छे पुराने git diff, और अधिक विशिष्ट हैं git stash show:

╔══════════════════════╦═══════════════════════════════╦═══════════════════╗
║ Compare stash with ↓ ║ git diff                      ║ git stash show    ║
╠══════════════════════╬═══════════════════════════════╬═══════════════════╣
║ Local working tree   ║ git diff stash@{0}            ║ git stash show -l ║
║----------------------║-------------------------------║-------------------║
║ Parent commit        ║ git diff stash@{0}^ stash@{0} ║ git stash show -p ║
║----------------------║-------------------------------║-------------------║
║ HEAD commit          ║ git diff stash@{0} HEAD       ║   /               ║
╚══════════════════════╩═══════════════════════════════╩═══════════════════╝

git stash showपहली नज़र में अधिक उपयोगकर्ता के अनुकूल दिखने के दौरान , git diffवास्तव में यह अधिक शक्तिशाली है कि यह एक अधिक केंद्रित अंतर के लिए फ़ाइल नाम निर्दिष्ट करने की अनुमति देता है। मैंने व्यक्तिगत रूप से इन सभी कमांड के लिए अपने zsh git प्लगइन में एलियासेस सेट किया है ।

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