जीआईटी में केवल अन-स्टैन्डेड बदलावों को स्ट्रैस करना


229

मैं निम्न कार्य प्रवाह करना चाहता हूं:

  1. चरण में परिवर्तन जोड़ें।
  2. अन्य सभी परिवर्तनों का मंचन करें, जिनका मंचन नहीं किया गया।
  3. स्टेज में चीजों के साथ कुछ सामान (यानी निर्माण, परीक्षण चलाने, आदि)
  4. स्टाॅस लगायें।

क्या चरण 2 करने का कोई तरीका है?

उदाहरण

 echo "123" > foo
 git add foo # Assumes this is a git directory
 echo "456" >> foo
 git stash
 cat foo # Should yield 123

उनके मंचन के बाद आपके बदलाव क्यों नहीं हुए?
शिज़मो

3
IIRC --keepindex करता है वास्तव में है कि
sehe

4
क्योंकि अगर, कहते हैं, बिल्ड विफल रहता है, तो मैं इसके लिए प्रतिबद्ध नहीं होना चाहता। मुझे पता है कि मैं कमिट को डिलीट कर सकता हूं लेकिन अगर संभव हो तो बिना कमिटमेंट के ऐसा करना चाहूंगा।
अनपिड्रा

सेह, धन्यवाद। मैं इस काम की पुष्टि कर सकता हूं। जी, मैंने linux.die.net/man/1/git-stash पर मैनुअल को देखा, जो पुराना है। man git stashज़्यादा बेहतर है।
अनपेदिद्रा

यह है - प्रशासन-सूचकांक, fwiw।
jaf0

जवाबों:


288

git stash saveएक विकल्प है --keep-indexजो वास्तव में आपकी आवश्यकता है।

तो, भागो git stash save --keep-index


9
सच। मैं saveसाथ प्रयोग करता रहता हूं git stash। शायद यह मेरे लिए प्रोग्रामर है जो कि समरूपता को लागू / पॉप के साथ सम्मानित करने पर जोर दे रहा है। :)
vhallac

104
नोट: यह अभी भी आपके सभी परिवर्तनों को चुरा रहा है ; नियमित रूप से एकमात्र अंतर git stash saveयह है कि यह आपकी कार्यशील प्रति में पहले से ही मौजूद परिवर्तनों को भी छोड़ देता है। इसके बाद के वर्कफ़्लो में यह ठीक काम करेगा क्योंकि आप केवल एक स्थानीय प्रतिलिपि के शीर्ष पर स्टेश लगा रहे हैं, जिसमें पहले से ही स्टैश के परिवर्तनों का आधा हिस्सा है (जो कि उपेक्षा करने के लिए काफी स्मार्ट है)। लेकिन यदि आप स्‍टेश को पुन: लागू करने से पहले कोड को संपादित करते हैं, तो आप संभावित रूप से मर्ज संघर्ष देख सकते हैं जब आप आवेदन करने जाते हैं। FYI करें।
पेट्रैल्नन

2
@ytpete जो मुझे कई बार काट चुका है। मैं वास्तव में कामना करता हूं कि आपके काम नहीं आने वाली चीजों को केवल चुभने का एक तरीका था ... मैं अक्सर सामान करता हूं, फिर एक पूरी तरह से संघर्ष करता हूं, यह जानकर कि git commit --ammendअगर मैं प्रतिबद्ध हूं तो इसमें कोई समस्या हो सकती है।
rjmunro

1
--amend(बल्कि --ammend)
राउबर्ब

19
यह समाधान मेरे लिए काम नहीं करता है क्योंकि पेट्रेलिन द्वारा वर्णित समस्याओं के कारण। यह सवाल का अच्छा जवाब नहीं है क्योंकि यह अभी भी मंचित परिवर्तनों को चुरा रहा है। किसी को भी एक बेहतर समाधान मिला?
user643011

43

यह 3 चरणों में किया जा सकता है: चरणबद्ध परिवर्तनों को सहेजें, बाकी सब को रोकें, मंचित परिवर्तनों के साथ सूचकांक को पुनर्स्थापित करें। जो मूल रूप से है:

git commit -m 'Save index'
git stash push -u -m 'Unstaged changes and untracked files'
git reset --soft HEAD^

यह वही करेगा जो आप चाहते हैं।


3
नोट: -uअनटैक्ड फ़ाइलों को भी चुरा लेता है।
ma11hew28

यह दृष्टिकोण अनिवार्य रूप से नकल git stash save --keep-indexकरता है जो बहुत अधिक काम करता है। मुझे कोई फायदा नहीं दिख रहा है।
inigo

1
@ वीवीएस नहीं, दृष्टिकोण डुप्लिकेट नहीं है। स्वीकार किए जाते हैं जवाब के लिए पीटरसन की टिप्पणी देखें।
अलेक्जेंडर क्लाउर

28
git stash save --keep-index

इसके अलावा, पुन:

उनके मंचन के बाद आपके बदलाव क्यों नहीं हुए? - शिन

A: क्योंकि आपको हमेशा परीक्षण किए गए कोड की जांच करनी चाहिए :) इसका मतलब है, आपको केवल उन परिवर्तनों के साथ परीक्षण चलाने की आवश्यकता है जो आप करने जा रहे हैं

यह सब इस तथ्य से अलग है कि निश्चित रूप से, एक अनुभवी प्रोग्रामर के रूप में, आपको उन परिवर्तनों का परीक्षण और समीक्षा करने का सहज आग्रह है - केवल आंशिक रूप से मजाक


14

साथ git version 2.7.4आप कर सकते हैं:

git stash save --patch

gitआप गुप्त कोष में अपने परिवर्तन जोड़ सकते हैं या नहीं करने के लिए कहेगा।
और तुम तो बस जवाब दो yयाn

आप कार्यशील निर्देशिका को पुनर्स्थापित कर सकते हैं क्योंकि आप हमेशा ऐसा करते हैं:

git stash pop

या, यदि आप स्‍कैश में सहेजे गए परिवर्तन रखना चाहते हैं:

git stash apply

यह कमाल का है। यह थोड़ा श्रम-साध्य है, लेकिन कम से कम आप संपूर्ण फ़ाइलों को छोड़ और जोड़ सकते हैं।
डस्टिन Oprea

5

पिछले उत्तरों को बढ़ाते हुए, मेरे पास कभी-कभी परिवर्तनों का एक जटिल समूह होता है, लेकिन पहले एक अलग परिवर्तन करने की इच्छा रखते हैं। उदाहरण के लिए, मुझे एक बग या अन्यथा गलत कोड दिखाई दे सकता है जिसे मैं अपने मंचित परिवर्तनों के आगे ठीक करना चाहूंगा। लेने के लिए एक संभावित मार्ग यह है:

पहले सब कुछ रोकें, लेकिन चरणबद्ध परिवर्तनों को छोड़ दें

$ git स्टैश सेव -की-इंडेक्स [--include-untracked]

अब मंचन परिवर्तनों को अलग से भी मिटा दें

$ जीएटी स्लैश सेव

सुधार के लिए परिवर्तन करें; और परीक्षण; उन्हें प्रतिबद्ध:

$ git add [--interactive] [--patch]

$ जीआईटी कमिट-एम "फिक्स ..."

अब पूर्व में किए गए परिवर्तनों को पुनर्स्थापित करें:

$ जीआईटी स्टैश पॉप

किसी भी संघर्ष को हल करें, और ध्यान दें कि यदि संघर्ष थे, तो गिट ने आवेदन किया होगा लेकिन उस शीर्ष स्लैश प्रविष्टि को नहीं छोड़ा।

(... उसके बाद किए गए परिवर्तनों का मंचन करें, और अन्य सभी परिवर्तनों की कड़ी को पुनर्स्थापित करें, और जारी रखें ...)


4

स्टैग में फ़ाइलों को अनस्टैग्ड (कमिट में नहीं जोड़ा गया) जोड़ने के लिए, निम्न कमांड चलाएँ:

git stash -k

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

git stash pop

4

जीआईटी में सिर्फ काम करने वाले पेड़ (अस्थिर परिवर्तन) को नष्ट करना उससे कहीं अधिक कठिन है जितना होना चाहिए। स्वीकृत उत्तर अस्थिर परिवर्तनों को चुरा लेता है, लेकिन मंचित परिवर्तनों को भी चुरा लेता है (और साथ ही साथ उन्हें छोड़ देता है), जो शायद ही कभी आप चाहते हैं।

यह उर्फ ​​अच्छा काम करता है:

stash-working = "!f() { \
  git commit --quiet -m \"temp for stash-working\" && \
  git stash push \"$@\" && \
  git reset --quiet --soft HEAD~1; }; f"

यह अस्थायी परिवर्तनों को अस्थायी रूप से करता है, शेष परिवर्तनों से एक टकराव पैदा करता है (और अतिरिक्त दलीलें देता है जैसे कि --include-untrackedऔर --messageउर्फ तर्कों के रूप में पारित किया जाता है), और फिर चरणबद्ध परिवर्तनों को वापस पाने के लिए अस्थायी प्रतिबद्ध को रीसेट करता है।

यह @Simon Knapp के उत्तर के समान है , लेकिन कुछ मामूली अंतरों के साथ - यह लिए --quietगए अस्थायी कार्यों पर उपयोग करता है , और यह pushहार्ड-कोडिंग के बजाय, स्टैश के लिए कई मापदंडों को स्वीकार करता है ।-m , और यह --softअंतिम में जोड़ता है रीसेट करें ताकि इंडेक्स शुरू होते ही बना रहे।

मंचन की विपरीत समस्या के लिए केवल मंचित परिवर्तन (उपनाम stash-index) इस उत्तर को देखें ।


2

एक और टिप, सवाल से संबंधित:

जब आप प्रभावी रूप से अपने अस्थिर परिवर्तनों का उपयोग करते हैं

$ जीआईटी स्टैश सेव -की-इंडेक्स

आप स्टैश को एक संदेश देना चाह सकते हैं, ताकि जब आप ए git stash list यह अधिक स्पष्ट हो कि आप पहले क्या धराशायी हो चुके हैं, खासकर यदि आप उस स्लैश ऑपरेशन को आगे की बचत से करते हैं। उदाहरण के लिए

$ git stash save --keep-index "परिवर्तन अभी तक नहीं हुए हैं"

(हालांकि वास्तव में इसमें अन्य उत्तरों के अनुसार सभी बदलाव शामिल हैं)।

उदाहरण के लिए, उपरोक्त का तुरंत पालन किया जा सकता है:

$ git स्‍टैश सेव "फीचर X के लिए मंचन परिवर्तन"

हालांकि, खबरदार, कि आप तब उपयोग नहीं कर सकते

$ git स्‍टैश लागू होता है "स्‍टैश @ {1}" ### ✘ जो आप चाहते हैं वह काफी नहीं करता है

केवल अस्थिर परिवर्तनों को पुनर्स्थापित करने के लिए।


2

Git में एक कमांड नहीं है जो केवल आपके अस्थिर परिवर्तनों को चुराता है।

हालांकि, Git आपको यह बताने की अनुमति देता है कि आप किन फ़ाइलों को स्टैश करना चाहते हैं।

git stash push --message 'Unstaged changes' -- app/controllers/products_controller.rb test/controllers/products_controller_test.rb

यदि आप केवल उन फ़ाइलों में विशिष्ट परिवर्तन करना चाहते हैं, तो --patchविकल्प जोड़ें ।

git stash push --patch --message 'Unstaged changes' -- app/controllers/products_controller.rb test/controllers/products_controller_test.rb

--include-untrackedविकल्प आपको ट्रैक न किए गए फ़ाइलों छिपाया सुविधा देता है।

git stash push --include-untracked --message 'Untracked files' -- app/controllers/widgets_controller.rb test/controllers/widgets_controller_test.rb

अधिक जानकारी के लिए चलाएँ git help stash(या man git-stash)।

ध्यान दें: यदि आपके अस्थिर बदलावों को असम्बद्ध किया जाता है, तो @ alesguzik का उत्तर शायद आसान है।


0

उस आदेश का आधुनिक रूप है git stash push [--] [<pathspec>...], क्योंकि Git 2.16+ ( git stash saveपदावनत ) है

उदाहरण के लिए, आप वाइल्डकार्ड फॉर्म के साथ संयोजन कर सकते हैं:

git stash push --all --keep-index ':(glob)**/*.testextension' 

लेकिन यह विंडोज के लिए Git के साथ अच्छी तरह से काम नहीं करता है, जब तक Git 2.22 (Q2 2019), 2037 के अंक देखें , git stashसी में फिर से लागू किया गया है। (शेल स्क्रिप्ट के बजाय)

थॉमस गुम्मर ( ) द्वारा 7db9302 (11 मार्च 2019) प्रतिबद्ध देखें । देखें प्रतिबद्ध 1366c78 , प्रतिबद्ध 7b556aa (07 मार्च 2019) से जोहानिस Schindelin ( )( जूनियो सी हमानो द्वारा विलय - - में 0ba1ba4 , 22 अप्रैल 2019)tgummerer
dscho
gitster

में निर्मित stash: :(glob)फिर से pathspecs संभाल

पथप्रदर्शक की सूची पास करते समय, git add हमें मूल रूप का उपयोग करने के लिए सावधान रहने की जरूरत है, न कि पथप्रदर्शक के रूप में।

कॉल करते समय यह एक अंतर बनाता है

git stash -- ':(glob)**/*.txt'

जहां मूल रूप में :(glob)उपसर्ग शामिल होता है, जबकि पार्स फॉर्म नहीं होता है।

हालाँकि, बिल्ट-इन में git stash, हमने पार्स किया गया (यानी गलत) फ़ॉर्म, और git addत्रुटि संदेश के साथ विफल हो जाएगा:

fatal: pathspec '**/*.txt' did not match any files

उस चरण में जहां git stashवर्कट्री से परिवर्तन गिरता है, भले ही refs/stashवास्तव में सफलतापूर्वक अपडेट किया गया हो।


0

मैं एक उपनाम का उपयोग करता हूं, जो एक स्ट्रिंग को स्टाश प्रविष्टि के संदेश के रूप में उपयोग करने के लिए स्वीकार करता है।

mystash = "!f() { git commit -m hold && git stash push -m \"$1\" && git reset HEAD^; }; f"

कौन कौन से:

  • सूचकांक में सब कुछ करता है,
  • काम के पेड़ में क्या बदला है, निश्चित रूप से ( -uया जोड़ सकता है)-a ),
  • काम करने की कोशिश करने के लिए अंतिम प्रतिबद्ध वापस रीसेट करता है ( --softइसे सूचकांक में रखने के लिए उपयोग करना चाह सकता है )।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.