Ho una scorta con un nome errato. Vorrei correggere il nome in modo che sia accurato.
Come posso rinominare una scorta?
Ho una scorta con un nome errato. Vorrei correggere il nome in modo che sia accurato.
Come posso rinominare una scorta?
Risposte:
Supponiamo che la tua lista di oggetti sia simile a questa:
$ git stash list
stash@{0}: WIP on master: Add some very important feature
stash@{1}: WIP on master: Fix some silly bug
Innanzitutto, è necessario rimuovere la voce stash che si desidera rinominare:
$ git stash drop stash@{1}
Dropped stash@{1} (af8fdeee49a03d1b4609f294635e7f0d622e03db)
Ora aggiungilo di nuovo con un nuovo messaggio usando sha of commit restituito dopo averlo lasciato cadere:
$ git stash store -m "Very descriptive message" af8fdeee49a03d1b4609f294635e7f0d622e03db
E questo è tutto:
$ git stash list
stash@{0}: Very descriptive message
stash@{1}: WIP on master: Add some very important feature
Questa soluzione richiede git 1.8.4 o successive, e sì, funziona anche con directory di lavoro sporche.
git show stash@{0}
mostra ancora le vecchie informazioni in seguito. Come risolverlo? (Si noti che la scorta ha quindi un SHA diverso.)
git show
e iniziare git stash store
. Quindi con git stash list
te vedrai la vecchia e la nuova scorta. Finalmente puoi ripulire la vecchia scorta con git stash drop
.
git gc
viene eseguito. Dopo stash drop
puoi facilmente trovare questo commit normalmente inaccessibile usando il git fsck | grep commit
comando.
A meno che tu non lo faccia manualmente o contribuisca a migliorare Git, puoi usare un alias:
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}; }; _'
Utilizzo: " git stash-rename <stash> [save options] [<message>]
"
Con [save options]
qualsiasi opzione di git stash save
:[-p|--patch] [-k|--[no-]keep-index] [-q|--quiet] [-u|--include-untracked] [-a|--all]
Esempio:
$ 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
Funzionerà anche se hai modifiche locali non in scena :)
Script semplificato, crediti a 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; }; _'
Utilizzo: " git stash-rename <stash> [<message>]
"
git stash-rename 'tests with deployAtEnd' 'NXP-13971-deployAtEnd'
stash@{0}
riferimento. 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 }; _'
È molto semplice. Innanzitutto, annulla l'ultima scorta con:
git stash pop
Successivamente, puoi salvare lo stash con un nome personalizzato in questo modo:
git stash save "your explanatory name"
Spero sia utile per te. :)
Non credo sia possibile farlo. C'è stata una proposta per rinominare lo stash, ma non è stata ancora implementata.
La mia idea generale è:
Implementare un nuovo
git reflog update
comando che aggiorna il messaggio associato a una voce di reflog specifica. Per fare ciò, una nuovaupdate_reflog_ent()
funzione (in reflog.c ) cambierebbe il messaggio associato alla voce reflog specifica da aggiornare. Unaupdate_reflog()
funzione userebbefor_each_reflog_ent()
conupdate_reflog_ent
per fare effettivamente il cambiamento.Un
git stash rename
comando dovrebbe quindi solo chiamaregit reflog update
con il riferimento appropriato e il nuovo messaggio.
Oppure potresti, ovviamente, aprire la scorta e fare un git stash save [message]
A beneficio del lettore, ecco un'estensione della risposta attualmente accettata e corretta .
Se non si desidera solo correggere il messaggio stash e si desidera anche correggere il messaggio di commit dello stash, tale
git stash list
e
git log --oneline -1 stash
entrambi sono d'accordo su ciò che viene mostrato, è necessario un po 'di più. Ci potrebbe essere un modo migliore per farlo, ma spero che questa ricetta sia facile da capire.
Per poterlo fare git commit --amend
devi essere sulla PUNTA di un ramo. Quindi la soluzione è:
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
Ha spiegato:
git commit --amend
per sostituire il messaggio di commit, questo cambia lo SHA dello "stash in questione"svantaggi:
Questo cambia temporaneamente i rami. Quindi questa ricetta può essere applicata solo quando git status --porcelain
è pulita (leggi: non produce nulla)
Rinomina gli stash, quindi lo stash modificato diventa stash@{0}
È necessario inserire il $MESSAGE
due volte o utilizzare qualche variabile d'ambiente (nell'esempio: MESSAGE
)
Devi trovare un nome di ramo inutilizzato
Ci sono modi per farlo senza cambiare ramo, ma questo va oltre lo scopo di questa risposta.
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
Produzione
*-. 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
Ora senza modificare il commit (nota: lo SHA di seguito sarà diverso al tuo fianco):
git stash drop stash@{1}
git stash store -m ...changed... 2fbf9007dfdfb95ae269a19e13b8b9ca3e24181c
git log --oneline --graph --decorate --all; git stash list
Produzione
*-. 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
Come puoi vedere, stash@{0}
viene ancora mostrato come 2fbf900 (refs/stash) WIP on master: 8bdcc32 D
in git log
. Se osservi attentamente, vedrai che diversi commit hanno cambiato SHA. Ciò è dovuto alla gestione degli stash (i genitori sono inclusi nello SHA e gli stash hanno i loro stash come genitore).
Risolvi che:
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
Produzione
*-. 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
Come puoi vedere, anche refs/stash
SHA è cambiato.
Ecco una versione modificata dell'alias di Julien che ti consente di gestire correttamente il On <branch>
prefisso solitamente anteposto ai nomi di stash:
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; }; _'
Sintassi:
git stash-rename <new-name> [<stash> [<new-branch-name> | .]]
Esempio di utilizzo:
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
La maggior parte del comando serve per analizzare gli argomenti e capire cosa si dovrebbe fare per il nome del ramo. Gli git
strumenti utilizzati sono i seguenti:
git rev-parse <stash>
per trovare lo SHA della scorta.git stash list --format=%gs -1 <stash>
per trovare l' oggetto reflog della scorta. Si noti che questo è diverso dal messaggio di commit dello stash, che non viene modificato da questo comando. L'oggetto reflog è ciò che appare git stash list
e puoi cambiare l'oggetto reflog senza cambiare gli hash dei commit associati agli stash. Tuttavia, puoi sempre trovare il messaggio di commit originale, quindi non utilizzare git stash-rename
per rimuovere informazioni riservate!git stash drop <stash>
per eliminare il vecchio riferimento alla scorta (ma abbiamo ancora lo SHA, quindi non è perso).git stash store -m <new-message> <sha>
per salvare un nuovo riferimento allo stash con le stesse informazioni di commit ma un oggetto reflog diverso .git stash list
per elencare gli stash al termine dell'operazione. Si noti che i nuovi blocchi vengono sempre spinti all'inizio dell'elenco. Sarebbe necessario ripremere tutti gli stash prima dello stash di interesse per ripristinare la sua posizione originale.Il modo più semplice: fai scoppiare la tua scorta con git stash pop quindi salvala di nuovo con git stash salva il tuo nome