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, файл без следа снова будет восстановлен в промежуточной области.