如何命名和按名称检索Git暂存

如何命名和按名称检索Git暂存

技术背景

在使用Git进行版本控制时,有时我们需要临时保存当前工作目录的修改,而不进行提交。Git暂存(stash)功能提供了这样的能力,允许我们将当前的修改保存起来,之后再恢复。为了更方便地管理和查找暂存,我们可以给暂存命名,并按名称进行检索。

实现步骤

保存带名称的暂存

从Git 2.16版本开始,推荐使用git stash push -m命令来保存带名称的暂存:

1
git stash push -m "my_stash_name"
BASH

在Git 2.16之前,也可以使用git stash save命令(此命令已被弃用):

1
git stash save "my_stash_name"
BASH

列出所有暂存

使用git stash list命令可以列出所有的暂存:

1
git stash list
BASH

该命令会输出一个类似如下的列表:

1
2
stash@{0}: On develop: perf-spike
stash@{1}: On develop: node v10
APACHE

按索引弹出暂存

使用git stash pop stash@{n}命令可以弹出(应用并删除)第n个暂存:

1
git stash pop stash@{n}
BASH

按索引应用暂存

使用git stash apply stash@{n}命令可以应用第n个暂存:

1
git stash apply stash@{n}
BASH

按名称应用暂存

使用git stash apply stash^{/my_stash_name}命令可以按名称应用暂存:

1
git stash apply stash^{/my_stash_name}
BASH

按名称弹出暂存的变通方法

如果要按名称弹出暂存,git stash pop本身不支持直接按名称操作,但可以使用以下变通方法(在Git 2.27和2.31版本测试通过):

1
git stash pop $(git stash list --pretty='%gd %s'|grep "my_stash_name"|head -1|gawk '{print $1}')
BASH

核心代码

保存带名称的暂存

1
git stash push -m "my_stash_name"
BASH

按名称应用暂存

1
git stash apply stash^{/my_stash_name}
BASH

自定义函数实现保存和应用暂存

.zshrc文件中添加以下函数:

1
2
3
4
5
6
7
function gitstash() {
git stash push -m "zsh_stash_name_$1"
}

function gitstashapply() {
git stash apply $(git stash list | grep "zsh_stash_name_$1" | cut -d: -f1)
}
SH

使用示例:

1
2
gitstash nice
gitstashapply nice
SH

Git别名设置

~/.gitconfig文件中添加以下别名:

1
2
3
[alias]
sshow = "!f() { n=$(git stash list --max-count=1 --grep=$1 | cut -f1 -d\":\") ; if [[ -n \"$n\" ]] ; then git stash show \"$n\" ; else echo \"Error: No stash matches $1\" ; return 1 ; fi }; f"
sapply = "!f() { n=$(git stash list --max-count=1 --grep=$1 | cut -f1 -d\":\") ; if [[ -n \"$n\" ]] ; then git stash apply \"$n\" ; else echo \"Error: No stash matches $1\" ; return 1 ; fi }; f"
INI

使用示例:

1
2
git sshow my_stash
git sapply my_stash
BASH

最佳实践

  • 使用有意义的名称:给暂存起一个有意义的名称,方便后续查找和管理。
  • 使用别名:通过设置Git别名,可以简化命令的输入,提高效率。
  • 定期清理暂存:暂存不是永久保存的,定期清理不再需要的暂存可以避免占用过多的空间。

常见问题

git stash save命令被弃用

从Git 2.15.x/2.16版本开始,git stash save命令已被弃用,建议使用git stash push -m命令代替。

按名称弹出暂存不支持

git stash pop本身不支持直接按名称弹出暂存,可以使用上述的变通方法。

正则表达式匹配问题

在使用git stash apply stash^{/my_stash_name}命令时,要注意正则表达式的匹配规则,确保能正确匹配到所需的暂存。如果正则表达式中包含空格,需要使用\进行转义,例如git stash apply stash^{/need\ this\ later}


如何命名和按名称检索Git暂存
https://119291.xyz/posts/how-to-name-and-retrieve-git-stash-by-name/
作者
ww
发布于
2025年5月14日
许可协议