Имейте в виду, что когда вы говорите «на текущем этапе», это подразумевает то, что вы явно не имеете в виду.(staged
означает «в индексе» в git-говорить; это определенно не включает в себя неотслеживаемые файлы - и не внесенные в них изменения в отслеживаемых файлах.)
Что касается какой команды использовать,Вы не должны использовать git stash save
;он устарел, поэтому вместо него следует использовать git stash push
.(push
- это значение по умолчанию, поэтому вам не нужно вообще называть какую-либо подкоманду при создании тайника.)
Я не уверен, что вы имеете в виду, как вы хотите обрабатывать игнорируемые файлы.Если вы хотите, чтобы игнорируемые файлы были включены в stash
git stash --all
, если вы не хотите, чтобы игнорируемые файлы в stash (и поэтому хотели, чтобы они оставались в рабочем дереве)
git stash -u
И когда вы apply
храните тайник, вам нужно сообщить git, что вы хотите восстановить индекс
git stash apply --index
Обратите внимание, что это работает только тогда, когда процесс применения хранилища не вызывает конфликтов;для этого использования он не должен конфликтовать, но если вы примените к другому коммиту, отличному от того, где был создан тайник, он может.
Чтобы создать ветку вместо тайника:
Здесь вы можете использовать ярлык, потому что тайник - это действительно набор коммитов со специально обработанной ссылкой.Таким образом, вы можете создать тайник как обычно, тогда
git checkout stash
git checkout -b my_branch
git stash drop
Ветвь будет выглядеть немного странно, потому что тайник использует слияния несколько необычным образом для сборки наборов изменений без отслеживания, без этапов и поэтапного изменения.
Если вы вообще не хотите использовать команду stash, тогда это сложнее.Вы можете фиксировать только поэтапные изменения, поэтому вам нужно будет сделать что-то вроде
git checkout -b my_branch
git commit -m "staged changes"
git commit -a -m "unstaged changes"
# if you want a commit with only the non-ignored
# untracked files
git add :/:
git commit -m "untracked files'
# if you want a single commit with all untracked
# files (ignored or not), then skip the previous
# command and run this; if you want a separate
# commit for ignored files, run the previous
# command and *then* run this:
git add -f :/:
git commit -m "ignored files"
(Обратите внимание, что вы можете даже объединить неустановленные, неотслеживаемые и игнорируемые файлы в один коммит (хотя stash делаетнет), но вам действительно нужно зафиксировать поэтапные изменения отдельно, чтобы позже можно было точно восстановить индекс.)
Затем необходимо восстановить рабочее состояние и продолжить работу.Точные команды зависят от того, какую из команд вы выполнили.Сначала вы хотите отсоединиться от своего подобного тайнику сарая
git checkout --detach
Затем восстановите индекс с поэтапными изменениями.Если вы создали все 4 коммита, это было бы
git reset --mixed HEAD~3
Если вы создали только один коммит для неотслеживаемых файлов
git reset --mixed HEAD~2
(Или, если вы создали только один коммит для неизмененных изменений и неотслеживаемых / игнорируемых файлов, это будет
git reset --mixed HEAD~1
или эквивалентный.)
Затем переместите HEAD
до конца пути от ветви
git reset --soft HEAD~1
Наконец, проверьте вашу рабочую ветку снова;например, если вы начали на мастере
git checkout master
После всего этого вы сохранили всю ту же информацию, что и тайник;но у вас все еще нет автоматизации команды stash, чтобы помочь вам, поэтому в будущем, если вы захотите восстановить это состояние снова, вам придется очистить рабочее дерево, проверить ветвь, похожую на stash, и повторитьснова вся процедура отсоединения / сброса / извлечения.
И если вы хотите применить эти изменения к другому базовому коммиту (стандартная функциональность для stash
), вам придется сначала перебазировать ветвь, подобную stash, кНовый коммит, а затем восстановите изменения там.