我有一堆名字不正确的东西。我想修改一下名字,让它更准确。
我如何重命名收藏?
我有一堆名字不正确的东西。我想修改一下名字,让它更准确。
我如何重命名收藏?
当前回答
让我们假设你的收藏清单是这样的:
$ 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或更高版本,是的,它也适用于脏工作目录。
其他回答
我认为这是不可能的。有一个关于存储重命名的提议,但是还没有实现。
我的大意是: 实现一个新的git reflog update命令,更新与特定reflog条目关联的消息。为此,一个新的update_reflog_ent()函数(在reflog.c中)会将与特定reflog条目相关的消息更改为update。update_reflogg()函数将使用for_each_reflog_ent()和update_reflog_ent来实际执行更改。 git stash rename命令只需要使用适当的ref和new消息调用git reflog update。
当然,你也可以弹出隐藏,并做一个git隐藏保存[消息]
为了读者的利益,这里是对目前公认的正确答案的扩展。
如果您不仅想更正存储消息,还想更正存储的提交消息,例如
git stash list
and
git log --oneline -1 stash
双方都同意所展示的内容,你需要更多一点。也许有更好的方法,但我希望这个食谱很容易理解。
为了能够做git提交-修改,你需要在一个分支的尖端。因此,解决方案是:
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来替换提交消息,这将改变“问题中的stash”的SHA 根据qzb的回答,把钱存起来 切换回去(假设你来自“master”)和清理
缺点:
这会临时切换分支。所以这个配方只能应用于git状态-瓷器是干净的(阅读:不输出任何东西) 它重新编号存储,因此更改后的存储变成了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
现在不改变commit(注意:下面的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
正如你所看到的,在git日志中,stash@{0}仍然显示为master: 8bdcc32 D上的2fbf900 (refs/stash) WIP。如果仔细观察,就会发现有几个提交更改了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。
除非你手动操作或对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 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)。