我怎样才能重命名git藏匿?

mik*_*ana 174 git git-stash

我有一个名字不正确的藏匿处.我想修改名称,以便准确.

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

qzb*_*qzb 225

我们假设您的存储列表如下所示:

$ git stash list
stash@{0}: WIP on master: Add some very important feature 
stash@{1}: WIP on master: Fix some silly bug
Run Code Online (Sandbox Code Playgroud)

首先,您必须删除要重命名的存储条目:

$ git stash drop stash@{1}
Dropped stash@{1} (af8fdeee49a03d1b4609f294635e7f0d622e03db)
Run Code Online (Sandbox Code Playgroud)

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

$ git stash store -m "Very descriptive message" af8fdeee49a03d1b4609f294635e7f0d622e03db
Run Code Online (Sandbox Code Playgroud)

就是这样:

$ git stash list
stash@{0}: Very descriptive message
stash@{1}: WIP on master: Add some very important feature
Run Code Online (Sandbox Code Playgroud)

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

  • 使用`git show`获取哈希值并从`git stash store`开始感觉更好。然后使用`git stash list`,您将看到旧的和新的存储。最后,您可以使用 `git stash drop` 清理旧的 stash。 (11认同)
  • git stash drop会不会失去变化? (4认同)
  • `git show stash @ {0}`之后仍会显示旧信息.如何解决?(请注意,存储会获得不同的SHA.) (3认同)
  • @ShravyaBoggarapu,不,git不会删除提交,直到运行`git gc`.在"stash drop"之后,您可以使用`git fsck |轻松找到这种通常无法访问的提交 grep commit`命令. (3认同)
  • @ÐerÆndi简单地应用和保存是一个简单的选择,但是由于冲突而无法重新应用更改时不起作用.同时在任何情况下丢弃和存储工作.我再一次测试了我的解决方案 - 它在最新的git版本(2.17.0)上运行得很好. (2认同)
  • 我说:“你疯了吗?” 当我读到: `git stash drop stash@{1}` 但它工作得很好!谢谢 :) (2认同)

Jul*_*que 60

除非您手动执行或对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}; }; _'
Run Code Online (Sandbox Code Playgroud)

用法:" git stash-rename <stash> [save options] [<message>]"

[save options]任何选择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
Run Code Online (Sandbox Code Playgroud)

即使您有本地未分阶段的更改,这将工作:)

编辑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; }; _'
Run Code Online (Sandbox Code Playgroud)

用法:" git stash-rename <stash> [<message>]"

  • 此版本会检查以确保两个参数都存在,因此它不会意外地丢弃您的最后一个存储。它还只需要 stash 编号,而不是整个 `stash@{0}` 引用。https://gist.github.com/jdforsythe/f248bf6c72fc020225cc3e315a32e922 `git config --global alias.stash-rename '!_() { if [ -z \"$1\" ] || [ -z \"$2\" ]; 然后 echo \"git stash-rename 0 NewName\" &amp;&amp; echo \"\" &amp;&amp; git stash list &amp;&amp; exit 1; else stash=\"stash@{$1}\"; rev=$(git rev-parse \"${stash}\"); git stash drop \"${stash}\" || 出口1;git stash store -m \"$2\" \"$rev\" || 出口1;git 存储列表;菲 }; _'` (4认同)
  • 所以答案是1)干净的工作副本,2)应用你要重命名的存储,3)从存储列表中删除它,4)用正确的消息创建一个新的存储. (3认同)
  • 惊人的!如果你可以做`git stash-rename 'tests with deployAtEnd' 'NXP-13971-deployAtEnd'` 那就更酷了 (2认同)
  • 为了澄清,你正在重命名最后一个藏匿点,并在这样的行动之后成为最重要的藏匿点? (2认同)
  • 我删除要重命名的存储,保存当前更改(如果有),使用所需名称重新创建已删除的存储,重新应用当前更改(如果有). (2认同)
  • 请小心此版本的脚本(如答案中所示): `git config --global alias.stash-rename '!_() { rev=$(git rev-parse $1) &amp;&amp; git stash drop $1 || 1号出口;git stash store -m "$2" $rev; }; _'`。如果不带参数调用它,它会将存储放在“refs/stash@{0}”处。可以使用“git stash store -m 'descriptive message' hash…here”之类的命令来恢复它,其中哈希是 git 删除存储时显示的哈希。 (2认同)

小智 13

这很简单。首先,使用以下命令撤消最后一次存储:

git stash pop
Run Code Online (Sandbox Code Playgroud)

在此之后,您可以通过这种方式使用自定义名称保存存储:

git stash save "your explanatory name"
Run Code Online (Sandbox Code Playgroud)

我希望它对你有用。:)

  • 重命名的存储可能不是最新的。 (3认同)

Tin*_*ino 6

为了读者的利益,这里是对当前接受的正确答案的扩展

如果您不仅想更正存储消息,还想更正存储的提交消息,这样

git stash list
Run Code Online (Sandbox Code Playgroud)

git log --oneline -1 stash
Run Code Online (Sandbox Code Playgroud)

两者都同意所显示的内容,您还需要更多。可能有更好的方法,但我希望这里的食谱很容易理解。

为了能够做到这一点,git commit --amend您需要在分支机构的 TIP 上。因此解决方案是:

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
Run Code Online (Sandbox Code Playgroud)

解释:

  • 从“有问题的存储”创建一个新的(尚不存在)“临时”分支并切换到它
  • 删除旧的藏匿处。这是安全的,因为我们的分支上仍然有这个。
  • 用于git commit --amend替换提交消息,这会更改“有问题的存储”的 SHA
  • 根据qzb 的答案存储藏品
  • 切换回来(假设你来自“master”)并清理

缺点:

  • 这会暂时切换分支。所以这个配方只能在git status --porcelain干净的情况下应用(阅读:不输出任何内容)

  • 它对存储区重新编号,因此更改后的存储区变为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
Run Code Online (Sandbox Code Playgroud)

输出

*-.   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
Run Code Online (Sandbox Code Playgroud)

现在无需更改提交(注意:下面的 SHA 在您这边会有所不同):

git stash drop stash@{1}
git stash store -m ...changed... 2fbf9007dfdfb95ae269a19e13b8b9ca3e24181c
git log --oneline --graph --decorate --all; git stash list
Run Code Online (Sandbox Code Playgroud)

输出

*-.   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
Run Code Online (Sandbox Code Playgroud)

如您所见,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
Run Code Online (Sandbox Code Playgroud)

输出

*-.   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
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,refs/stashSHA 也发生了变化。


mik*_*ana 5

多年后回答我自己的问题:这刚刚宣布,所以我想将其添加在这里。

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

在此输入图像描述

  • 对于那些想知道的人,[Fork 采用](https://github.com/fork-dev/Tracker/issues/218#issuecomment-756692030) [我的答案](https://stackoverflow.com/a/ 65627640/438249)。 (6认同)