자식 숨김을 어떻게 이름을 바꿀 수 있습니까?


202

이름이 잘못된 숨김이 있습니다. 정확한 이름을 수정하고 싶습니다.

숨김의 이름을 바꾸려면 어떻게해야합니까?


5
그것을 팝하고 다른 이름으로 다시 저장 하시겠습니까?
Bartlomiej Lewandowski

5
숨김은 오래된 상태를 기반으로하고 팝업시 충돌이 발생하기 때문에 항상 다시 찌르고 숨기는 것이 항상 옵션은 아닙니다. (오래된 국가는 더 이상 역사의 어느 곳에도 존재할 필요가 없습니다.)
Tom

답변:


258

숨김 목록이 다음과 같다고 가정 해 봅시다.

$ git stash list
stash@{0}: WIP on master: Add some very important feature 
stash@{1}: WIP on master: Fix some silly bug

먼저 이름을 바꾸려는 숨김 항목을 제거해야합니다.

$ git stash drop stash@{1}
Dropped stash@{1} (af8fdeee49a03d1b4609f294635e7f0d622e03db)

이제 삭제 후 반환 된 커밋 sha를 사용하여 새 메시지로 다시 추가하십시오.

$ git stash store -m "Very descriptive message" af8fdeee49a03d1b4609f294635e7f0d622e03db

그리고 그게 다야:

$ git stash list
stash@{0}: Very descriptive message
stash@{1}: WIP on master: Add some very important feature

이 솔루션에는 git 1.8.4 이상이 필요하며 더러워진 작업 디렉토리에서도 작동합니다.


3
git show stash@{0}여전히 이전 정보를 보여줍니다. 그것을 고치는 방법? (스 태시는 다른 SHA를 얻습니다.)
Tino

4
해시를 git show시작하고 시작하는 것이 git stash store좋습니다. 그러면 git stash list당신 과 함께 오래된 것과 새로운 은신처가 보일 것입니다. 마지막으로을 (를) 사용하여 기존 숨김을 정리할 수 있습니다 git stash drop.
hogi

6
git stash drop이 변경 사항을 잃지 않습니까?
Shravya Boggarapu

4
@ShravyaBoggarapu, no, git git gc은 실행될 때까지 커밋을 제거하지 않습니다 . 후에 stash drop당신은 쉽게 찾을 수 있습니다 일반적으로 액세스하여 커밋 git fsck | grep commit명령을 사용합니다.
qzb

2
@ ÐerÆndi 단순히 적용하고 저장하는 것은 쉬운 옵션이지만 충돌로 인해 변경 사항을 다시 적용 할 수없는 경우에는 작동하지 않습니다. 그 동안 어떤 상황에서도 보관 및 보관이 가능합니다. 내 솔루션을 다시 한 번 테스트했습니다. 최신 git 버전 (2.17.0)에서 제대로 작동합니다.
qzb

62

수동으로 수행하거나 Git 개선에 기여하지 않는 한 별칭을 사용할 수 있습니다.

git config --global alias.stash-rename '!_() { rev=$(git rev-parse $1) && git stash drop $1 || exit 1 ; git diff-index --quiet HEAD; s=$?; [ $s != 0 ] && git stash save "tmp stash from stash-rename"; git stash apply $rev && shift && git stash save "$@" && [ $s != 0 ] && git stash pop stash@{1}; }; _'

사용법 : "git stash-rename <stash> [save options] [<message>]"

[save options]의 옵션 git stash save:[-p|--patch] [-k|--[no-]keep-index] [-q|--quiet] [-u|--include-untracked] [-a|--all]

예:

$ git stash list
stash@{0}: On master: Pep8 format
stash@{1}: On master: co other than master with local changes
stash@{2}: On master: tests with deployAtEnd

# Let's say I want to rename the stash@{2} adding an issue reference:
$ git stash-rename stash@{2} NXP-13971-deployAtEnd

$ git stash list
stash@{0}: On master: NXP-13971-deployAtEnd
stash@{1}: On master: Pep8 format
stash@{2}: On master: co other than master with local changes

로컬 스테이지되지 않은 변경 사항이 있어도 작동합니다. :)

2016/02/22 수정

단순화 된 스크립트, qzb의 크레딧 , https://stackoverflow.com/a/35549615/515973

git config --global alias.stash-rename '!_() { rev=$(git rev-parse $1) && git stash drop $1 || exit 1 ; git stash store -m "$2" $rev; }; _'

사용법 : " git stash-rename <stash> [<message>]"


1
대박! 가능하다면 더 시원해git stash-rename 'tests with deployAtEnd' 'NXP-13971-deployAtEnd'
mikemaccana

3
답은 1) 깨끗한 작업 복사본, 2) 이름을 바꾸려는 숨김을 적용, 3) 숨김 목록에서 삭제, 4) 올바른 메시지로 새 숨김을 만듭니다.
gcb dec

2
명확히하기 위해 마지막 숨김의 이름을 바꾸고 있으며 그러한 조치 후에 최상위 숨김이됩니까?
onebree

2
스 태쉬를 삭제하여 이름을 바꾸고 현재 변경 사항이있는 경우 저장하고 삭제 된 스 태쉬를 원하는 이름으로 다시 작성하고 현재 변경 사항이있는 경우 다시 적용하십시오.
Julien Carsique

3
이 버전은 두 인수가 모두 있는지 확인하여 실수로 마지막 숨김을 삭제하지 않습니다. 또한 전체 stash@{0}참조가 아닌 숨김 번호 만 필요합니다 . gist.github.com/jdforsythe/f248bf6c72fc020225cc3e315a32e922 git config --global alias.stash-rename '!_() { if [ -z \"$1\" ] || [ -z \"$2\" ]; then echo \"git stash-rename 0 NewName\" && echo \"\" && git stash list && exit 1; else stash=\"stash@{$1}\"; rev=$(git rev-parse \"${stash}\"); git stash drop \"${stash}\" || exit 1; git stash store -m \"$2\" \"$rev\" || exit 1; git stash list; fi }; _'
jdforsythe

6

매우 간단합니다. 먼저 다음을 사용하여 마지막 숨김을 취소하십시오.

git stash pop

그런 다음, 다음과 같은 방법으로 숨김을 사용자 정의 이름으로 저장할 수 있습니다.

git stash save "your explanatory name"

도움이 되길 바랍니다. :)


이름이 바뀐 숨김이 최신이 아닐 수 있습니다.
mikemaccana

가장 최근의 숨김에 대해 이보다 더 직설적이므로 (최대 만) 표시됩니다.
Kaihua

3

그렇게 할 수 있다고 생각하지 않습니다. 숨김 이름 바꾸기대한 제안이 있었지만 아직 구현되지 않았습니다.

내 일반적인 아이디어는 다음과 같습니다

  1. git reflog update특정 reflog 항목과 연관된 메시지를 업데이트 하는 새 명령을 구현 하십시오. 이를 위해 새로운 update_reflog_ent()기능 ( reflog.c )은 업데이트 할 특정 reflog 항목과 관련된 메시지를 변경합니다. update_reflog()기능을 사용하는 것 for_each_reflog_ent()update_reflog_ent실제로 변화를 수행합니다.

  2. git stash rename명령 만 호출 할 필요가 git reflog update적절한 심판과 새 메시지와 함께.

또는 당신은 물론 숨길 수 있고 git stash save [message]


3

독자의 이익을 위해 여기 에 현재 허용되고 정답에 대한 확장이 있습니다. 입니다.

스 태쉬 메시지를 정정 할뿐만 아니라 스 태쉬의 커밋 메시지도 정정하려는 경우,

git stash list

git log --oneline -1 stash

둘 다 표시되는 것에 동의하며 조금 더 필요합니다. 더 좋은 방법이있을 수 있지만 여기의 조리법은 이해하기 쉽습니다.

git commit --amend당신 이 할 수 있으려면 지점의 팁에 있어야합니다. 따라서 해결책은 다음과 같습니다.

git checkout -b scratch stash@{1}
git stash drop stash@{1}
git commit --amend -m "$MESSAGE"
git stash store -m "$MESSAGE" HEAD
git checkout master
git branch -D scratch

설명 :

  • "문제가있는 스 태쉬"에서 새 (아직 존재하지 않는) "스크래치"브랜치를 작성하고 전환하십시오.
  • 오래된 은신처를 제거하십시오. 우리는 여전히 지점에 이것을 가지고 있기 때문에 이것은 안전합니다.
  • 사용하다 git commit --amend커밋 메시지를 바꾸는 데 , "문제가있는 스 태쉬"의 SHA 변경
  • 에 따라 숨김을 보관하십시오. qzb의 답변
  • 다시 전환 ( "마스터"에서 온 것으로 가정) 및 정리

단점 :

  • 분기가 일시적으로 전환됩니다. 따라서이 레시피 git status --porcelain는 깨끗 할 때만 적용 할 수 있습니다 (읽기 : 아무것도 출력하지 않습니다)

  • 스 태쉬의 번호를 다시 매기므로 변경된 스 태시는 stash@{0}

  • 당신은 입력 할 필요가 $MESSAGE두 번 또는 일부 환경 변수를 사용 (예에서 : MESSAGE)

  • 사용하지 않는 지점 이름을 찾아야합니다.

분기를 전환하지 않고이를 수행하는 방법이 있지만 이것은이 답변의 범위를 벗어납니다.

git init scratch
cd scratch
for a in A B C D; do date >$a; git add $a; git commit -m $a; done
for a in X Y; do echo $a > Z; git stash save --all; done
git log --oneline --graph --decorate --all; git stash list

산출

*-.   e0e281b (refs/stash) WIP on master: 8bdcc32 D
|\ \  
| | * 4d62f52 untracked files on master: 8bdcc32 D
| * 096f158 index on master: 8bdcc32 D
|/  
* 8bdcc32 (HEAD, master) D
* c84c659 C
* 49bb2da B
* b1852c6 A
stash@{0}: WIP on master: 8bdcc32 D
stash@{1}: WIP on master: 8bdcc32 D

이제 커밋을 변경하지 않고 (참고 : 다음 SHA는 귀하의 측면에서 다릅니다) :

git stash drop stash@{1}
git stash store -m ...changed... 2fbf9007dfdfb95ae269a19e13b8b9ca3e24181c
git log --oneline --graph --decorate --all; git stash list

산출

*-.   2fbf900 (refs/stash) WIP on master: 8bdcc32 D
|\ \  
| | * 246dc5c untracked files on master: 8bdcc32 D
| * 80c5ea0 index on master: 8bdcc32 D
|/  
* 8bdcc32 (HEAD, master) D
* c84c659 C
* 49bb2da B
* b1852c6 A
stash@{0}: ...changed...
stash@{1}: WIP on master: 8bdcc32 D

당신이 볼 수 있듯이, stash@{0}여전히으로 표시됩니다 2fbf900 (refs/stash) WIP on master: 8bdcc32 Dgit log . 주의 깊게 살펴보면 여러 커밋이 SHA를 변경 한 것을 알 수 있습니다. 이는 숨김이 처리되는 방식 때문입니다 (부모는 SHA에 포함되며 숨김은 부모로 있음).

그것을 고치십시오 :

git checkout -b scratch stash
git stash drop
git commit --amend -m ...changed...
git stash store -m ...changed... HEAD
git checkout master
git branch -D scratch
git log --oneline --graph --decorate --all; git stash list

산출

*-.   4d55186 (refs/stash) ...changed...
|\ \  
| | * 246dc5c untracked files on master: 8bdcc32 D
| * 80c5ea0 index on master: 8bdcc32 D
|/  
* 8bdcc32 (HEAD, master) D
* c84c659 C
* 49bb2da B
* b1852c6 A
stash@{0}: ...changed...
stash@{1}: WIP on master: 8bdcc32 D

보시다시피 refs/stashSHA도 변경되었습니다.


언급 할 가치가 있습니다. 이렇게하면 원래 숨김으로 저장된 인덱스가 삭제되고 원래 숨김의 상위 커밋과 일치하는 새 인덱스로 대체됩니다. 원래 저장된 인덱스를 사용하지 않으려는 경우 (또는 이미 원래 숨김의 상위와 일치 한 경우) 이는 문제가되지 않습니다.
torek

1

다음은 일반적으로 숨김 이름 앞에 붙는 접두사 를 올바르게 처리 할 수있는 Julien 별칭의 수정 된 버전입니다 On <branch>.

git config --global alias.stash-rename '!_() { newmsg="$1" && stash=${2:-"stash@{0}"} && newbranch="$3" && sha=$(git rev-parse "$stash") && olddesc="$(git stash list --format=%gs -1 "$stash")" && newdesc="$(if [[ "$newbranch" = "." ]]; then echo "$newmsg"; else if [[ -n "$newbranch" ]]; then echo "On $newbranch: $newmsg"; else if [[ "$olddesc" =~ ":" ]]; then echo "$(echo "$olddesc" | cut -f1 -d":"): $newmsg"; else echo "$newmsg"; fi; fi; fi)" && git stash drop "$stash" > /dev/null || exit 1; git stash store -m "$newdesc" "$sha" && git stash list; }; _'

통사론:

git stash-rename <new-name> [<stash> [<new-branch-name> | .]]

사용법 예 :

repo[master] % touch tmp && git add tmp && git stash save first
Saved working directory and index state On master: first
HEAD is now at bd62064 Initial commit
repo[master] % touch tmp && git add tmp && git stash save second
Saved working directory and index state On master: second
HEAD is now at bd62064 Initial commit
repo[master] % git stash list
stash@{0}: On master: second
stash@{1}: On master: first
repo[master] % git stash-rename renamed
stash@{0}: On master: renamed
stash@{1}: On master: first
repo[master] % git stash-rename also-renamed stash@{1}
stash@{0}: On master: also-renamed
stash@{1}: On master: renamed
repo[master] % git stash-rename branch-changed stash@{0} new-branch
stash@{0}: On new-branch: branch-changed
stash@{1}: On master: renamed
repo[master] % git stash-rename branch-name-persists
stash@{0}: On new-branch: branch-name-persists
stash@{1}: On master: renamed
repo[master] % git stash-rename no-branch stash@{0} .
stash@{0}: no-branch
stash@{1}: On master: renamed
repo[master] % git stash-rename renamed
stash@{0}: renamed
stash@{1}: On master: renamed
repo[master] % git stash-rename readd-branch stash@{0} develop
stash@{0}: On develop: readd-branch
stash@{1}: On master: renamed

대부분의 명령은 인수를 구문 분석하고 브랜치 이름에 수행해야 할 작업을 파악하기위한 것입니다. git다음과 같이 사용 도구는 다음과 같습니다

  • git rev-parse <stash> 은신처의 SHA를 찾기 위해.
  • git stash list --format=%gs -1 <stash>은신처 의 reflog 주제 를 찾기 위해 . 이는이 명령으로 변경되지 않는 숨김 의 커밋 메시지 와 다릅니다 . reflog 주제는에 표시 git stash list되며 stashe와 연관된 커밋의 해시를 변경하지 않고 reflog 주제를 변경할 수 있습니다. 그러나 항상 원본 커밋 메시지를 찾을 수 있으므로 git stash-rename민감한 정보를 제거 하는 데 사용하지 마십시오 !
  • git stash drop <stash>이전 참조 를 숨김 으로 삭제합니다 (그러나 여전히 SHA가 있으므로 손실되지 않습니다).
  • git stash store -m <new-message> <sha>커밋 정보는 같지만 다른 reflog 주제 를 사용하여 숨김에 대한 새 참조 를 저장합니다 .
  • git stash list작업이 완료된 후 스 태시를 나열합니다. 새로운 스 태시는 항상 목록의 시작 부분으로 푸시됩니다. 원래 위치를 복원하기 위해 관심 스 태쉬 전에 모든 스 태쉬 를 다시 밀어야 합니다 .

0

가장 간단한 방법 : git stash pop으로 숨김을 팝 한 다음 git stash로 다시 저장하십시오. 이름을 저장하십시오.


이름이 바뀐 숨김이 최신이 아닐 수 있습니다.
mikemaccana
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.