間違った名前の隠し場所があります。名前が正確になるように修正したいと思います。
スタッシュの名前を変更するにはどうすればよいですか?
スタッシュリストが次のようになっていると仮定しましょう。
$ git stash list
stash@{0}: WIP on master: Add some very important feature
stash@{1}: WIP on master: Fix some silly bug
最初に、名前を変更するstashエントリを削除する必要があります。
$ 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の改善に貢献しない限り、エイリアスを使用できます。
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/51597
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>]
」
そうすることは不可能だと思います。 stashの名前変更の提案 がありましたが、まだ実装されていません。
私の一般的なアイデアは次のとおりです。
特定のreflogエントリに関連付けられたメッセージを更新する新しい
git reflog update
コマンドを実装します。これを行うには、新しいupdate_reflog_ent()
関数(reflog.c)が特定のreflogエントリに関連付けられたメッセージを更新するように変更します。update_reflog()
関数は、update_reflog_ent
とともにfor_each_reflog_ent()
を使用して、実際に変更を行います。
git stash rename
コマンドは、適切なrefと新しいメッセージでgit reflog update
を呼び出すだけで済みます。
または、もちろん、隠し場所をポップしてgit stash save [message]
を実行することもできます
読者の利益のために、ここに 現在受け入れられている正解への拡張 があります。
Stashメッセージを修正するだけでなく、stashのコミットメッセージも修正する場合は、次のようにします。
git stash list
そして
git log --oneline -1 stash
どちらも表示されている内容に同意するため、もう少し必要です。もっと良い方法があるかもしれませんが、このレシピは理解しやすいと思います。
git commit --amend
を実行するには、ブランチのTIPに参加する必要があります。したがって、解決策は次のとおりです。
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
を2回入力するか、環境変数を使用する必要があります(例では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}
はgit log
で2fbf900 (refs/stash) WIP on master: 8bdcc32 D
として表示されます。注意深く見ると、いくつかのコミットが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サブジェクトを見つけます。これは、スタッシュのcommitメッセージとは異なることに注意してください。このコマンドでは変更されません。 reflogサブジェクトはgit stash list
に表示されるものであり、スタッシュに関連付けられたコミットのハッシュを変更せずにreflogサブジェクトを変更できます。ただし、元のコミットメッセージはいつでも見つけることができるため、git stash-rename
を使用して機密情報を削除しないでください。git stash drop <stash>
は、古い参照をスタッシュにドロップします(ただし、SHAがまだあるため、失われません)。git stash store -m <new-message> <sha>
は、同じコミット情報で異なるreflogサブジェクトを持つスタッシュへの新しい参照を保存します。git stash list
は、操作が終了した後の隠し場所をリストします。新しいスタッシュは常にリストの先頭にプッシュされることに注意してください。元の位置に戻すには、対象のスタッシュの前にスタッシュを再プッシュallする必要があります。とても簡単です。最初に、最後の隠し場所を元に戻します:
git stash pop
この後、この方法でスタッシュをカスタマイズした名前で保存できます。
git stash save "your explanatory name"
役に立つことを願っています。 :)
最も簡単な方法:git stash popでスタッシュをポップし、git stash save your-nameで再度保存します