Git stash с поэтапными файлами. Преобразует ли stash файлы staged в unstaged?

Я работал над большим набором изменений в базе кода. Некоторые изменения были инсценированы, другие-нет. Мне нужно было переключиться на другую ветку, но я не был готов совершить коммит, поэтому я спрятал свое текущее состояние с помощью git stash.

позже я пошел, чтобы применить мой тайник с,git stash apply. Тогда я побежал!--2-->. Я заметил, что мои постановочные изменения больше не появляются как "постановочные", а вместо этого включаются как "изменения, не поставленные для фиксации". Я прав в своем понимание того, что данные фактически не были потеряны, но вместо этого "поэтапные" данные теперь просто преобразуются в "неучтенные" данные?

EDIT: я должен добавить, что некоторые из файлов, о которых идет речь, имели поэтапные версии и неустановленные версии во время тайника. Например, в файле A были внесены некоторые изменения, которые были поэтапными. Затем были внесены еще некоторые изменения в файл A, который еще не был инсценирован. Затем была сделана заначка.

3 ответов


ответ на заданный вопрос ("преобразует ли stash поэтапные файлы в unstaged") - и да, и нет.

если вы подали заявку с git stash apply (vs git stash pop), вы в отличной форме, потому что заначка все еще присутствует. Но давайте вернемся немного назад и посмотрим на основной механизм, поскольку он имеет значение здесь.

при выполнении git stash save (или обычный git stash что значит save), git делает два1 коммиты, которые не находятся ни на одной ветке. Один коммит держит состояние индекса, то есть все, что вы поставили. Вторая фиксация содержит состояние дерева работы, т. е. все остальное.

позднее, когда вы используете git stash apply, ГИТ smushes меняется вместе, так что ничего не устроили, если добавить --index2 до apply операция, в этом случае она восстанавливает (если может) ваше предыдущее расположение staged vs unstaged.

при использовании apply, сценарий stash сохраняет фиксации stash вокруг, а также, Так что если применить не идет так, как вы хотели-в том числе, если вы забыли --index или с ошибкой (см. сноску 2) - Вы можете git reset --hard (предполагая, что у вас все было в чистом состоянии, когда вы начали, в любом случае) и повторите apply.

если вы использовали pop, хотя, и git думает, что приложение сработало, он затем бросает заначку. Я обычно рекомендую использовать отдельные apply и drop именно по этой причине.


1С -u или -a, которые сохраняют не только поставленные и неустановленные файлы, но также игнорируются и / или все файлы, сценарий stash делает три commits. Однако без этих флагов такие файлы не попадают ни в одну из частей тайника.

2смущающе, сценарий stash также имеет --keep-index флаг, который он позволяет указать для apply операции, но не имеет смысла есть. Вместо --keep-index влияет на то, что stash не сделав его специальная заначка совершает. Иногда я случайно делал git stash apply --keep-index вместо git stash apply --index, перепутав два варианта.


нет, никаких изменений не было потеряно.

Acc. к документация:

Git повторно изменяет файлы, которые вы разблокировали при сохранении тайника. В этом случае у вас был чистый рабочий каталог, когда вы пытались применить тайник, и вы пытались применить его в той же ветви, из которой вы его сохранили; но наличие чистого рабочего каталога и применение его в той же ветви не обязательно для успешного применения тайника. Вы можете сохранить тайник на одном ветвь, переключитесь на другую ветвь позже и попробуйте повторно применить изменения. Вы также можете иметь измененные и незафиксированные файлы в своем рабочем каталоге при применении stash-Git дает вам конфликты слияния, если что-либо больше не применяется чисто.

изменения в ваших файлах были повторно применены, но файл, который вы поставили раньше не переставал. Для этого необходимо запустить git stash apply команда с параметром --index, чтобы сообщить команде, чтобы попытаться повторно применить поэтапного изменения. Если вы если бы ты запустил его вместо этого, ты бы получил вернитесь в исходное положение:

$ git stash apply --index
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#      modified:   index.html
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#
#      modified:   lib/simplegit.rb
#

Да, ваше мышление является правильным. Это описано в следующих разделах man git-stash:

Use git stash when you want to record the current state of the working
directory and the index, but want to go back to a clean working
directory. The command saves your local modifications away and reverts
the working directory to match the HEAD commit.

(...)

pop [--index] [-q|--quiet] [<stash>] Remove a single stashed
           state from the stash list and apply it on top of the
           current working tree state, i.e., do the inverse operation
           of git stash save. The working directory must match the
           index.

           (...)

           If the --index option is used, then tries to reinstate not
           only the working tree’s changes, but also the index’s
           ones.

(...)

apply [--index] [-q|--quiet] [<stash>]
           Like pop, but do not remove the state from the stash list.