我怎样才能重命名一个混帐藏匿?
我藏了一个不正确的名字。 我想修正这个名字,所以它是准确的。
我怎样才能重新命名一个藏匿处?
假设你的存储列表如下所示:
$ 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) 
现在只需使用下面的返回提交sha再次添加新消息:
 $ 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 
这个解决scheme需要git 1.8.4或更高版本,是的,它也适用于脏工作目录。
除非手动执行或者对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任何选项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 
这将工作,即使你有本地unstaged改变:)
编辑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>] ” 
我认为这是不可能的。 有一个提议重新命名,但还没有实施。
我的一般想法是:
实现一个新的
git reflog update命令,更新与特定的reflog条目相关的消息。 要做到这一点,一个新的update_reflog_ent()函数(在reflog.c中 )将更改与特定reflog条目相关联的消息进行更新。update_reflog()函数将使用for_each_reflog_ent()和update_reflog_ent来实际执行更改。
一个
git stash rename命令只需要用适当的ref和new消息来调用git reflog update。
 或者你可以,当然,popup藏匿,并做一个git stash save [message] 
为了读者的利益,这里是对当前被接受和正确答案的扩展 。
如果您不仅想要更正存储消息,还想更正存储的提交消息,例如
 git stash list 
和
 git log --oneline -1 stash 
都同意显示,你需要多一点。 可能有更好的方法来做到这一点,但这里的配方很容易理解,我希望。
 为了能够做git commit --amend你需要在分支的TIP上。 因此解决scheme是: 
 git checkout -b scratch stash@{1} git stash drop stash@{1} git commit --amend -m "$MESSAGE" git stash save -m "$MESSAGE" HEAD git checkout master git branch -D scratch 
解释:
- 从“隐藏问题”中创build一个新的(不存在的)“scratch”分支并切换到该分支
- 删除旧的藏匿处。 这是安全的,因为我们在分支上仍然有这个。
-  使用git commit --amendreplace提交消息,这改变了“隐藏问题”的SHA
- 根据qzb的回答保存存储
- 切换回(假设你来自“主”)和清理
缺点:
- 
这会暂时切换分支。 所以这个配方只能适用于 git status --porcelainclean(读取:不输出任何内容)
- 
它重新编号的存储,所以改变的藏匿变成 stash@{0}
- 
您需要input $MESSAGE两次或使用一些环境variables(例如:MESSAGE)
- 
你需要find一个未使用的分支名称 
有些方法可以在不切换分支的情况下做到这一点,但这超出了这个答案的范围。
例
 git init scratch cd scratch for a in ABCD; do date >$a; git add $a; git commit -m $a; done for a in XY; 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。 这是由于如何处理藏匿(父母被包括在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。 
 这里是朱利安别名的修改版本,可以让你正确地处理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 
 大部分的命令是用来parsing参数并确定分支名称应该做什么。 使用的git工具如下: 
-   git rev-parse <stash>findgit rev-parse <stash>的SHA。
-   git stash list --format=%gs -1 <stash>来查找git stash list --format=%gs -1 <stash>的reflog主题 。 请注意,这与存储的提交消息不同,不会被此命令更改。 reflog主题是在git stash list,您可以更改reflog主题,而不更改与存储相关联的提交的散列。 但是,你总是可以find原始的提交信息,所以不要使用git stash-rename去除敏感信息!
-   git stash drop <stash>将旧的引用放到存储器中(但是我们仍然有SHA,所以不会丢失)。
-   git stash store -m <new-message> <sha>使用相同的提交信息保存对git stash store -m <new-message> <sha>的新引用 ,但使用不同的引用日志主题 。
-   git stash list以列出操作完成后的git stash list。 请注意,新的窗口始终被推到列表的开头。 为了恢复原来的位置,有必要把所有的藏品重新推到藏匿的地方。
最简单的方法:用git存储stream行音乐,然后用git存储你的名字