我怎样才能重命名一个混帐藏匿?
我藏了一个不正确的名字。 我想修正这个名字,所以它是准确的。
我怎样才能重新命名一个藏匿处?
假设你的存储列表如下所示:
$ 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 --amend
replace提交消息,这改变了“隐藏问题”的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 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存储你的名字