我总是觉得你可以给一个藏匿点一个名字git stash save stashname
,以后可以申请给一个名字git stash apply stashname
。但是似乎在这种情况下,所有发生的事情都stashname
将用作隐藏说明。
没有办法真正命名藏匿处吗?如果没有,您将建议如何实现同等功能?本质上,我有一个很小的存储区,我想定期申请该存储区,但不想一直寻找git stash list
其实际存储区号是多少。
我总是觉得你可以给一个藏匿点一个名字git stash save stashname
,以后可以申请给一个名字git stash apply stashname
。但是似乎在这种情况下,所有发生的事情都stashname
将用作隐藏说明。
没有办法真正命名藏匿处吗?如果没有,您将建议如何实现同等功能?本质上,我有一个很小的存储区,我想定期申请该存储区,但不想一直寻找git stash list
其实际存储区号是多少。
Answers:
这是您的操作方式:
git stash save "my_stash"
"my_stash"
存储名称在哪里。
一些更有用的知识:所有存储区都存储在堆栈中。类型:
git stash list
这将列出您所有的藏匿处。
要应用存储并将其从存储堆栈中删除,请键入:
git stash pop stash@{n}
要应用存储并将其保存在存储堆栈中,请键入:
git stash apply stash@{n}
n
隐匿变化的索引在哪里。
git stash apply <custom-name>
git stash save
被弃用作为2.15.x / 2.16,而不是你可以使用git stash push -m "message"
您可以像这样使用它:
git stash push -m "message"
其中“消息”是您对该存储的注释。
为了检索存储,您可以使用:git stash list
。这将输出这样的列表,例如:
stash@{0}: On develop: perf-spike
stash@{1}: On develop: node v10
然后,您只需使用apply
以下命令即可stash@{index}
:
git stash apply stash@{1}
参考 git stash手册页
git stash push
:stackoverflow.com/a/47231547/6309
git stash apply stash@{1}
在Powershell中运行时,您会得到error: unknown switch 'e'
回报。而是使用git stash apply --index 1
或git stash apply 'stash@{1}'
或逸出}
并{
加上反引号`。
如果您觉得它很重要,可以将它变成一个分支:
git stash branch <branchname> [<stash>]
从手册页:
这将创建并签出一个新分支<branchname>
,该分支从<stash>
最初创建该分支的提交开始,将记录的更改应用于<stash>
新的工作树和索引,然后删除<stash>
是否成功完成的分支。如果没有<stash>
给出,则应用最新的。
如果您运行的分支git stash save
已发生足够的更改以至于git stash应用由于冲突而失败,这将非常有用。由于存储是在运行git stash时是HEAD的提交之上应用的,因此它可以恢复原始存储状态,而不会发生冲突。
您以后可以将此新分支重新设置到其他位置,该位置是您存放时的后代。
git stash apply
)
git stash push -m 'name'
工作。
如果您只是想以一种轻巧的方式保存部分或全部当前的工作副本更改,然后在以后随意重新应用它们,请考虑一个补丁文件:
# save your working copy changes
git diff > some.patch
# re-apply it later
git apply some.patch
我时不时地想知道是否应该为此使用藏匿处,然后看到上面的疯狂之类的东西,并且我对正在做的事情感到满意:)
储物并不是要永久保留您想要的东西。在提交上使用标签可能会更好。构造要隐藏的东西。做出一个承诺。为该提交创建标签。然后将分支回滚到HEAD^
。现在,当您想重新应用该存储时,可以使用git cherry-pick -n tagname
(-n
is --no-commit
)。
named commit
在某个地方闲逛感觉更干净。唯一的烦恼是它不会在选择樱桃时提交,而是停留在差异中,这意味着在下一次提交期间将需要手动不对其进行检入。
--no-stage
选项!相关:stackoverflow.com/questions/32333383/...
用于git stash push -m aNameForYourStash
保存它。然后使用git stash list
来了解要应用的存储区的索引。然后使用git stash pop --index 0
弹出存储并应用它。
注意:我正在使用git版本2.21.0.windows.1
git stash {push,save}
我的.zshrc
文件中有以下两个功能:
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)
}
以这种方式使用它们:
gitstash nice
gitstashapply nice
那这个呢?
git stash save stashname
git stash apply stash^{/stashname}
git stash apply stash^{/<regex>}
它不起作用(它不起作用实际搜索存储列表,请查看已接受答案下方的注释)。
git stash list
向我显示存储区及其关联的索引号,然后进行了2。- git stash apply 0
其中0是我从第一条命令中查找的索引号
sapply = "!f() { git stash apply \"$(git stash list | awk -F: --posix -vpat=\"$*\" \"$ 0 ~ pat {print $ 1; exit}\")\"; }; f"
git sapply "<regex>"
编辑:我坚持最初的解决方案,但我明白了为什么多数人会喜欢Etan Reisner的版本(如上所述)。因此,仅作记录:
sapply = "!f() { git stash apply \"$(git stash list | grep -E \"$*\" | awk \"{ print $ 1; }\" | sed -n \"s/://;1p\")\"; }; f"
awk -F: '{print $1}'
将完全不需要sed。为什么还要将其包装在函数中呢?并且使用也awk -F: -vpat="$*" '$0 ~ pat {print $1}'
应该允许删除grep。虽然可能需要对模式的报价稍有不同。
{print $1; exit}
在第一个匹配的行之后退出操作。
不幸的是,git stash apply stash^{/<regex>}
这行不通(它实际上并没有搜索存储列表,请参见已接受答案中的注释)。
这是git stash list
通过正则表达式搜索以找到第一个(最新的)stash@{<n>}
然后将其传递给的直接替换git stash <command>
:
# standalone (replace <stash_name> with your regex)
(n=$(git stash list --max-count=1 --grep=<stash_name> | cut -f1 -d":") ; if [[ -n "$n" ]] ; then git stash show "$n" ; else echo "Error: No stash matches" ; return 1 ; fi)
(n=$(git stash list --max-count=1 --grep=<stash_name> | cut -f1 -d":") ; if [[ -n "$n" ]] ; then git stash apply "$n" ; else echo "Error: No stash matches" ; return 1 ; fi)
# ~/.gitconfig
[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"
# usage:
$ git sshow my_stash
myfile.txt | 1 +
1 file changed, 1 insertion(+)
$ git sapply my_stash
On branch master
Your branch is up to date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: myfile.txt
no changes added to commit (use "git add" and/or "git commit -a")
请注意,返回了正确的结果代码,因此您可以在其他脚本中使用这些命令。可以使用以下命令运行命令后进行验证:
echo $?
请小心变量扩展漏洞利用,因为我不确定这--grep=$1
部分内容。可能应该是,--grep="$1"
但是我不确定这是否会影响正则表达式定界符(我愿意接受建议)。
这个答案归功于KlemenSlavič。我会在接受的答案上发表评论,但是我没有足够的代表:(
您还可以添加一个git别名来查找存储引用,并将其用于其他别名中以进行显示,应用,放置等。
[alias]
sgrep = "!f() { ref=$(git --no-pager stash list | grep "$1" | cut -d: -f1 | head -n1); echo ${ref:-<no_match>}; }; f"
sshow = "!f() { git stash show $(git sgrep "$1") -p; }; f"
sapply = "!f() { git stash apply $(git sgrep "$1"); }; f"
sdrop = "!f() { git stash drop $(git sgrep "$1"); }; f"
请注意,这种ref=$( ... ); echo ${ref:-<no_match>};
模式的原因是不会返回空白字符串,这将导致sshow,sapply和sdrop定位到最新的存储,而不是像预期的那样失败。
采用 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别名;)
注意:正如凯文所说,您应该改用标签和樱桃签。
git stash save
不推荐使用git stash push
。
这是使用PowerShell完成此操作的一种方法:
<#
.SYNOPSIS
Restores (applies) a previously saved stash based on full or partial stash name.
.DESCRIPTION
Restores (applies) a previously saved stash based on full or partial stash name and then optionally drops the stash. Can be used regardless of whether "git stash save" was done or just "git stash". If no stash matches a message is given. If multiple stashes match a message is given along with matching stash info.
.PARAMETER message
A full or partial stash message name (see right side output of "git stash list"). Can also be "@stash{N}" where N is 0 based stash index.
.PARAMETER drop
If -drop is specified, the matching stash is dropped after being applied.
.EXAMPLE
Restore-Stash "Readme change"
Apply-Stash MyStashName
Apply-Stash MyStashName -drop
Apply-Stash "stash@{0}"
#>
function Restore-Stash {
[CmdletBinding()]
[Alias("Apply-Stash")]
PARAM (
[Parameter(Mandatory=$true)] $message,
[switch]$drop
)
$stashId = $null
if ($message -match "stash@{") {
$stashId = $message
}
if (!$stashId) {
$matches = git stash list | Where-Object { $_ -match $message }
if (!$matches) {
Write-Warning "No stashes found with message matching '$message' - check git stash list"
return
}
if ($matches.Count -gt 1) {
Write-Warning "Found $($matches.Count) matches for '$message'. Refine message or pass 'stash{@N}' to this function or git stash apply"
return $matches
}
$parts = $matches -split ':'
$stashId = $parts[0]
}
git stash apply ''$stashId''
if ($drop) {
git stash drop ''$stashId''
}
}
git stash apply
还可与以外的其他参照一起使用stash@{0}
。因此,您可以使用普通标签来获取永久名称。这也具有您不会偶然git stash drop
或无法git stash pop
。
因此,您可以这样定义一个别名pstash
(也称为“持久存储”):
git config --global alias.pstash '!f(){ git stash && git tag "$1" stash && git stash drop; }; f'
现在,您可以创建带标签的存储区:
git pstash x-important-stuff
并show
和apply
它再次像往常一样:
git stash show x-important-stuff
git stash apply x-important-stuff
我认为没有办法用它的名字git pop stash。
我已经创建了一个执行此操作的bash函数。
#!/bin/bash
function gstashpop {
IFS="
"
[ -z "$1" ] && { echo "provide a stash name"; return; }
index=$(git stash list | grep -e ': '"$1"'$' | cut -f1 -d:)
[ "" == "$index" ] && { echo "stash name $1 not found"; return; }
git stash apply "$index"
}
用法示例:
[~/code/site] on master*
$ git stash push -m"here the stash name"
Saved working directory and index state On master: here the stash name
[~/code/site] on master
$ git stash list
stash@{0}: On master: here the stash name
[~/code/site] on master
$ gstashpop "here the stash name"
希望对您有所帮助!
除了创建隐藏文件外,我还通过引入fzf提出另一种解决方案作为依赖项来。我建议您花费5分钟的时间并开始使用它,因为它总体上可以极大地提高生产力。
无论如何,他们的示例页面中的相关摘录提供了隐藏搜索。更改脚本以添加其他功能(例如隐藏应用程序或删除)非常容易:
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 stash push -m stashname
是当前语法。git stash save stashname
已不推荐使用。