如何保存/应用带有名称的存储?我不想在git存储列表中查找它的索引号。我尝试了git存储保存“my_stash_name”,但这只会更改存储描述,相应的git-apply“my_stash_name”不起作用。
当前回答
别名
sapply=“!f(){git stash apply\”$(git stash-list|awk-f:--posix-vpat=\“$*\”\“$0~pat{print$1;exit}\”)\“;};f”
用法
git sapply“<regex>”
与Git for Windows兼容
编辑:我坚持我最初的解决方案,但我明白了为什么大多数人更喜欢埃坦·雷斯纳的版本(上图)。所以,为了记录在案:
sapply = "!f() { git stash apply \"$(git stash list | grep -E \"$*\" | awk \"{ print $ 1; }\" | sed -n \"s/://;1p\")\"; }; f"
其他回答
要保存带有消息的存储:
git stash push -m "my_stash_name"
或者(自v2.16起已弃用):
git stash save "my_stash_name"
要列出隐藏内容:
git stash list
所有的储藏物都存储在一个堆栈中。
要弹出(即应用并删除)第n个存储:
git stash pop stash@{n}
使用git stash pop无法按名称弹出(即应用和删除)存储(请参见脚注1)。
要应用第n个存储:
git stash apply stash@{n}
要按名称应用隐藏:
git stash apply stash^{/my_stash_name}
脚注1:
有关申请,请参阅man git stash部分:与pop不同,可以是任何看起来像是由stash push或stash create创建的提交。可能的解决方法(在git版本2.27和2.31上测试):git stash pop$(git stash-list--prey=“%gd%s”|grep“my_stash_name”|head-1|gawk“{print$1}”)
如果你觉得足够重要,你可以把一个藏起来的东西变成树枝:
git stash branch <branchname> [<stash>]
从手册页:
这将从最初创建<stash>的提交开始创建并签出一个名为<branchname>的新分支,将<stash’中记录的更改应用于新的工作树和索引,然后如果成功完成,则删除<stash〕。当没有给出<stash>时,应用最新的一个。
如果运行git-stash-save的分支发生了足够的变化,导致git-stash-apply由于冲突而失败,那么这非常有用。由于在运行git stash时,stash应用于HEAD提交之上,因此它恢复了最初的stash状态,没有冲突。
您可以稍后将此新分支重新放置到其他位置,该位置是您存放时所在位置的后代。
使用git stash save NAME保存。
然后您可以使用此脚本选择应用(或弹出):
#!/usr/bin/env ruby
#git-stash-pick by Dan Rosenstark
# can take a command, default is apply
command = ARGV[0]
command = "apply" if !command
ARGV.clear
stashes = []
stashNames = []
`git stash list`.split("\n").each_with_index { |line, index|
lineSplit = line.split(": ");
puts "#{index+1}. #{lineSplit[2]}"
stashes[index] = lineSplit[0]
stashNames[index] = lineSplit[2]
}
print "Choose Stash or ENTER to exit: "
input = gets.chomp
if input.to_i.to_s == input
realIndex = input.to_i - 1
puts "\n\nDoing #{command} to #{stashNames[realIndex]}\n\n"
puts `git stash #{command} #{stashes[realIndex]}`
end
我喜欢能够看到储藏物的名称并进行选择。此外,我使用Zshell,坦率地说,我不知道如何使用上面的一些Bash别名;)
注意:正如凯文所说,你应该使用标签和樱桃采摘代替。
所以,我不知道为什么在这个话题上会有如此多的恐慌。我可以用push和不推荐的save来命名git stash,也可以使用正则表达式通过apply将其拉回:
使用名称应用的Git存储方法
$ git stash push -m "john-hancock"
$ git stash apply stash^{/john-hancock}
如前所述,save命令已被弃用,但它仍然有效,因此您可以在无法通过推送调用更新它们的旧系统上使用它。与push命令不同,save不需要-m开关。
// save is deprecated but still functional
$ git stash save john-hancock
这是Git 2.2和Windows 10。
视觉证明
这里有一个漂亮的动画GIF演示了这个过程。
事件顺序
GIF运行速度很快,但如果你看,过程如下:
ls命令显示目录中的4个文件touch example.html添加第五个文件git stash push-m“john hancock”-a(-a包括未跟踪的文件)ls命令在stash之后显示4个文件,这意味着stash和隐式硬重置工作正常git stash apply stash ^{/john hancock}运行ls命令列出了5个文件,显示example.html文件已返回,这意味着git stash apply命令有效。
这有道理吗?
坦率地说,我不确定这种方法的好处是什么。给储藏物起个名字是有价值的,但不包括检索。也许编写搁置和取消搁置过程的脚本会有所帮助,但只需按名称弹出一个存储库还是要容易得多。
$ git stash pop 3
$ git stash apply 3
这看起来比正则表达式容易得多。
除了创建存储库之外,我还提出了另一种解决方案,即引入fzf作为依赖项。我建议你花5分钟的时间来了解它,因为它可以大大提高生产力。
总之,他们的示例页面中有一个相关的摘录,提供了隐藏搜索。很容易更改scriptlet以添加附加功能(如隐藏应用程序或删除):
fstash() {
local out q k sha
while out=$(
git stash list --pretty="%C(yellow)%h %>(14)%Cgreen%cr %C(blue)%gs" |
fzf --ansi --no-sort --query="$q" --print-query \
--expect=ctrl-d,ctrl-b); do
mapfile -t out <<< "$out"
q="${out[0]}"
k="${out[1]}"
sha="${out[-1]}"
sha="${sha%% *}"
[[ -z "$sha" ]] && continue
if [[ "$k" == 'ctrl-d' ]]; then
git diff $sha
elif [[ "$k" == 'ctrl-b' ]]; then
git stash branch "stash-$sha" $sha
break;
else
git stash show -p $sha
fi
done
}
推荐文章
- 为什么我需要显式地推一个新分支?
- 如何撤消最后的git添加?
- Rubymine:如何让Git忽略Rubymine创建的.idea文件
- Gitignore二进制文件,没有扩展名
- Git隐藏错误:Git隐藏弹出并最终与合并冲突
- 了解Git和GitHub的基础知识
- 没有。Git目录的Git克隆
- Git与Mercurial仓库的互操作性
- 忽略git中修改(但未提交)的文件?
- “git restore”命令是什么?“git restore”和“git reset”之间有什么区别?
- Git合并与强制覆盖
- Git拉另一个分支
- 在Bash命令提示符上添加git分支
- 如何更改Git日志日期格式
- git pull -rebase和git pull -ff-only之间的区别