답변:
숨김 목록이 다음과 같다고 가정 해 봅시다.
$ 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 이상이 필요하며 더러워진 작업 디렉토리에서도 작동합니다.
git show stash@{0}
여전히 이전 정보를 보여줍니다. 그것을 고치는 방법? (스 태시는 다른 SHA를 얻습니다.)
git show
시작하고 시작하는 것이 git stash store
좋습니다. 그러면 git stash list
당신 과 함께 오래된 것과 새로운 은신처가 보일 것입니다. 마지막으로을 (를) 사용하여 기존 숨김을 정리할 수 있습니다 git stash drop
.
git gc
은 실행될 때까지 커밋을 제거하지 않습니다 . 후에 stash drop
당신은 쉽게 찾을 수 있습니다 일반적으로 액세스하여 커밋 git fsck | grep commit
명령을 사용합니다.
수동으로 수행하거나 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
로컬 스테이지되지 않은 변경 사항이 있어도 작동합니다. :)
단순화 된 스크립트, 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>]
"
git stash-rename 'tests with deployAtEnd' 'NXP-13971-deployAtEnd'
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 }; _'
매우 간단합니다. 먼저 다음을 사용하여 마지막 숨김을 취소하십시오.
git stash pop
그런 다음, 다음과 같은 방법으로 숨김을 사용자 정의 이름으로 저장할 수 있습니다.
git stash save "your explanatory name"
도움이 되길 바랍니다. :)
그렇게 할 수 있다고 생각하지 않습니다. 숨김 이름 바꾸기 에 대한 제안이 있었지만 아직 구현되지 않았습니다.
내 일반적인 아이디어는 다음과 같습니다
git reflog update
특정 reflog 항목과 연관된 메시지를 업데이트 하는 새 명령을 구현 하십시오. 이를 위해 새로운update_reflog_ent()
기능 ( reflog.c )은 업데이트 할 특정 reflog 항목과 관련된 메시지를 변경합니다.update_reflog()
기능을 사용하는 것for_each_reflog_ent()
과update_reflog_ent
실제로 변화를 수행합니다.
git stash rename
명령 만 호출 할 필요가git reflog update
적절한 심판과 새 메시지와 함께.
또는 당신은 물론 숨길 수 있고 git stash save [message]
독자의 이익을 위해 여기 에 현재 허용되고 정답에 대한 확장이 있습니다. 입니다.
스 태쉬 메시지를 정정 할뿐만 아니라 스 태쉬의 커밋 메시지도 정정하려는 경우,
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 변경단점 :
분기가 일시적으로 전환됩니다. 따라서이 레시피 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 D
에git 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/stash
SHA도 변경되었습니다.
다음은 일반적으로 숨김 이름 앞에 붙는 접두사 를 올바르게 처리 할 수있는 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
작업이 완료된 후 스 태시를 나열합니다. 새로운 스 태시는 항상 목록의 시작 부분으로 푸시됩니다. 원래 위치를 복원하기 위해 관심 스 태쉬 전에 모든 스 태쉬 를 다시 밀어야 합니다 .가장 간단한 방법 : git stash pop으로 숨김을 팝 한 다음 git stash로 다시 저장하십시오. 이름을 저장하십시오.