मैं एक गट स्टैश का नाम कैसे बदल सकता हूं?


202

मेरे पास एक गलत नाम के साथ एक स्टैश है। मैं नाम ठीक करना चाहूंगा, इसलिए यह सही है।

मैं एक स्लैश का नाम कैसे बदल सकता हूं?


5
इसे पॉप करें और इसे फिर से एक अलग नाम से सहेजें?
बार्ट्लोमिएज लेवांडोव्स्की

5
पॉपिंग और स्टैशिंग फिर से हमेशा एक विकल्प नहीं होता है, क्योंकि स्टैप पुरानी अवस्था पर आधारित हो सकता है और परिणामस्वरूप पॉपिंग करते समय टकराव हो सकता है। (पुराना राज्य अब इतिहास में कहीं भी मौजूद नहीं है।)
टॉम

जवाबों:


258

आइए मान लें कि आपकी स्‍टैश सूची इस प्रकार है:

$ git stash list
stash@{0}: WIP on master: Add some very important feature 
stash@{1}: WIP on master: Fix some silly bug

सबसे पहले, आपको स्टैश प्रविष्टि को हटाना होगा जिसे आप नाम बदलना चाहते हैं:

$ git stash drop stash@{1}
Dropped stash@{1} (af8fdeee49a03d1b4609f294635e7f0d622e03db)

अब बस इसे फिर से जोड़कर नए संदेश के साथ छोड़ दें।

$ git stash store -m "Very descriptive message" af8fdeee49a03d1b4609f294635e7f0d622e03db

और बस:

$ git stash list
stash@{0}: Very descriptive message
stash@{1}: WIP on master: Add some very important feature

इस समाधान के लिए 1.8.4 या उसके बाद के संस्करण की आवश्यकता होती है, और हां, यह गंदे काम करने वाली निर्देशिका के साथ भी काम करता है।


3
git show stash@{0}अभी भी पुरानी जानकारी को बाद में दिखाता है। उसे कैसे ठीक करें? (कृपया ध्यान दें कि स्टैश फिर एक अलग SHA प्राप्त करता है।)
Tino

4
यह हैश के साथ git showशुरू करने और शुरू करने के लिए बेहतर लगता है git stash store। फिर git stash listआप के साथ पुराने और नए टकराव देखेंगे। अंत में आप के साथ पुराने टकराव को साफ कर सकते हैं git stash drop
होगि

6
जीआईटी स्टैश ड्रॉप बदलाव नहीं खोएगा?
श्रवण बोग्गरपु जू

4
@ श्रवणबोगापारु, नहीं, जीआईटी कमिट नहीं किया git gcजाता है जब तक चलाया नहीं जाता है। आदेश stash dropका उपयोग करने के बाद आप इसे आसानी से दुर्गम प्रतिबद्ध पा सकते हैं git fsck | grep commit
qzb

2
@ Aner easyndi बस आवेदन करना और बचत करना एक आसान विकल्प है, लेकिन जब टकरावों के कारण परिवर्तन फिर से लागू नहीं किए जा सकते हैं तो यह काम नहीं करता है। इस बीच किसी भी परिस्थिति में गिरना और भंडारण करना काम करता है। मैंने एक बार फिर अपने समाधान का परीक्षण किया है - यह नवीनतम गिट संस्करण (2.17.0) पर ठीक काम करता है।
qzb

62

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

git config --global alias.stash-rename '!_() { rev=$(git rev-parse $1) && git stash drop $1 || exit 1 ; git diff-index --quiet HEAD; s=$?; [ $s != 0 ] && git stash save "tmp stash from stash-rename"; git stash apply $rev && shift && git stash save "$@" && [ $s != 0 ] && git stash pop stash@{1}; }; _'

उपयोग: " git stash-rename <stash> [save options] [<message>]"

साथ [save options]के किसी भी विकल्प git stash save:[-p|--patch] [-k|--[no-]keep-index] [-q|--quiet] [-u|--include-untracked] [-a|--all]

उदाहरण:

$ git stash list
stash@{0}: On master: Pep8 format
stash@{1}: On master: co other than master with local changes
stash@{2}: On master: tests with deployAtEnd

# Let's say I want to rename the stash@{2} adding an issue reference:
$ git stash-rename stash@{2} NXP-13971-deployAtEnd

$ git stash list
stash@{0}: On master: NXP-13971-deployAtEnd
stash@{1}: On master: Pep8 format
stash@{2}: On master: co other than master with local changes

अगर आपके पास स्थानीय अस्थिर परिवर्तन हैं तो भी यह काम करेगा :)

EDIT 2016/02/22

सरलीकृत स्क्रिप्ट, श्रेय qzb को , https://stackoverflow.com/a/35549615/515973

git config --global alias.stash-rename '!_() { rev=$(git rev-parse $1) && git stash drop $1 || exit 1 ; git stash store -m "$2" $rev; }; _'

उपयोग: " git stash-rename <stash> [<message>]"


1
बहुत बढ़िया! यहां तक ​​कि अगर आप कर सकते हैं कूलरgit stash-rename 'tests with deployAtEnd' 'NXP-13971-deployAtEnd'
mikemaccana

3
इसलिए उत्तर 1) क्लीन वर्किंग कॉपी, 2) आप जिस नाम को बदलना चाहते हैं, उसे लागू करें, 3) इसे स्टैश लिस्ट से हटा दें, 4) सही संदेश के साथ एक नया स्टैश बनाएं।
gcb

2
स्पष्ट करने के लिए, आप अंतिम स्लैश का नाम बदल रहे हैं, और इस तरह की कार्रवाई के बाद यह शीर्ष स्लैश बन जाता है?
वनबरी

2
मैं नाम बदलने के लिए स्टैश को हटा देता हूं, यदि कोई है तो वर्तमान परिवर्तनों को सहेज सकता है, हटाए गए स्टैश को फिर से वांछित नाम के साथ पुन: प्रकाशित करता है, वर्तमान परिवर्तनों को किसी भी रूप में पुन: लागू करता है।
जुलिएन कार्सिक

3
यह संस्करण यह सुनिश्चित करने के लिए जाँच करता है कि दोनों तर्क हैं इसलिए यह गलती से आपके अंतिम स्लैश को नहीं गिराता है। इसमें केवल स्टैश नंबर की आवश्यकता होती है, न कि पूरे stash@{0}संदर्भ की। gist.github.com/jdforsythe/f248bf6c72fc020225cc3e315a32e922 git config --global alias.stash-rename '!_() { if [ -z \"$1\" ] || [ -z \"$2\" ]; then echo \"git stash-rename 0 NewName\" && echo \"\" && git stash list && exit 1; else stash=\"stash@{$1}\"; rev=$(git rev-parse \"${stash}\"); git stash drop \"${stash}\" || exit 1; git stash store -m \"$2\" \"$rev\" || exit 1; git stash list; fi }; _'
jdforsythe

6

यह बहुत सरल है। सबसे पहले, अंतिम चरण को पूर्ववत करें:

git stash pop

इसके बाद, यो इस तरह से एक स्वनिर्धारित नाम के साथ स्टैश बचा सकता है:

git stash save "your explanatory name"

मुझे आशा है कि यह आपके लिए उपयोगी है। :)


हो सकता है कि नामांकित स्लैश सबसे हाल का न हो।
मिकमेकाना

सबसे हाल ही की कड़ी के लिए यह अधिक सीधा (केवल) के बाद से अंगूठे।
कायह

3

मुझे नहीं लगता कि ऐसा करना संभव है। हुई है गुप्त कोष में नाम के लिए एक प्रस्ताव, लेकिन यह अभी तक लागू नहीं किया गया।

मेरा सामान्य विचार है:

  1. एक नया git reflog updateआदेश लागू करें जो एक विशिष्ट रीफ़्लो प्रविष्टि से जुड़े संदेश को अपडेट करता है। ऐसा करने के लिए, एक नया update_reflog_ent()फ़ंक्शन ( reflog.c में ) अद्यतन करने के लिए विशिष्ट रिफ्लॉग प्रविष्टि से जुड़े संदेश को बदल देगा। एक update_reflog()समारोह का प्रयोग करेंगे for_each_reflog_ent()के साथ update_reflog_entवास्तव में परिवर्तन करने के लिए।

  2. एक git stash renameकमांड को तब केवल git reflog updateउचित रेफरी और नए संदेश के साथ कॉल करने की आवश्यकता होगी ।

या, आप, निश्चित रूप से, स्टैश पॉप कर सकते हैं और ए git stash save [message]


3

पाठक के लाभ के लिए, यहाँ वर्तमान में स्वीकृत और सही उत्तर का विस्तार है

अगर आप न केवल स्टैश मैसेज को सही करना चाहते हैं और स्टैश के कमिट मैसेज को भी सही करना चाहते हैं, जैसे कि

git stash list

तथा

git log --oneline -1 stash

दोनों जो दिखाया गया है उससे सहमत हैं, आपको थोड़ा और चाहिए। ऐसा करने का एक बेहतर तरीका हो सकता है, लेकिन यहां यह नुस्खा समझना आसान है, मुझे उम्मीद है।

करने में सक्षम होने के लिए git commit --amendआपको एक शाखा के टीआईपी पर होना चाहिए। इसलिए समाधान है:

git checkout -b scratch stash@{1}
git stash drop stash@{1}
git commit --amend -m "$MESSAGE"
git stash store -m "$MESSAGE" HEAD
git checkout master
git branch -D scratch

व्याख्या की:

  • एक नई (अभी तक मौजूद नहीं) "स्क्रैच" शाखा को "स्टैश इन क्वेश्चन" से बनाएं और उसमें स्विच करें
  • पुराने कलश को हटा दें। यह सुरक्षित है, क्योंकि हमारे पास अभी भी यह शाखा पर है।
  • git commit --amendसंदेश को बदलने के लिए उपयोग करें , यह "प्रश्न में टकराव" के SHA को बदल देता है
  • क़ज़ाब के जवाब के आधार पर, स्टोर करें
  • स्विच वापस (जो मानता है कि आप "मास्टर" से आए थे) और सफाई करें

कमियां:

  • यह शाखाओं को अस्थायी रूप से बदल देता है। तो यह नुस्खा केवल तभी लागू किया जा सकता है जब git status --porcelainवह साफ हो (पढ़ें: कुछ भी आउटपुट नहीं करता है)

  • यह लकीरों को फिर से भर देता है, इसलिए बदली हुई लकीर बन जाती है stash@{0}

  • आप दर्ज करने की आवश्यकता $MESSAGEदो बार या कुछ वातावरण चर का उपयोग (उदाहरण में: MESSAGE)

  • आपको अप्रयुक्त शाखा का नाम खोजने की आवश्यकता है

शाखाओं को स्विच किए बिना ऐसा करने के तरीके हैं, लेकिन यह इस उत्तर के दायरे से परे है।

उदाहरण

git init scratch
cd scratch
for a in A B C D; do date >$a; git add $a; git commit -m $a; done
for a in X Y; do echo $a > Z; git stash save --all; done
git log --oneline --graph --decorate --all; git stash list

उत्पादन

*-.   e0e281b (refs/stash) WIP on master: 8bdcc32 D
|\ \  
| | * 4d62f52 untracked files on master: 8bdcc32 D
| * 096f158 index on master: 8bdcc32 D
|/  
* 8bdcc32 (HEAD, master) D
* c84c659 C
* 49bb2da B
* b1852c6 A
stash@{0}: WIP on master: 8bdcc32 D
stash@{1}: WIP on master: 8bdcc32 D

अब बदलाव किए बिना (नोट: निम्नलिखित में SHA आपके पक्ष में अलग होगा):

git stash drop stash@{1}
git stash store -m ...changed... 2fbf9007dfdfb95ae269a19e13b8b9ca3e24181c
git log --oneline --graph --decorate --all; git stash list

उत्पादन

*-.   2fbf900 (refs/stash) WIP on master: 8bdcc32 D
|\ \  
| | * 246dc5c untracked files on master: 8bdcc32 D
| * 80c5ea0 index on master: 8bdcc32 D
|/  
* 8bdcc32 (HEAD, master) D
* c84c659 C
* 49bb2da B
* b1852c6 A
stash@{0}: ...changed...
stash@{1}: WIP on master: 8bdcc32 D

जैसा कि आप देख सकते हैं, stash@{0}अभी भी के रूप 2fbf900 (refs/stash) WIP on master: 8bdcc32 Dमें दिखाया गया है git log। अगर आप ध्यान से देखेंगे, तो आप देखेंगे कि कई कमिटियों ने SHA को बदल दिया है। यह इस कारण से होता है कि स्टैड्स को कैसे संभाला जाता है (माता-पिता एसएचए में शामिल होते हैं, और स्टैड्स के माता-पिता के रूप में स्टैड्स होते हैं)।

उसे फिक्स करें:

git checkout -b scratch stash
git stash drop
git commit --amend -m ...changed...
git stash store -m ...changed... HEAD
git checkout master
git branch -D scratch
git log --oneline --graph --decorate --all; git stash list

उत्पादन

*-.   4d55186 (refs/stash) ...changed...
|\ \  
| | * 246dc5c untracked files on master: 8bdcc32 D
| * 80c5ea0 index on master: 8bdcc32 D
|/  
* 8bdcc32 (HEAD, master) D
* c84c659 C
* 49bb2da B
* b1852c6 A
stash@{0}: ...changed...
stash@{1}: WIP on master: 8bdcc32 D

जैसा कि आप भी देख सकते हैं, refs/stashएक परिवर्तित SHA है, भी।


वर्थ उल्लेख: यह उस इंडेक्स को नष्ट कर देता है, जिसे मूल स्लैश के साथ सहेजा गया था, इसे एक नए इंडेक्स के साथ बदल दिया गया है जो मूल स्टैश की मूल प्रतिबद्धता से मेल खाता है। यदि कोई मूल सहेजे गए इंडेक्स का उपयोग करने की योजना नहीं बना रहा था (या यह पहले से ही मूल मूल के माता-पिता से मेल खाता है), तो यह कोई समस्या नहीं है।
तायार्क

1

यहां जुलिएन के उपनाम का एक संशोधित संस्करण है जो आपको On <branch>उपसर्ग के साथ ठीक से निपटने की अनुमति देता है जो आमतौर पर नामों को छिपाने के लिए तैयार होता है:

git config --global alias.stash-rename '!_() { newmsg="$1" && stash=${2:-"stash@{0}"} && newbranch="$3" && sha=$(git rev-parse "$stash") && olddesc="$(git stash list --format=%gs -1 "$stash")" && newdesc="$(if [[ "$newbranch" = "." ]]; then echo "$newmsg"; else if [[ -n "$newbranch" ]]; then echo "On $newbranch: $newmsg"; else if [[ "$olddesc" =~ ":" ]]; then echo "$(echo "$olddesc" | cut -f1 -d":"): $newmsg"; else echo "$newmsg"; fi; fi; fi)" && git stash drop "$stash" > /dev/null || exit 1; git stash store -m "$newdesc" "$sha" && git stash list; }; _'

वाक्य - विन्यास:

git stash-rename <new-name> [<stash> [<new-branch-name> | .]]

उदाहरण का उपयोग:

repo[master] % touch tmp && git add tmp && git stash save first
Saved working directory and index state On master: first
HEAD is now at bd62064 Initial commit
repo[master] % touch tmp && git add tmp && git stash save second
Saved working directory and index state On master: second
HEAD is now at bd62064 Initial commit
repo[master] % git stash list
stash@{0}: On master: second
stash@{1}: On master: first
repo[master] % git stash-rename renamed
stash@{0}: On master: renamed
stash@{1}: On master: first
repo[master] % git stash-rename also-renamed stash@{1}
stash@{0}: On master: also-renamed
stash@{1}: On master: renamed
repo[master] % git stash-rename branch-changed stash@{0} new-branch
stash@{0}: On new-branch: branch-changed
stash@{1}: On master: renamed
repo[master] % git stash-rename branch-name-persists
stash@{0}: On new-branch: branch-name-persists
stash@{1}: On master: renamed
repo[master] % git stash-rename no-branch stash@{0} .
stash@{0}: no-branch
stash@{1}: On master: renamed
repo[master] % git stash-rename renamed
stash@{0}: renamed
stash@{1}: On master: renamed
repo[master] % git stash-rename readd-branch stash@{0} develop
stash@{0}: On develop: readd-branch
stash@{1}: On master: renamed

अधिकांश कमांड तर्कों को पार्स करने और यह पता लगाने के लिए है कि शाखा के नाम का क्या किया जाना चाहिए। gitइस्तेमाल किया उपकरण इस प्रकार हैं:

  • git rev-parse <stash> छिपाने की जगह का SHA खोजने के लिए।
  • git stash list --format=%gs -1 <stash>छिपाने की जगह के विषय को खोजने के लिए । ध्यान दें कि यह स्टैश के प्रतिबद्ध संदेश से अलग है , जिसे इस कमांड द्वारा नहीं बदला गया है। रिफ्लेग विषय वह है जो दिखाता है git stash listऔर आप स्टैग से जुड़े कमिट्स की हैश को बदले बिना रिफ्लॉग विषय को बदल सकते हैं। हालाँकि, आप हमेशा मूल संदेश प्राप्त कर सकते हैं, इसलिए git stash-renameसंवेदनशील जानकारी निकालने के लिए उपयोग न करें !
  • git stash drop <stash>पुराने संदर्भ को रोकने के लिए (लेकिन हमारे पास अभी भी SHA है, इसलिए यह नहीं खोया है)।
  • git stash store -m <new-message> <sha> एक नया बचाने के लिए ही प्रतिबद्ध जानकारी के साथ एक अलग संदर्भ पर चर्चा संदर्भ लिए ।
  • git stash listऑपरेशन समाप्त होने के बाद स्टैल्स को सूचीबद्ध करना। ध्यान दें कि नए स्टैम्स को हमेशा सूची की शुरुआत में धकेल दिया जाता है। अपनी मूल स्थिति को बहाल करने के लिए ब्याज की रोक से पहले सभी बाधाओं को फिर से धक्का देना आवश्यक होगा ।

0

सबसे आसान तरीका: अपने स्टैश को git stash पॉप के साथ पॉप करें और फिर इसे git stash के साथ सेव करके अपना नाम सेव करें


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