我有一堆名字不正确的东西。我想修改一下名字,让它更准确。

我如何重命名收藏?


当前回答

除非你手动操作或对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>[保存选项][<消息>]"

使用[保存选项]任何git保存选项:[-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

这将工作,即使你有本地的非阶段性变化:)

编辑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>[<消息>]"

其他回答

这很简单。首先,撤销最后的藏匿与:

git stash pop

在这之后,你可以保存一个自定义的名称,以这种方式:

git stash save "your explanatory name"

希望对大家有用。:)

多年后,我回答了自己的问题:这是刚刚宣布的,所以我想我应该在这里加上它。

许多GUI git客户端(例如,Fork 1.58和更新版本)现在支持直接重命名存储。

让我们假设你的收藏清单是这样的:

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

首先,你必须删除你想重命名的stash条目:

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

现在只需在删除后使用sha的commit返回的新消息再次添加它:

$ 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

这个解决方案需要git 1.8.4或更高版本,是的,它也适用于脏工作目录。

qzb的回答中描述的git stash store-方法只在两个地方之一更新了stash消息,导致许多git前端仍然显示旧消息。但是,可以创建一个提交,复制原始存储提交中的所有内容,但更改其消息。

Find the hashes for the stash commit's tree and parents: $ git show -s --pretty=raw stash@{0} commit f2adfc7bbebe852693ad8f6ac889e4923230c872 tree 8160d88c6e00e90fcfa183e09d2563f3cdfb304b parent a013bd8052d3260fbc95608ed69d0b9cfa0c77cb parent 5d5eb80dc03bea8ff2bdd38962a1259b7725d169 author ... committer ... Test stash Create a new commit with the same tree and parents but a different message: $ git commit-tree 8160d88c6e00e90fcfa183e09d2563f3cdfb304b \ -p a013bd8052d3260fbc95608ed69d0b9cfa0c77cb \ -p 5d5eb80dc03bea8ff2bdd38962a1259b7725d169 \ -m "Renamed stash" f2adfc7bbebe852693ad8f6ac889e4923230c872 Store this commit as a new stash $ git stash store \ -m "$(git show -s --format=%B f2adfc7bbebe852693ad8f6ac889e4923230c872)" \ f2adfc7bbebe852693ad8f6ac889e4923230c872

新的stash消息需要同时提供给git-commit-tree和git-stash-store,因为git将其存储在两个地方(commit和logs/refs/stash)。

注意,使用——keep-index创建的存储将有3个父节点,因此在这种情况下,您需要为git-commit-tree提供第三个父节点!

将此过程转换为一行程序以在git别名中使用将留给读者作为练习;-)。确保只使用管道命令(因此避免使用git-show和git-log)。

最简单的方法:弹出你的stash与git stash流行,然后保存它再次与git stash保存你的名字