2015-07-23 2 views
7

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

Позже я отправился подавать с собой, git stash apply. Затем я запустил git status. Я заметил, что мои поэтапные изменения больше не появлялись как «поставленные», и вместо этого они выглядели как «Изменения, не поставленные для фиксации». Правильно ли я понимаю, что данные фактически не были потеряны, но вместо этого «поставленные» данные теперь просто преобразуются в «неустановленные» данные?

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

ответ

9

Ответ на вопрос, как спросил («делает тайник новообращенный поставил файлы unstaged») и да, и нет.

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

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

Позже, когда вы используете git stash apply, мерзавец smushes изменений вместе, так что ничего не поставили, если вы не добавите --index к apply операции, в этом случае он восстанавливает (если это возможно) предыдущее расположение поставленный против неустановленного.

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

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


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

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

+1

Спасибо за подробный ответ torek. Теперь я лучше понимаю, что происходит. –

2

Да, ваше мышление верное. Это описано в следующих разделах 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. 
2

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

Acc. к documentation:

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

Изменения в ваших файлах были повторно применены, но файл, который вы поставили , не был восстановлен. Для этого вы должны запустить git stash применить команду с опцией -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 
# 
+0

Спасибо Pankaj. Я читал это, но я не был уверен, что прекрасно это понял. Спасибо за подтверждение. –

Смежные вопросы