У меня были некоторые незафиксированные изменения в моей ветке разработки, и я спрятал их, используя git stash
некоторые изменения, которые были очень важны среди этих спрятанных. Есть ли способ вернуть эти изменения?
Кроме того, с тех пор я внес некоторые изменения в файлы с сохраненным кодом.
Есть ли шанс, что я смогу получить спрятанные изменения в новую ветку, если это возможно?
Ответы:
Простой ответ на простой вопрос
git stash apply
Просто проверьте ветку, в которой вы хотите внести изменения, а затем
git stash apply
. Затем используйте,git diff
чтобы увидеть результат.После того, как вы все сделали со своими изменениями -
apply
выглядит хорошо, и вы уверены, что вам больше не нужен тайник - затем используйте,git stash drop
чтобы избавиться от него.Я всегда предлагаю использовать,
git stash apply
а неgit stash pop
. Разница в том, что выapply
оставляете тайник для повторной попыткиapply
, или для просмотра, и т. Д. Еслиpop
удастся извлечь тайник, он сразу же получитdrop
его, и если вы вдруг поймете, что хотели где-то извлечь его иначе (в другой ветке), или с--index
, или с некоторыми другими , это не так просто. Если выapply
, вы можете выбрать, когдаdrop
.Это все довольно незначительно, так или иначе, и для новичка, чтобы быть мерзавцем, это должно быть примерно таким же. (И вы можете пропустить все остальное!)
Что делать, если вы делаете более продвинутые или более сложные вещи?
Существует как минимум три или четыре разных «способа использования git stash». Выше для «способ 1», «легкий путь»:
Вы начали с чистой ветки, работали над некоторыми изменениями, а затем поняли, что делаете их не в той ветке. Вы просто хотите принять изменения, которые у вас есть, и «переместить» их в другую ветку.
Это простой случай, описанный выше. Беги
git stash save
(или просто такgit stash
же). Проверьте другую ветку и используйтеgit stash apply
. Это позволяет git слиться с вашими более ранними изменениями, используя довольно мощный механизм слияния git. Внимательно осмотрите результаты (сgit diff
), чтобы увидеть, нравятся ли они вам, и если вам это нравится, используйтеgit stash drop
для сброса тайника. Вы сделали!Вы начали некоторые изменения и спрятали их. Затем вы переключились на другую ветку и начали больше изменений, забыв, что у вас есть спрятанные.
Теперь вы хотите сохранить или даже перенести эти изменения, а также применить свой тайник.
Вы можете на самом деле
git stash save
снова, какgit stash
делает "стек" изменений. Если вы делаете это, у вас есть два тайника, один из которых просто называетсяstash
- но вы также можете написатьstash@{0}
- и один пишетсяstash@{1}
. Используйтеgit stash list
(в любое время), чтобы увидеть их все. Новейший всегда с самым низким номером. Когда выgit stash drop
, он сбрасывает самое новое, а тот, который был,stash@{1}
перемещается на вершину стека. Если у вас было еще больше, то, что было,stash@{2}
становитсяstash@{1}
и так далее.Можно
apply
и тоdrop
конкретный заначить тоже:git stash apply stash@{2}
и тд. Отбрасывание определенного тайника перенумеровывает только номера с большими номерами. Опять же, номер без номера тожеstash@{0}
.Если вы накапливаете много тайников, это может стать довольно грязным (тайник, который я хотел
stash@{7}
или былstash@{4}
? Подожди, я просто толкнул другой, теперь их 8 и 5?). Я лично предпочитаю перенести эти изменения в новую ветку, потому что у ветвей есть имена, и этоcleanup-attempt-in-December
значит для меня гораздо больше, чемstash@{12}
. (Командаgit stash
принимает необязательное сообщение сохранения, и они могут помочь, но каким-то образом все мои тайники просто названыWIP on branch
.)(Дополнительно) Вы использовали
git stash save -p
или тщательноgit add
отредактировали и / илиgit rm
отредактировали определенные биты своего кода перед запускомgit stash save
. У вас была одна версия в области сохраненного индекса / промежуточной области, а другая (другая) версия в рабочем дереве. Вы хотите сохранить все это. Так что теперь вы используетеgit stash apply --index
, и это иногда не удается с:Вы используете
git stash save --keep-index
для того, чтобы проверить «что будет совершено». Этот выходит за рамки этого ответа; см. этот другой ответ StackOverflow вместо этого.В сложных случаях я рекомендую сначала начать с «чистого» рабочего каталога, зафиксировав любые изменения, которые у вас есть сейчас (в новой ветке, если хотите). Таким образом, «где-то», к которому вы их применяете, больше ничего не имеет, и вы просто попробуете спрятанные изменения:
Теперь вы находитесь на «чистой» отправной точке. Или, может быть, это выглядит так:
Главное, что нужно помнить, это то, что «stash» - это коммит, это просто «смешной / странный» коммит, который не «на ветке». В
apply
операции смотрит на то , что коммит изменилось, и пытается повторить его там , где вы сейчас находитесь . Тайник все еще будет там (apply
хранит его), так что вы можете посмотреть на него больше или решить, что это было не то место,apply
и попробовать еще раз, или что-то еще.Каждый раз, когда у вас есть тайник, вы можете использовать
git stash show -p
упрощенную версию того, что находится в тайнике. (Эта упрощенная версия рассматривает только изменения «конечного рабочего дерева», а не сохраненные изменения индекса, которые--index
восстанавливаются отдельно.) Командаgit stash apply
без--index
этого сейчас просто пытается внести те же самые изменения в ваш рабочий каталог.Это верно, даже если у вас уже есть некоторые изменения. Команда
apply
рада применить тайник к измененному рабочему каталогу (или, по крайней мере, попытаться применить его). Вы можете, например, сделать это:Вы можете выбрать «применить» порядок здесь, выбирая определенные тайники для применения в определенной последовательности. Обратите внимание, однако, что каждый раз, когда вы в основном выполняете «git merge», и, как предупреждает документация по слиянию:
Если вы начинаете с чистого каталога и просто выполняете несколько
git apply
операций, отступить легко: используйтеgit reset --hard
для возврата в чистое состояние и измените своиapply
операции. (Вот почему я рекомендую начинать сначала с чистого рабочего каталога, для этих сложных случаев.)Как насчет самого худшего возможного случая?
Допустим, вы делаете «Много расширенного Git Stuff», и вы создали тайник, и хотите
git stash apply --index
, но с помощью этого хранилища больше нельзя применить--index
, потому что ветка слишком сильно разошлась со времени, когда вы ее сохранили.Это для чего
git stash branch
.Если ты:
stash
, затемgit stash apply --index
попытка заново создать изменения , безусловно , будет работать. Это то, что делает. (И затем он сбрасывает тайник, поскольку он был успешно применен.)
git stash branch newbranch
Несколько заключительных слов о том
--index
(что, черт возьми, это?)То, что
--index
делает, легко объяснить, но немного сложнее внутри:git add
(или «ставить») их перед использованиемcommit
.git stash
, вы могли редактировать оба файлаfoo
иzorg
, но только поставить один из них.git add
ВЛЯЕТСЯadd
ред вещи и вовсе неgit add
в не-добавлены вещи. То есть, если выadd
редактировали,foo
но неzorg
вернулись до того, как сделали этоstash
, было бы неплохо иметь точно такую же настройку. То, что было поставлено, должно быть снова поставлено; то, что было изменено, но не организовано, должно быть снова изменено, но не организовано.--index
Флагapply
пытается установить вещи таким образом. Если ваше дерево работы чистое, это обычно просто работает. Еслиadd
, однако, в вашем рабочем дереве уже есть материал ed, вы можете увидеть, что здесь могут быть некоторые проблемы. Если вы пропустите--index
,apply
операция не будет пытаться сохранить всю ступенчатую / не постановочную установку. Вместо этого он просто вызывает механизм слияния git, используя коммит рабочего дерева в «шкатулке» . Если вы не заботитесь о сохранении поэтапного / неустановленного сценария, упускать--index
его намного прощеgit stash apply
.источник
git stash pop
? Или вы имеете в виду: вы редактировали некоторые файлы, но еще не запускалисьgit stash
? Или ты имеешь в виду что-то совсем другое?apply
-не хранить тайник. Вам не нужно этого делать, но вам будет намного проще на это смотреть. Вы можете использовать,rebase -i
чтобы объединить несколько коммитов, или выбрать определенные изменения, или что-то еще, позже.git stash apply --index
(помните две черточки). Если вы пропустите--index
, ничего страшного; единственное,--index
что нужно - это сохранить постановку / постановку. (Скорее всего, у вас изначально не было никаких специальных настроек.) Затем иgit status
т. Д., И добавьте / подтвердите по желанию и т. Д. Когда (и только когда) вы все закончили с тайником, используйтеgit stash drop
для его отмены.drop
или не хранитеpop
) тайник, у вас всегда будет оригинальный исходный код в безопасности при коммите, потому что тайник - это коммит! Если вы хотите получить его обратно точно, но на ветке, используйтеgit stash branch
(см. Этот раздел выше или книгу Pro Git в ответе Шунии ). Вы можете затемgit checkout
эту ветку, илиgit cherry-pick
зафиксировать эту ветку и т. Д.вернет все на место
как предлагается в комментариях, вы можете использовать,
git stash branch newbranch
чтобы применить тайник к новой ветке, что аналогично запуску:источник
git stash branch newbranch
действительно сделает это; но имейте в виду, что он создает новую ветвь с родительским установленным значением для коммита, который былHEAD
на моментstash
выполнения. Другими словами, это когда вы возвращаетесь после долгой хакерской сессии или чего-то еще, смотрите на беспорядок и решаете: «Я должен был положить это на ветку, а не копить» :-)Чтобы сделать это простым, у вас есть два варианта для повторного применения вашего тайника:
git stash pop
- Восстановить обратно в сохраненное состояние, но он удаляет тайник из временного хранилища.git stash apply
- Восстановить обратно в сохраненное состояние и оставить список тайников для возможного последующего использования.Вы можете прочитать более подробно о git stashes в этой статье.
источник
Чтобы проверить ваш тайник: -
применить определенный тайник нет из списка тайников: -
или для применения только первого тайника: -
Примечание: git stash pop удалит тайник из вашего списка тайников, тогда как git stash будет применяться. Так что используйте их соответственно.
источник
На Mac это работает для меня:
git stash list (см. все ваши тайники)
git stash apply (только номер, который вы хотите из вашего списка тайников)
нравится:
источник
Вы можете спрятать незафиксированные изменения, используя "git stash", затем оформить заказ в новую ветку, используя "git checkout -b", затем применить спрятанные коммиты "git stash apply"
источник