git에서 이름으로 숨김을 이름 지정하고 검색하는 방법은 무엇입니까?


1419

나는 항상 당신이 말함으로써 은신처에 이름을 줄 수 있다는 인상을 git stash save stashname받았습니다 git stash apply stashname. 그러나이 경우 발생하는 모든 것은 stashname숨김 설명으로 사용되는 것 같습니다 .

실제로 숨김 이름을 지정할 수있는 방법이 없습니까? 그렇지 않은 경우 동등한 기능을 달성하기 위해 무엇을 권장합니까? 본질적으로 나는 정기적으로 적용하고 싶은 작은 숨김이 있지만 git stash list실제 숨김 번호가 무엇인지 항상 사냥하고 싶지는 않습니다 .


68
git stash push -m stashname는 IS 전류 구 . git stash save stashname더 이상 사용되지 않습니다.
SherylHohman

1
git stash push -m stashname은 2.8.0.windows.1에서 작동하지 않습니다.
Jac

Git for Windows 2.26.0은 며칠 전에 릴리스되었습니다. 어쩌면 이제 수정되었습니다. github.com/git-for-windows/git/releases/tag/v2.26.0.windows.1
tom_mai78101

답변:


816

이것이 당신이하는 방법입니다 :

git stash save "my_stash"

"my_stash"숨김 이름은 어디에 있습니까 ?

알아야 할 몇 가지 더 유용한 사항 : 모든 스 태시는 스택에 저장됩니다. 유형:

git stash list

이것은 모든 숨김을 나열합니다.

숨김을 적용하고 숨김 스택에서 제거하려면 다음을 입력하십시오.

git stash pop stash@{n}

숨김을 적용하고 숨김 스택에 유지하려면 다음을 입력하십시오.

git stash apply stash@{n}

n숨김 변경 색인은 어디에 있습니까 ?


88
이것은 질문에 대답하지 않습니다. 기본적으로 stash의 숫자가 많지만 이름을 쉽게 식별 할 수있는 방법에 대한 답변은 없습니다.
GoodSp33d

16
OP는 명시 적으로 사용자 이름의 stash @ {n} 이름을 피하려고합니다. git stash apply <custom-name>
stewSquared

10
이름으로 숨김을 검색하는 것에 대한 질문에 대답하지 않습니다.
nullsteph

45
git stash push -m my_stash는 IS 전류 구 . git stash save my_stash더 이상 사용되지 않습니다.
SherylHohman

21
관련이 없습니다. 쓸모있다.
Gayan Weerakutti

440

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}

참조는 숨겨 놓은 사람이 페이지를 이눔


9
문법 push보다는 문서 save: git stash push
SherylHohman

30
이것이 실제 답변입니다. 불행히도 그 위에 많은 오래된 답변이 있습니다.
malan December

1
최신에 대한 자세한 내용 git stash push: stackoverflow.com/a/47231547/6309
VonC

사용 중단 통지에 대한 (최신 현재 문서에) 자료 : git-scm.com/docs/git-stash/2.24.0#Documentation/...
가브리엘 Devillers

1
FWIW : git stash apply stash@{1}Powershell에서 실행 하면 error: unknown switch 'e'돌아올 수 있습니다. 대신, git stash apply --index 1또는 git stash apply 'stash@{1}'또는 이스케이프 }{함께 사용하십시오 .
LosManos

104

충분히 중요하다고 생각되면 숨김을 분기로 바꿀 수 있습니다.

git stash branch <branchname> [<stash>]

매뉴얼 페이지에서 :

이것은 원래 작성된 <branchname>커밋에서 시작하여 이름이 지정된 새 분기를 작성하고 체크 아웃 하고 새 작업 트리 및 색인에 <stash>기록 된 변경 사항을 적용한 <stash>다음 <stash>성공적으로 완료되면 삭제합니다 . 제공되지 않으면 <stash>최신 것을 적용하십시오.

이것은 당신이 실행 한 브랜치 git stash save가 충돌로 인해 git stash apply가 실패 할 정도로 충분히 변경된 경우에 유용합니다 . 숨김은 git stash가 실행될 때 HEAD였던 커밋 위에 적용되므로 충돌없이 원래의 숨김 상태를 복원합니다.

나중에이 새 브랜치를 보관할 위치의 후손 인 다른 장소로 리베이스 할 수 있습니다.


1
가지가 git에서 꽤 저렴하기 때문에이 제안은 나에게 가장 유용합니다.
Jayan

5
그러나 OP가 요구하는 것처럼 나중에 다른 지점 에이 숨김을 계속 다시 적용하려는 경우 도움이되지 않습니다. 머리를 체리 픽해야합니다.
stewSquared

@AdamDymitruk 숨기지 않고 은신처를 유지 하면서이 작업을 수행 할 수있는 방법이 있습니까? (에서처럼 git stash apply)
Kasun Siyambalapitiya

이상하게 도이 작업을 시도했을 때 체크 아웃 할 때 내 파일 중 하나를 덮어 쓸 수 있다는 오류 메시지가 표시되고 변경 사항을 커밋하거나 숨겨야합니다 (!). git stash push -m 'name'일했다.
wortwart

@AdamDymmitruk 놀라운 답변입니다. 짜릿했다.
Dan

75

현재 작업 복사본 변경 사항 중 일부 또는 전부를 저장 한 후 나중에 다시 적용 할 수있는 간단한 방법을 찾고 있다면 패치 파일을 고려하십시오.

# save your working copy changes
git diff > some.patch

# re-apply it later
git apply some.patch

때때로 나는 이것을 위해 숨김을 사용 해야하는지 궁금해하고 위의 광기와 같은 것을보고 나는 내가하고있는 것에 만족합니다 :)


2
이거 야! 감사합니다. 또한 .patch 파일을 무시하도록 .gitignore를 업데이트했으며 원하는만큼 많은 패치를 갖도록 설정되었습니다.
LINGS 2016 년

질문의 의도를 알 수 있습니다. 이는 마스터에서 지점을 가져 와서 커밋하지 않을 때마다 일부 로컬 변경 사항을 적용하는 것입니다. 따라서 아마도 질문이 수정되었을 것입니다. 그리고이 답변이 해결책으로 받아 들여졌을 것입니다. 간단합니다.
ank

46

은신은 당신이 원하는 영구적 인 것이 아닙니다. 커밋에 태그를 사용하는 것이 더 나을 것입니다. 숨기고 싶은 것을 만드십시오. 그것을 커밋하십시오. 해당 커밋에 대한 태그를 만듭니다. 그런 다음 지점을로 롤백하십시오 HEAD^. 이제 그 숨김을 다시 적용하려면 git cherry-pick -n tagname( -nis --no-commit)를 사용할 수 있습니다 .


1
확실히이 접근 방식과 마찬가지로, named commit어딘가에 어울리는 것이 조금 더 깨끗합니다 . 가벼운 성가심은 체리 픽에 커밋되지 않고 diff에 머무르는 것이므로 다음 커밋 중에 수동으로 체크인하지 않아야합니다.
Aditya MP

1
가장 가깝습니다. 나는 이것에 대한 별칭을 만들 것이라고 생각합니다. 설명을 "이름"으로 사용하는 것을 좋아하지 않습니다.
stewSquared

그것은 색인에 추가하고 수치를 재설정해야합니다, 누군가 --no-stage옵션을 패치해야합니다 ! 관련 : stackoverflow.com/questions/32333383/…
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

41

git stash push -m aNameForYourStash저장 하는 데 사용하십시오. 그런 다음을 사용 git stash list하여 적용하려는 숨김색인 을 학습하십시오 . 그런 다음을 사용 git stash pop --index 0하여 숨김을 팝하고 적용하십시오.

참고 : git 버전 2.21.0.windows.1을 사용하고 있습니다.


1
귀하의 답변은 다음 의 현재 구문에 대한 이 의견 을 고려하여 명목상 최고 답변이 될 것 입니다git stash {push,save}
Michael-Where 's Clay Shirky

32

.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

"zsh_stash_name_"는 무엇입니까?
Sam Hasler

1
@ SamHasler는 임의의 고유 한 문자열입니다. 만약 당신이 stash가 일반 git stash 또는 이러한 기능으로 생성되었다는 것을 알고 싶다면
iWheelBuy

별칭 팬을위한 우아한 솔루션
9

22

이건 어때?

git stash save stashname
git stash apply stash^{/stashname}

1
그것은 같은 소리 처럼 뭔가 로 사용 허용 대답을하지만, 이후 삭제되었습니다.
Michael-Clay Shirky는 어디에 있습니까

흠, 왜 삭제 되었습니까?
AdamB

나는 대답을 게시하지 않았고 10,000 평판을 얻지 못했기 때문에 모르겠지만 작동하지 않는다는 의견과 관련이 있다고 생각합니다. 작동하지 않는 것은 불행합니다 git stash apply stash^{/<regex>}(작동하지 않습니다) 실제로 숨김 목록을 검색하십시오 ( 허용 된 답변 아래의 주석 참조 ).
마이클 - 어디의 클레이 셔키

이것은 당신이 찾고있는 답변입니다!
kiedysktos

1
검색하려면 1로 이동합니다. git stash list그러면 관련 색인 번호와 함께 숨김을 표시 한 다음 2로 이동합니다. git stash apply 0-0은 첫 번째 명령에서 조회 한 색인 번호
ambidexterous

8

별명

sapply = "!f() { git stash apply \"$(git stash list | awk -F: --posix -vpat=\"$*\" \"$ 0 ~ pat {print $ 1; exit}\")\"; }; f"

용법

git sapply "<regex>"

  • Windows 용 Git과 호환

편집 : 나는 원래의 솔루션을 고수했지만 대다수가 왜 Etan Reisner 버전을 선호하는지 알았습니다. 레코드에 대해서만 :

sapply = "!f() { git stash apply \"$(git stash list | grep -E \"$*\" | awk \"{ print $ 1; }\" | sed -n \"s/://;1p\")\"; }; f"

사용 awk -F: '{print $1}'(가) 완전히 나오지도의 필요성을 제거한다. 또한 왜 이것을 함수로 포장합니까? 그리고 사용 awk -F: -vpat="$*" '$0 ~ pat {print $1}'하면 grep도 떨어질 수 있습니다. 패턴에 대해 약간 다른 인용 부호가 필요할 수 있습니다.
Etan Reisner

@EtanReisner : 스 니펫이 두 줄 이상을 출력합니다.
Vlastimil Ovčáčík

{print $1; exit}일치하는 첫 번째 줄 이후에 작업 을 종료하십시오.
Etan Reisner

@EtanReisner : 몇 가지 테스트 후 sed를 제거 할 수 있었지만 래퍼와 grep은 유지됩니다.
Vlastimil Ovčáčík

내가 말한 것처럼 패턴 인용이 없으면 그레프가 필요하지 않습니다. 래퍼로 쉘 기능을 의미한다고 가정합니까? 왜 당신이 당신이 그것을 필요로한다고 생각하는지 설명하지 않았으므로 당신이 실제로하는지 여부에 대해서는 언급 할 수 없지만 당신은 그렇지 않다고 생각합니다. (git stash 대신 쉘을 수동으로 호출해야하지만 가능하지는 않을 수도 있습니다.)
Etan Reisner

8

불행히도 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"그럴 수도 있지만 정규 표현식 구분 기호를 방해하는지 확실하지 않습니다 (제안을 공개합니다).


6

이 답변은 Klemen Slavič에게 많은 책임이 있습니다. 나는 받아 들인 대답에 대해 방금 언급했지만 아직 충분한 담당자가 없습니다.

git alias를 추가하여 숨김 참조를 찾고 다른 별칭에서 사용하여 show, apply, drop 등을 사용할 수 있습니다.

[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이 예상대로 실패하지 않고 최신 숨김을 대상으로합니다.


1
수락 된 답변이 효과가없는 것처럼 보이는 동안 이것은 나를 위해 작동합니다 (허용 된 답변에 대한 내 칭찬 참조)
Jan Rüegg

4

별명 이것은 함수에 캡슐화 할 필요없이 유닉스 계열 시스템에 대한 직접적인 구문 일 수 있습니다. [alias] 아래 ~ / .gitconfig에 다음을 추가하십시오.

sshow = !sh -c 'git stash show stash^{/$*} -p' -
sapply = !sh -c 'git stash apply stash^{/$*}' -
ssave = !sh -c 'git stash save "${1}"' -

사용법 : sapply regex

예 : git sshow MySecretStash

끝에 하이픈은 표준 입력에서 입력을 가져옵니다.


4

작은 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는 원하는 숨김 이름의 하위 문자열입니다.


3

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 별칭 중 일부를 사용하는 방법을 몰랐습니다.)

참고 : Kevin이 말했듯 이 대신 태그와 체리 픽을 사용해야합니다.


git stash save은 더 이상 사용되지 않습니다 git stash push.
wranvaud '12

2

이것은 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''
    }
}

자세한 내용은 여기


2

내 생선 껍질에

function gsap
  git stash list | grep ": $argv" | tr -dc '0-9' | xargs git stash apply
end

사용하다

gsap name_of_stash


예! 감사합니다!!!
clozach

1

파티에 늦었지만 VSCode를 사용하는 경우 명령 팔레트 (CTRL / CMD + SHIFT + P)를 열고 "Pop Stash"를 입력하는 빠른 방법은 이름으로 숨김을 검색 할 수 있습니다 git CLI를 사용할 필요없이


1

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

그리고 평소 showapply같이 다시 :

git stash show x-important-stuff
git stash apply x-important-stuff

0

나는 그 이름으로 숨길 수있는 방법이 없다고 생각합니다.

나는 그것을하는 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"

도움이 되길 바랍니다!


0

숨김 생성 이외의 모든 것에 대해 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
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.