我怎样才能重命名一个混帐藏匿?

我藏了一个不正确的名字。 我想修正这个名字,所以它是准确的。

我怎样才能重新命名一个藏匿处?

假设你的存储列表如下所示:

$ 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>]

我认为这是不可能的。 有一个提议重新命名,但还没有实施。

我的一般想法是:

  1. 实现一个新的git reflog update命令,更新与特定的reflog条目相关的消息。 要做到这一点,一个新的update_reflog_ent()函数(在reflog.c中 )将更改与特定reflog条目相关联的消息进行更新。 update_reflog()函数将使用for_each_reflog_ent()update_reflog_ent来实际执行更改。

  2. 一个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 --porcelain clean(读取:不输出任何内容)

  • 它重新编号的存储,所以改变的藏匿变成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 Dgit 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存储你的名字