У меня всегда было впечатление, что вы можете дать тайнику имя, выполнив команду git stash save stashname
, которое позже можно применить, выполнив команду git stash apply stashname
. Но похоже, что в этом случае все, что происходит, это то, что stashname
будет использоваться в качестве описания тайника.
Неужели нет способа действительно дать имя тайнику? Если нет, то что бы вы порекомендовали для достижения эквивалентной функциональности? По сути, у меня есть небольшой тайник, который я хотел бы периодически применять, но не хочу постоянно искать в git stash list
его фактический номер.
Вот как вы это делаете:
git stash save "my_stash"
Где "my_stash"
- имя тайника.
Еще несколько полезных вещей, которые нужно знать: Все тайники хранятся в стеке. Тип:
git stash list
Это позволит перечислить все ваши тайники.
Чтобы применить тайник и удалить его из стека тайников, введите:
git stash pop stash@{n}
Чтобы применить тайник и сохранить его в стеке тайников, введите:
git stash apply stash@{n}
Где n
- индекс сохраненного изменения.
в Git тайник спасти
это устаревший по состоянию на 2.15.х/2.16, вместо этого вы можете использовать команду git тайник пуш-М "Мои сообщения и"`
Вы можете использовать его как это:
в Git тайник пуш-М "Мои сообщения и"
куда "сообщение" это ваше внимание на то заначку.
Для того, чтобы извлечь заначку можно использовать: список в Git тайник`. Это будет выводить список такой, например:
stash@{0}: On develop: perf-spike
stash@{1}: On develop: node v10
Тогда вы просто используете "применить", давая ему тайник@{индекс}
:
git stash apply stash@{1}
Ссылки страницы ГИТ заначка мужчине
Вы можете превратить тайник в филиал, если считаете его достаточно важным:
git stash branch <branchname> [<stash>]
из man-страницы:
Создаёт и проверяет новую ветвь с именем <branchname>
, начиная с коммита, на котором первоначально был создан <stash>
, применяет изменения, записанные в <stash>
, к новому рабочему дереву и индексу, затем удаляет <stash>
, если всё завершилось успешно. Если <stash>
не указан, применяется самый последний.
Это полезно, если ветвь, на которой вы выполнили git stash save
, изменилась настолько, что git stash apply не работает из-за конфликтов. Поскольку тайник применяется поверх коммита, который был HEAD на момент выполнения git stash, он восстанавливает первоначально сохранённое состояние без конфликтов.
Позже вы можете перебазировать эту новую ветвь в какое-нибудь другое место, которое является потомком того места, где вы находились, когда делали укладку.
Если вы просто ищете легкий путь, чтобы сохранить все или некоторые из вашей текущей рабочей копии изменения, а затем повторно применить их позже, по желанию, считают файла патч:
# save your working copy changes
git diff > some.patch
# re-apply it later
git apply some.patch
Каждый сейчас и тогда я задаюсь вопросом, если я должен быть с использованием прячет за это, а потом я вижу вещи, как прежде маразм и я'м довольствоваться тем, что я'делаю м :)
Тайники не предназначены для постоянных вещей, как вы хотите. Возможно, вам лучше использовать теги на коммитах. Создайте вещь, которую вы хотите сохранить в тайнике. Сделайте из него коммит. Создайте тег для этого коммита. Затем откатите вашу ветку до HEAD^
. Теперь, когда вы захотите снова применить этот тайник, вы можете использовать git cherry-pick -n tagname
(-n
означает --no-commit
).
У меня есть эти две функции в моем .файл 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 тайник пуш-м aNameForYourStash, чтобы сохранить его. Затем используйте список заначку ЖКТ к усвоению **индекс заначку** что вы хотите применять. Затем git используйте заначка поп --индекс 0
, чтобы поп заначку и применить его.
примечание: Я'м, используя git версии 2.21.0.окна.1
поставка = " но!Ф() { в Git тайник применить \" и$(ЖКТ заначку список | на awk -Е: --в POSIX -vpat=\" и$*\" и \" и$ 0 ~ ПАТ {печати $ 1; Выход}\", У)\", У; }; Ф"
в
я поставка ГИТ&; в<регулярное выражение>"
в
Edit: я прилепила к моей оригинальное решение, но я понимаю, почему большинство предпочитает Ктан Рейснер's версии (см. выше). Так просто для протокола:
sapply = "!f() { git stash apply \"$(git stash list | grep -E \"$*\" | awk \"{ print $ 1; }\" | sed -n \"s/://;1p\")\"; }; f"
Это'ы жаль, что в Git тайник применить заначку^{/<регулярное выражение> У}
Не'т работу, (он не'т на самом деле поиск заначку список см. В комментариях под принимаются ответы).
Вот несколько капель в замен, что поиск в Git тайник списка
на регулярное выражение, чтобы найти первое (последнее) тайник@{<п>}
, а затем передать, что в Git тайник в <команда> У
:
в
# 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"
В, но я'м не уверен, если это будет мешать выражения разделители (я'м открыт для предложений).
Этот ответ во многом обязана Клемен Slavič. Я бы просто прокомментировал принятый ответ, но я Дон'т иметь достаточно рэп еще :(
Вы также можете добавить псевдоним 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"
Отметим, что поводом для `Реф=$( ... ); Эхо ${справ:-
Использовать небольшой bash-скрипт, чтобы посмотреть номер заначку. Называют ее "gitapply и":
NAME="$1"
if [[ -z "$NAME" ]]; then echo "usage: gitapply [name]"; exit; fi
git stash apply $(git stash list | grep "$NAME" | cut -d: -f1)
Использование:
gitapply foo
...где Foo является подстрокой имени Сташ, который вы хотите.
Псевдоним Это может быть более прямой синтаксис для UNIX-подобных систем, без необходимости, чтобы инкапсулировать в функцию. Добавьте следующую строку в ~/.gitconfig хранит настройки в [псевдоним]
sshow = !sh -c 'git stash show stash^{/$*} -p' -
sapply = !sh -c 'git stash apply stash^{/$*}' -
ssave = !sh -c 'git stash save "${1}"' -
Использование: поставка регулярное выражение
Пример: ГИТ шоу MySecretStash
Дефис в конце говорит принимать входные данные из стандартного ввода.
Git используйте заначка сохранить имя для сохранения.
Затем... вы можете использовать этот скрипт, чтобы выбрать, какой применить (или поп):
#!/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 и, честно говоря, не'т знают, как использовать некоторые из Баш псевдонимы выше ;)
Примечание: как говорит Кевин, вы должны использовать теги и вишня-выбирает вместо этого.
Это один из способов сделать это с помощью 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''
}
}
в моей рыбе оболочки
function gsap
git stash list | grep ": $argv" | tr -dc '0-9' | xargs git stash apply
end
использовать
"гсап" name_of_stash
в Git тайник применить также работает с другими судьями, чем
тайник@{0}. Поэтому вы можете использовать обычные **теги** чтобы получить постоянное имя. Это также имеет то преимущество, что вы не случайно
в Git тайник падение " или " в Git Сташ поп-это.
Так что вы можете определить псевдоним pstash
(про ака;постоянные заначки") Смотрите, как это:
git config --global alias.pstash '!f(){ git stash && git tag "$1" stash && git stash drop; }; f'
Теперь вы можете создать тегами заначку:
git pstash x-important-stuff
и " шоу " и "применить" его снова, как обычно:
git stash show x-important-stuff
git stash apply x-important-stuff
Опоздала на вечеринку здесь, но если через VSCode, быстрый способ сделать так, чтобы открыть окно командной палитры (Ctrl / КМД + шифт + P) и типа "У попа шкатулка наша" Вы'll быть в состоянии восстановить свой заначку по имени без необходимости использовать git командной строки
Для всего, кроме создания заначку, я'д предлагаю другое решение путем введения fzf как зависимость. Рекомендуем уделить 5 минут своего времени и познакомиться с его, как он закончится-все здорово повысить производительность.
Так или иначе, связанные отрывок из их страница примеры предлагает заначку поиск. Это's очень легкий для того чтобы изменить sciptlet, чтобы добавить дополнительную функциональность (например, применение заначку или падения):
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
}