У меня есть смятие с неправильным именем. Я хотел бы исправить имя так, чтобы оно было точным.
Как переименовать кошелек?
У меня есть смятие с неправильным именем. Я хотел бы исправить имя так, чтобы оно было точным.
Как переименовать кошелек?
Предположим, что ваш тайник выглядит следующим образом:
$ git stash list
[email protected]{0}: WIP on master: Add some very important feature
[email protected]{1}: WIP on master: Fix some silly bug
Сначала вы должны удалить запись, которую хотите переименовать:
$ git stash drop [email protected]{1}
Dropped [email protected]{1} (af8fdeee49a03d1b4609f294635e7f0d622e03db)
Теперь просто добавьте его снова с новым сообщением, используя sha of commit, возвращенный после удаления:
$ git stash store -m "Very descriptive message" af8fdeee49a03d1b4609f294635e7f0d622e03db
И что он:
$ git stash list
[email protected]{0}: Very descriptive message
[email protected]{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 "[email protected]" && [ $s != 0 ] && git stash pop [email protected]{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
[email protected]{0}: On master: Pep8 format
[email protected]{1}: On master: co other than master with local changes
[email protected]{2}: On master: tests with deployAtEnd
# Let say I want to rename the [email protected]{2} adding an issue reference:
$ git stash-rename [email protected]{2} NXP-13971-deployAtEnd
$ git stash list
[email protected]{0}: On master: NXP-13971-deployAtEnd
[email protected]{1}: On master: Pep8 format
[email protected]{2}: On master: co other than master with local changes
Это будет работать, даже если у вас есть локальные неустановленные изменения:)
Упрощенный script, кредиты для qzb, fooobar.com/questions/53361/...
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 reflog update
, которая обновляет сообщение, связанное с определенной записью reflog. Для этого новая функцияupdate_reflog_ent()
(в reflog.c) изменит сообщение, связанное с конкретной записью reflog для обновления. Функцияupdate_reflog()
использовала быfor_each_reflog_ent()
сupdate_reflog_ent
для фактического изменения.Теперь команда
git stash rename
должна вызвать толькоgit reflog update
с соответствующим сообщением ref и новым сообщением.
Или вы могли бы, конечно, вскрыть тайник и сделать git stash save [message]
Для удобства читателя, это расширение принятого и правильного ответа.
Если вы не только хотите исправить сообщение о тайнике, но также хотите исправить сообщение о фиксации тайника, чтобы
git stash list
а также
git log --oneline -1 stash
оба согласны с тем, что показано, вам нужно немного больше. Возможно, есть лучший способ сделать это, но я надеюсь, что этот рецепт здесь легко понять.
Чтобы иметь возможность делать git commit --amend
вы должны быть в СОВЕТЕ ветки. Следовательно, решение:
git checkout -b scratch [email protected]{1}
git stash drop [email protected]{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
чистое (читай: ничего не выводится)
Он перенумеровывает тайники, поэтому измененный тайник становится [email protected]{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
[email protected]{0}: WIP on master: 8bdcc32 D
[email protected]{1}: WIP on master: 8bdcc32 D
Теперь без изменения фиксации (обратите внимание: SHA в следующем будет отличаться на вашей стороне):
git stash drop [email protected]{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
[email protected]{0}: ...changed...
[email protected]{1}: WIP on master: 8bdcc32 D
Как вы видите, [email protected]{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
[email protected]{0}: ...changed...
[email protected]{1}: WIP on master: 8bdcc32 D
Как вы также можете видеть, refs/stash
также изменил SHA.
Это очень просто. Во-первых, отмените последний тайник с:
git stash pop
После этого вы можете сохранить тайник с настроенным именем следующим образом:
git stash save "your explanatory name"
Я надеюсь, что это полезно для вас. :)
Ниже приведена измененная версия псевдонима Julien, которая позволяет корректно обрабатывать префикс On <branch>
, обычно добавляемый к именам штампов:
git config --global alias.stash-rename '!_() { newmsg="$1" && stash=${2:-"[email protected]{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
[email protected]{0}: On master: second
[email protected]{1}: On master: first
repo[master] % git stash-rename renamed
[email protected]{0}: On master: renamed
[email protected]{1}: On master: first
repo[master] % git stash-rename also-renamed [email protected]{1}
[email protected]{0}: On master: also-renamed
[email protected]{1}: On master: renamed
repo[master] % git stash-rename branch-changed [email protected]{0} new-branch
[email protected]{0}: On new-branch: branch-changed
[email protected]{1}: On master: renamed
repo[master] % git stash-rename branch-name-persists
[email protected]{0}: On new-branch: branch-name-persists
[email protected]{1}: On master: renamed
repo[master] % git stash-rename no-branch [email protected]{0} .
[email protected]{0}: no-branch
[email protected]{1}: On master: renamed
repo[master] % git stash-rename renamed
[email protected]{0}: renamed
[email protected]{1}: On master: renamed
repo[master] % git stash-rename readd-branch [email protected]{0} develop
[email protected]{0}: On develop: readd-branch
[email protected]{1}: On master: renamed
Большая часть команды предназначена для разбора аргументов и определения того, что должно быть сделано для имени ветки. Используемые инструменты git
:
git rev-parse <stash>
, чтобы найти SHA кошелька.git stash list --format=%gs -1 <stash>
, чтобы найти объект лока. Обратите внимание, что это отличается от сообщения фиксации кошелька, который не изменяется этой командой. Объект reflog - это то, что отображается в git stash list
, и вы можете изменить объект reflog без изменения хэшей коммитов, связанных с записями. Однако вы всегда можете найти исходное сообщение фиксации, поэтому не используйте git stash-rename
для удаления конфиденциальной информации!git stash drop <stash>
, чтобы удалить старую ссылку на stash (но у нас все еще есть SHA, поэтому она не потеряна).git stash store -m <new-message> <sha>
, чтобы сохранить новую ссылку на тайник с одной и той же информацией о фиксации, но с другим объектом reflog.git stash list
, чтобы перечислить скобки после завершения операции. Обратите внимание, что новые штампы всегда помещаются в начало списка. Чтобы восстановить исходное положение, необходимо повторно нажать все штампы перед интересом, чтобы восстановить свое первоначальное положение.Простейший способ: вытащите свой кошелек с помощью git stash pop, затем сохраните его снова с помощью git stash save your-name