Git stash single untracked file?
Вопрос:
У меня есть несколько отредактированных файлов, как указано ниже, а также у меня есть несколько вновь созданных файлов
Теперь я хочу спрятать неподписанный файл (в этом случае он db/migrate/20161212071336_add_paranoid_fields.rb
, но не спрятать измененные файлы).
Как мне это сделать?
Почему я хочу спрятать один файл без следа
Сначала я создал этот файл, а затем понял, что мне это не нужно немедленно (его нужно удалить, чтобы моя программа работала правильно); но мне может понадобиться это в будущем.
То, что я искал (и не дал мне ответа), и причина, по которой они не помогают
Ответы
Ответ 1
Если у вас есть только один неископанный файл, вы можете сделать:
git add -u
git stash --include-untracked --keep-index
И это добавит только скрытые файлы в stash и удалит их из рабочего каталога.
Если у вас несколько нетронутых файлов, и вы хотите включить только этот код в stash, тогда вам нужно будет совершить фиксацию, затем скрыть один файл, а затем reset
git add -u
git commit -m "temp commit"
git add my_file_to_stash
git stash
git reset --hard HEAD^
Трудно здесь, что, когда вы восстановите stash позже, этот файл будет добавлен в индекс. Это, наверное, хорошо, так как это напомнит вам, что этот файл важен.
Ответ 2
Отправляя информацию, предоставленную в других ответах, я создал script, git-stash-selection
, который я использую aliased для gsts
:
#!/bin/sh
#
# Git stash only a selection of files, with a message.
#
# Usage:
# git-stash-selection [<message>] [<paths>...]
message=$1
shift
stash_paths="$*"
git add --all
git reset $stash_paths
git commit --allow-empty -m "temp - excluded from stash"
git add --all
git stash save $message
git reset --soft HEAD^
git reset
Я предоставил полную информацию в другом ответе используемого метода и почему ряд более простых команд не работает.
Изменить: это может быть улучшено с помощью этого метода патчей вместо совершения. Или, может быть, с помощью другого тайника
Ответ 3
stash не предоставляет эту функцию. Поскольку вы хотите добиться того, чтобы этот файл был частью дополнительной разработки, его лучше всего сохранить в ветке.
Шаги:
- измененные файлы с сохранением (файл, который вы хотите сохранить, останется нетронутым, поскольку он не отслеживается.
- создайте новую ветку и запишите файл там
- вернуться к исходной ветке
Команды:
git stash
git checkout -b paranoid_fields
git add db/migrate/20161212071336_add_paranoid_fields.rb
git commit
git checkout master
git stash pop
Если вы хотите восстановить файл:
git merge paranoid_fields
вернет его.
Если вы хотите просто взглянуть на файл:
git show paranoid_fields:db/migrate/20161212071336_add_paranoid_fields.rb
Ответ 4
Аналогично @rodrigo ответ, но без фиксации и reset.
Вы можете git stash
сохранить все ваши измененные, отслеживаемые файлы в позиции [email protected]{0}
.
Затем вы можете git add <filename>
на вашем необработанном файле, который вы хотите сохранить, а затем git stash
снова.
Запуск git stash list
покажет, что теперь неэкранный файл хранится в [email protected]{0}
, а ваши измененные отслеживаемые файлы хранятся в [email protected]{1}
.
Теперь вы можете просто git stash pop [email protected]{1}
удалить ваши измененные отслеживаемые файлы из stash и поместить их обратно в свой рабочий каталог, и он оставит ваш untracked файл в файле [email protected]{0}
.
Вы можете увидеть свой файл с помощью git stash show -p [email protected]{0}
и восстановить его с помощью git stash apply [email protected]{0}
или git stash pop [email protected]{0}
. Как указывает @rodrigo, файл без следа снова будет восстановлен в промежуточной области.