Как восстановить сохраненные незафиксированные изменения



У меня были некоторые незафиксированные изменения в моей ветке развития, и я спрятал их с помощью git stash, но были некоторые изменения,которые были очень важны среди этих припрятанных. Есть ли способ вернуть эти изменения?



кроме того, с тех пор я внес некоторые изменения поверх спрятанных файлов кода.



есть ли шанс, что я могу получить спрятанные изменения в новую ветку, если это возможно?

816   3  

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", "легкий путь":

  1. вы начали с чистой ветви, работали над некоторыми изменениями, а затем поняли, что вы делаете их в неправильной ветви. Вы просто хотите принять изменения, которые у вас есть сейчас и "сдвинуть" их в другую ветку.

    это простой случай, описанный выше. Беги git stash save (или обычный git stash, то же самое). Проверьте другую ветку и используйте git stash apply. Это заставляет git сливаться в ваших более ранних изменениях, используя довольно мощный механизм слияния git. внимательно проверьте результатыgit diff) чтобы узнать, нравятся ли они вам, и если да, используйте git stash drop падение заначку. Все кончено!

  2. вы начали некоторые изменения и спрятали их. Затем вы переключились на другую ветку и начали больше изменений, забыв, что у вас есть припрятанные.

    теперь вы хотите сохранить, или даже пошевелиться, эти изменения и применить свой заначку.

    вы можете 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.)

  3. (Экстра-продвинутый) у вас есть используется git stash save -p, или git add - ed и / или git rm - ed конкретные биты вашего кода перед запуском git stash save. У вас была одна версия в скрытом индексе/промежуточной области, а другая (другая) версия в рабочем дереве. Вы хотите сохранить все это. Так что теперь вы используете git stash apply --index, и это иногда терпит неудачу с:

    Conflicts in index.  Try without --index.
    
  4. вы используете 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 для.

если вы:

  1. проверьте точной фиксации вы были на, когда вы сделали оригинал stash, потом
  2. создать новую ветку, и наконец-то
  3. 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

чтобы сделать это простым, у вас есть два варианта, чтобы повторно применить свой тайник:

  1. git stash pop - восстановление обратно в сохраненное состояние, но он удаляет тайник из временного хранилища.
  2. git stash apply - восстановление обратно в сохраненное состояние и оставляет список тайников для возможного последующего повторного использования.

вы можете прочитать более подробно о git stashes в этой статье.

Comments

    Ничего не найдено.