Как восстановить сохраненные незафиксированные изменения
У меня были некоторые незафиксированные изменения в моей ветке развития, и я спрятал их с помощью git stash, но были некоторые изменения,которые были очень важны среди этих припрятанных. Есть ли способ вернуть эти изменения?
кроме того, с тех пор я внес некоторые изменения поверх спрятанных файлов кода.
есть ли шанс, что я могу получить спрятанные изменения в новую ветку, если это возможно?
3 ответов:
простой ответ на простой вопрос
git stash applyпросто проверьте ветку, в которой вы хотите внести изменения, а затем
git stash apply. Тогда используйтеgit diffчтобы увидеть результат.после того как вы все сделали с вашими изменениями -
applyвыглядит хорошо, и вы уверены, что вам больше не нужен тайник-затем использоватьgit stash drop, чтобы избавиться от него.я всегда предлагаю использовать
git stash apply, а неgit stash pop. Разница в том, чтоapplyоставляет тайник вокруг для легкой повторной попыткиapply, или для смотреть, etc. Еслиpopспособен извлечь тайник, он будет немедленно такжеdropэто, и если вы вдруг поймете, что вы хотели извлечь его где-то еще (в другой ветке), или с--indexили что-то в этом роде, это не так просто. Если выapply,вы получить, чтобы выбрать, когдаdrop.это все довольно незначительно так или иначе, хотя, и для новичка git, это должно быть о тот же. (И вы можете пропустить все остальное!)
что делать, если вы делаете более продвинутые или более сложные вещи?
есть по крайней мере три или четыре различных "способа использования 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- ed и / илиgit rm- ed конкретные биты вашего кода перед запускомgit stash save. У вас была одна версия в скрытом индексе/промежуточной области, а другая (другая) версия в рабочем дереве. Вы хотите сохранить все это. Так что теперь вы используетеgit stash apply --index, и это иногда терпит неудачу с:Conflicts in index. Try without --index.вы используете
git stash save --keep-indexдля того, чтобы проверить "что будет совершено". Это выходит за рамки этого ответа; см. этот других сайте StackOverflow ответ вместо.для сложных случаев я рекомендую сначала начать с "чистого" рабочего каталога, зафиксировав любые изменения, которые у вас есть сейчас (на новой ветке, если хотите). Таким образом, "где-то", что вы их применяете, не имеет ничего другого в нем, и вы просто будете пробовать спрятанные изменения:
git status # see if there's anything you need to commit # uh oh, there is - let's put it on a new temp branch git checkout -b temp # create new temp branch to save stuff git add ... # add (and/or remove) stuff as needed git commit # save first set of changesтеперь вы находитесь на" чистой " отправной точке. Или, может быть, это больше похоже на это:
git status # see if there's anything you need to commit # status says "nothing to commit" git checkout -b temp # optional: create new branch for "apply" git stash apply # apply stashed changes; see below about --indexв главное, помнить, что "заначка" и фиксация, это просто немного "смешная/странная" фиксация, которая не "на ветке". Элемент
applyоперация смотрит на то, что фиксация изменилась, и пытается повторить его, где бы вы сейчас ни находились. Тайник все еще будет там (applyдержит его вокруг), так что вы можете посмотреть на него больше, или решить, что это было неправильное место дляapplyэто и попробуйте еще раз по-другому, или что-то еще.
в любое время у вас есть тайник, вы можете использовать
git stash show -pчтобы увидеть упрощенную версию того, что находится в тайнике. (Эта упрощенная версия смотрит только на изменения "final work tree",не сохраненный индекс изменяет это--indexвосстанавливает отдельно.) Командаgit stash apply, без--index, просто пытается сделать эти то же самое изменения в вашем рабочем каталоге сейчас.это верно, даже если у вас уже есть некоторые изменения. Элемент
applyкоманда рада применить тайник к изменен рабочий каталог (или, по крайней мере, попытаться применить его). Вы можете, например, сделать так:git stash apply stash # apply top of stash stack git stash apply stash@{1} # and mix in next stash stack entry tooвы можете выбрать порядок "применить" здесь, выбирая конкретные тайники для применения в определенной последовательности. Обратите внимание, однако, что каждый раз, когда вы в основном делаете "слияние git", и как предупреждает документация слияния:
выполняется слияние git с нетривиальными незафиксированными изменениями обескураженный: хотя это возможно, это может оставить вас в состоянии, которое трудно назад в случае конфликта.
если вы начинаете с чистого каталога и просто делают несколько
git applyоперации, это легко отступить: используйтеgit reset --hard, чтобы вернуться в исходное состояние, и изменить свойapplyоперации. (Вот почему я рекомендую начать с чистого рабочего каталога сначала, для этих сложных случаев.)
как насчет самого худшего из возможных случаев?
Допустим ты делая много продвинутых вещей Git, и вы сделали тайник, и хотите
git stash apply --index, но это больше не возможно применить сохраненный тайник с--index, потому что ветка слишком сильно разошлась с тех пор, как вы ее сохранили.это
git stash branchдля.если вы:
- проверьте точной фиксации вы были на, когда вы сделали оригинал
stash, потом- создать новую ветку, и наконец-то
git stash apply --indexпопытка воссоздать изменения определенно будет работа. Вот что
git stash branch newbranchделает. (И затем он сбрасывает тайник, так как он был успешно применен.)
несколько последних слов о
--index(что это за чертовщина?)какого
--indexделает это просто объяснить, но немного сложно внутренне:
- когда у вас есть изменения, вы должны
git add(или "этап") их передcommiting.- таким образом, когда вы запускали
git stash, вы может отредактировал оба файлаfooиzorg, но только поставил один из них.- поэтому, когда вы просите вернуть тайник, было бы неплохо, если бы это
git addсaddЭд вещи и делает неgit addне добавлены вещи. То есть, если выaddЭдfooа неzorgобратно, прежде чем вы сделалиstash, было бы неплохо имейте ту же самую установку. То, что было поставлено, должно быть снова поставлено; то, что было изменено, но не поставлено, должно быть снова изменено, но не поставлено.The
--indexфлагapplyпытается настроить вещи таким образом. Если ваше рабочее дерево чисто, это обычно просто работает. Если ваша работа-дерево уже есть вещиaddЭд, однако, вы можете видеть, как здесь могут быть некоторые проблемы. Если вы оставите--indexнаapplyоперация не пытается сохранить целое поэтапная / неустановленная настройка. Вместо этого он просто вызывает механизм слияния git, используя фиксацию рабочего дерева в "заначка сумка". Если вы не заботитесь о сохранении staged / unstaged, оставляя--indexделает его намного проще дляgit stash applyделать свое дело.
git stash popвернет все на свои места
как предложено в комментариях, вы можете использовать
git stash branch newbranchчтобы применить тайник к новой ветке, которая совпадает с запуском:git checkout -b newbranch git stash pop
чтобы сделать это простым, у вас есть два варианта, чтобы повторно применить свой тайник:
git stash pop- восстановление обратно в сохраненное состояние, но он удаляет тайник из временного хранилища.git stash apply- восстановление обратно в сохраненное состояние и оставляет список тайников для возможного последующего повторного использования.вы можете прочитать более подробно о git stashes в этой статье.
Comments