git stash -> मर्ज स्टैक्ड परिवर्तन वर्तमान परिवर्तनों के साथ


186

मैंने अपनी शाखा में कुछ परिवर्तन किए और महसूस किया कि मैं भूल गया था कि मैंने कहा शाखा में कुछ अन्य आवश्यक परिवर्तन किए हैं। मैं जो चाहता हूं वह वर्तमान परिवर्तनों के साथ मेरे अटके हुए परिवर्तनों को मर्ज करने का एक तरीका है।

क्या इसे करने का कोई तरीका है?

सुविधा के लिए इसकी अधिकता, मैंने अंततः अपने वर्तमान परिवर्तनों को छोड़ दिया और पहले प्रतिबद्ध किया, फिर मेरे चरणबद्ध परिवर्तन हुए, लेकिन मैंने उन्हें एक झपट्टा मारने के लिए प्राप्त करना पसंद किया।



जोशुआ का उत्तर स्वीकृत उत्तर होना चाहिए। यह स्टैकओवरफ्लो पोस्ट इस सवाल का पहला गूगल लिंक है, जो इंटरनेट का सही जवाब देता है!
Jérôme

जवाबों:


271

मुझे अभी पता चला है कि यदि आपके अनकम्पोजिट बदलाव इंडेक्स में जोड़े जाते हैं (अर्थात "स्टेज्ड", का उपयोग करके git add ...), तो git stash apply(और, संभवतः git stash pop) , वास्तव में एक उचित मर्ज करेंगे। यदि कोई संघर्ष नहीं है, तो आप सुनहरे हैं। यदि नहीं, तो उन्हें हमेशा की तरह git mergetool, या मैन्युअल रूप से एक संपादक के साथ हल करें ।

स्पष्ट होने के लिए, यह वह प्रक्रिया है जिसके बारे में मैं बात कर रहा हूं:

mkdir test-repo && cd test-repo && git init
echo test > test.txt
git add test.txt && git commit -m "Initial version"

# here's the interesting part:

# make a local change and stash it:
echo test2 > test.txt
git stash

# make a different local change:
echo test3 > test.txt

# try to apply the previous changes:
git stash apply
# git complains "Cannot apply to a dirty working tree, please stage your changes"

# add "test3" changes to the index, then re-try the stash:
git add test.txt
git stash apply
# git says: "Auto-merging test.txt"
# git says: "CONFLICT (content): Merge conflict in test.txt"

... जो शायद आप देख रहे हैं।


tl; डॉ

git addपहले दौड़ो ।


8
ऐसा हैक, लेकिन हे, यह काम करता है और ऐसा करने का एकमात्र तरीका लगता है। काश git stash apply --forceकुछ ऐसा होता।
मैट कंटर

12
वास्तव में, यह हैक नहीं है - यह एक सुधार है जो आप चाहते हैं, क्योंकि आप आसानी से सूचकांक में बदलावों पर वापस लौट सकते हैं।
हॉफमैन

2
वाह, क्या यह व्यवहार वास्तव में git द्वारा लक्षित है?
edi9999

9
मुझे नहीं लगता कि कुछ भी "इरादा" कभी भी होता है। मेरा कूबड़ अब तक कुछ भी नहीं है कि यह संयोग से ऐसा करता है।
प्रोफैट्स

5
यह अचूक उपाय है। मैंने अभी-अभी किया git add ., git stash applyफिर git resetमेरे काम करने के बदलावों को रोकने के लिए और कमिट किए बिना मर्ज करने के लिए।
स्टीफन स्मिथ

70

चल रहा है git stash popया git stash applyअनिवार्य रूप से एक मर्ज है। आपको अपने वर्तमान परिवर्तनों को करने की आवश्यकता नहीं होनी चाहिए जब तक कि स्लैश में बदली गई फाइलें भी कार्यशील प्रति में नहीं बदल जाती हैं, जिस स्थिति में आपने यह त्रुटि संदेश देखा होगा:

error: Your local changes to the following files would be overwritten by merge:
       file.txt
Please, commit your changes or stash them before you can merge.
Aborting

उस स्थिति में, आप अपने वर्तमान परिवर्तनों को एक चरण में छिपाने की जगह लागू नहीं कर सकते। आप बदलाव कर सकते हैं, स्टैश लगा सकते हैं, फिर से कमिट कर सकते हैं, और git rebaseयदि आप वास्तव में दो कमिट नहीं चाहते हैं, तो उन दो कमिट्स को स्क्वैश करें , लेकिन यह अधिक परेशानी वाला हो सकता है।


1
मुझे वह संदेश मिला - परिवर्तन संघर्ष नहीं करते हैं लेकिन समान फ़ाइलों को साझा करते हैं, किसी भी तरह का उपयोग स्टैड्स / अप्लाई का?
बेमिस

1
क्षमा करें, यही मेरा मतलब है "मर्ज संघर्ष", लेकिन यह खराब शब्द विकल्प था। मुझे लगता है कि त्रुटि संदेश बहुत ही अंतिम है: यदि काम की कॉपी में बदली गई फाइलें भी छिपाने की जगह में बदल जाती हैं, तो आप स्टेश को लागू नहीं कर सकते। मैंने संभावित समाधान के साथ अपना उत्तर अपडेट कर दिया है।
ब्रैंडन

3
मैं सभी मामलों में इसका उत्तर नहीं मानूंगा। हो सकता है कि आप किसी विशिष्ट फ़ाइल में परिवर्तनों के एक सेट के केवल एक हिस्से को ही दबाए रखें क्योंकि आप कुछ विकसित करना चाहते थे। और हो सकता है कि आप इस समय फ़ाइल की वर्तमान सामग्री को कम से कम (या बिलकुल भी नहीं) करना चाहें क्योंकि यह WIP है। यह एक वास्तविक मुद्दा है कि परिवर्तन में जो परिवर्तन हुआ है वह आपकी वर्तमान शाखा में विलय नहीं किया जा सकता है
थॉमस वाटसन

21
जोशुआ वार्नर का जवाब सही के रूप में चिह्नित होना चाहिए। एक स्लैश को मर्ज करने के लिए, अपने परिवर्तनों को चरणबद्ध करें, स्टेश को लागू करें, किसी भी संघर्ष से निपटें और फिर (यदि वांछित हो) अपने परिवर्तनों को अनस्टेज करें।
व्रू

4
"आप बदलाव कर सकते हैं, स्टैश लगा सकते हैं, फिर से कमिट कर सकते हैं, और अगर आप वास्तव में दो कमिट नहीं चाहते हैं, तो गिट रिबेस का इस्तेमाल करके उन दो कमिट्स को स्क्वैश कर सकते हैं, लेकिन यह अधिक परेशानी वाला हो सकता है।" इसके बजाय आप कर सकते हैं: परिवर्तनों को प्रतिबद्ध करें, स्टैश लागू करें, और फिर git commit --amend
गबे

27

मैं जो चाहता हूं वह वर्तमान परिवर्तनों के साथ मेरे अटके हुए परिवर्तनों को मर्ज करने का एक तरीका है

यह करने के लिए एक और विकल्प है:

git stash show -p|git apply
git stash drop

git stash show -pअंतिम सहेजे गए स्‍टैश के पैच को दिखाएगा। git applyइसे लागू करेंगे। मर्ज किए जाने के बाद, मर्ज किए गए स्टैश को गिराया जा सकता है git stash drop


1
इसके लिए धन्यवाद - मुझे नहीं पता कि git stash popयह उन मामलों में क्यों नहीं होता है जहां मर्ज साफ-साफ लागू होता है ...
Iguananaut

विस्तारित संस्करण: git stash show -p --no-color | git apply --3way( --3wayयदि पैच विफल रहता है तो 3-तरफ़ा मर्ज पर वापस जाएं)।
दिमित्रीसंडालोव

लेकिन स्टैक्ड सामग्री और कमिट बैक के बीचgit stash show -p एक अंतर बनाता है जब स्टैश एंट्री पहली बार बनाई गई थी । इसलिए यह कार्यशील फ़ाइल को ओवर-ओपी किए गए परिवर्तनों को अधिलेखित कर देगा।
पॉल एफ। वुड

ओवरराइट क्यों? के साथ उत्पादित अंतर git stash show -pद्वारा विलय कर दिया जाएगा git apply, अगर यह बिना संघर्ष के करना संभव है।
ks1322

1

जिस तरह से मैं git addयह पहले यह करने के लिए है git stash apply <stash code>। यह सबसे सरल तरीका है।


3
यह tl की एक सटीक प्रतिलिपि कैसे नहीं है?
रोमेनवेलरी

0

जैसा कि @Brandan द्वारा सुझाया गया है, यहाँ है कि मुझे आसपास जाने के लिए क्या करना चाहिए

error: Your local changes to the following files would be overwritten by merge:
       file.txt
Please, commit your changes or stash them before you can merge.
Aborting

इस प्रक्रिया का पालन करें:

git status  # local changes to `file`
git stash list  # further changes to `file` we want to merge
git commit -m "WIP" file
git stash pop
git commit -m "WIP2" file
git rebase -i HEAD^^  # I always use interactive rebase -- I'm sure you could do this in a single command with the simplicity of this process -- basically squash HEAD into HEAD^
# mark the second commit to squash into the first using your EDITOR
git reset HEAD^

और आप आगे काम / सफाई करने या एक ही अच्छा काम करने के लिए तैयार होने के लिए पूरी तरह से विलय स्थानीय परिवर्तनों के साथ छोड़ दिए जाएंगे file। या, यदि आप जानते हैं कि विलीन की गई सामग्री fileसही है, तो आप एक फिटिंग संदेश लिख सकते हैं और छोड़ सकते हैं git reset HEAD^


0

हो सकता है, यह (difftool के माध्यम से) विलय करने के लिए सबसे बुरा विचार नहीं है ... हाँ ... एक शाखा!

> current_branch=$(git status | head -n1 | cut -d' ' -f3)
> stash_branch="$current_branch-stash-$(date +%yy%mm%dd-%Hh%M)"
> git stash branch $stash_branch
> git checkout $current_branch
> git difftool $stash_branch

0

आप आसानी से कर सकते हैं

  1. अपने वर्तमान परिवर्तन करें
  2. अपने संघर्ष को रोकें और संघर्षों को हल करें
  3. स्टैश से बदलाव करें
  4. आपके द्वारा आने के लिए नरम रीसेट

-1

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

कैसे करें: https://stackoverflow.com/a/9658688/32453


यह एक भिन्न को लागू करने की समस्या को दो भिन्न को लागू करने की समस्या में बदल देता है। इसके अतिरिक्त, स्वीकृत समाधान में एक कमिट नहीं है, बस एक चरण है, और यह केवल एक कमांड (git ऐड) है। (मैं downvoter नहीं हूँ।)
इके

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