Как вы заправляете необработанный файл?

У меня есть изменения в файле, плюс новый файл, и я хотел бы использовать git stash, чтобы убрать их, когда я переключаюсь на другую задачу. Но git stash сам по себе задерживает только изменения существующего файла; новый файл остается в моем рабочем дереве, загромождая мою будущую работу. Как занести этот неподписанный файл?

+1252
источник поделиться
14 ответов

Чтобы сохранить ваш рабочий каталог, включая неотслеживаемые файлы (особенно те, которые находятся в .gitignore), вы, вероятно, захотите использовать этот cmd:

git stash --include-untracked

Подробнее:

Обновление 17 мая 2018 года:

В новых версиях git теперь есть git stash --all, в котором хранятся все файлы, включая неотслеживаемые и игнорируемые файлы.
git stash --include-untracked больше не касается игнорируемых файлов (протестировано на git 2.16.2).

Оригинальный ответ ниже:

Внимание, это навсегда удалит ваши файлы, если у вас есть какие-либо записи каталога /* в вашем файле gitignore.

Начиная с версии 1.7.7, вы можете использовать git stash --include-untracked или git stash save -u для хранения неотслеживаемых файлов без их постановки.

Добавьте (git add) файл и начните отслеживать его. Тогда заначка. Поскольку все содержимое файла новое, оно будет спрятано, и вы можете манипулировать им по мере необходимости.

+1648
источник

Как и в случае git 1.7.7, git stash принимает параметр --include-untracked (или короткий -u). Чтобы включить неиспользуемые файлы в ваш кошелек, используйте одну из следующих команд:

git stash --include-untracked
git stash -u

Предупреждение, это приведет к постоянному удалению ваших файлов, если у вас есть какие-либо записи каталога /* в файле gitignore.

+394
источник

Добавьте файл в индекс:

git add path/to/untracked-file
git stash

Все содержимое индекса, а также любые неустановленные изменения в существующих файлах, сделают это в stash.

+72
источник

В git bash, скрепление необработанных файлов достигается с помощью команды

git stash --include-untracked

или

git stash -u

http://git-scm.com/docs/git-stash

git stash удаляет любые неиспользуемые или неактивные файлы из вашей рабочей области. И вы можете вернуть stash git, используя следующие команды

git stash pop

Это вернет файл в локальное рабочее пространство.

Мой опыт

Мне пришлось выполнить модификацию моего файла gitIgnore, чтобы избежать перемещения файлов .classpath и .project в удаленное репо. Мне не разрешено перемещать этот измененный .gitIgnore в удаленном репо на данный момент.

.classpath и .project файлы важны для eclipse - это мой редактор java.

В первую очередь я выборочно добавил оставшиеся файлы и совершил переход. Однако окончательное нажатие не может быть выполнено, если только измененные .gitIgnore не отображаются и не отслеживаются файлы..project и .classpath не спрятаны.

Я использовал

 git stash 

для сохранения измененного файла .gitIgnore.

Для stashing.classpath и .project, я использовал

git stash --include-untracked

и он удалил файлы из моего рабочего пространства. Отсутствие этих файлов убирает мою способность работать в моем рабочем месте в eclipse. Я продолжил работу с завершением процедуры перенаправления переданных файлов на удаленный. Как только это было сделано успешно, я использовал

git stash pop

Это вставило те же файлы обратно в мое рабочее пространство. Это дало мне возможность работать над тем же проектом в затмении. Надеюсь, это отбросит заблуждения.

+51
источник

Как было сказано в другом месте, ответ - git add файл git add. например:

git add path/to/untracked-file
git stash

Однако, вопрос также поднимается в другом ответе: что, если вы действительно не хотите добавлять файл? Ну, насколько я могу судить, ты должен. И следующее НЕ будет работать:

git add -N path/to/untracked/file     # note: -N is short for --intent-to-add
git stash

это потерпит неудачу, как показано ниже:

path/to/untracked-file: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state

Так что ты можешь сделать? Что ж, вам нужно действительно добавить файл, однако вы можете эффективно git rm --cached его позже с помощью git rm --cached:

git add path/to/untracked-file
git stash save "don't forget to un-add path/to/untracked-file" # stash w/reminder
# do some other work
git stash list
# shows:
# [email protected]{0}: On master: don't forget to un-add path/to/untracked-file
git stash pop   # or apply instead of pop, to keep the stash available
git rm --cached path/to/untracked-file

И затем вы можете продолжить работу в том же состоянии, в котором находились до git add (а именно с неотслеживаемым файлом с именем path/to/untracked-file; плюс любые другие изменения, которые вы могли иметь для отслеживаемых файлов).

Другая возможность для рабочего процесса на этом будет что-то вроде:

git ls-files -o > files-to-untrack
git add 'cat files-to-untrack' # note: files-to-untrack will be listed, itself!
git stash
# do some work
git stash pop
git rm --cached 'cat files-to-untrack'
rm files-to-untrack

[Примечание: как упоминалось в комментарии от @mancocapac, вы можете добавить --exclude-standard к команде git ls-files (так, git ls-files -o --exclude-standard).]

... что также может быть легко написано в сценарии - подойдут даже псевдонимы (представленные в синтаксисе zsh; при необходимости измените) [также я сократил имя файла, чтобы оно умещалось на экране без прокрутки в этом ответе; не стесняйтесь подставлять альтернативное имя файла по вашему выбору]:

alias stashall='git ls-files -o > .gftu; git add 'cat .gftu'; git stash'
alias unstashall='git stash pop; git rm --cached 'cat .gftu'; rm .gftu'

Обратите внимание, что последний может быть лучше в качестве сценария или функции оболочки, чтобы разрешить предоставление параметров для git stash, если вы не хотите использовать pop но apply и/или хотите иметь возможность указать конкретный stash, а не просто беру верхнюю. Возможно, это (вместо второго псевдонима выше) [пробелы разделены, чтобы соответствовать без прокрутки; повторно добавить для повышения читаемости]:

function unstashall(){git stash "${@:-pop}";git rm --cached 'cat .gftu';rm .gftu}

Примечание. В этой форме вам необходимо указать аргумент действия, а также идентификатор, если вы собираетесь указать идентификатор unstashall apply [email protected]{1}, например, unstashall apply [email protected]{1} или unstashall pop [email protected]{1}

Что, конечно, вы бы положили в свой .zshrc или эквивалент, чтобы сделать его долгосрочным.

Надеюсь, этот ответ будет полезен для кого-то, и все будет собрано в одном ответе.

+20
источник

В git версии 2.8.1 у меня работает следующее.

Сохранять измененные и неотслеживаемые файлы в stash без имени

git stash save -u

Сохранить измененные и неотслеживаемые файлы в stashе с именем

git stash save -u <name_of_stash>

Вы можете использовать pop или apply позже, как указано ниже.

git stash pop

git stash apply [email protected]{0}
+14
источник

Мне удалось закрепить только неподписанные файлы, выполнив:

git stash save "tracked files I'm working on"
git stash save -u "untracked files I'm trying to stash"
git stash pop [email protected]{1}

Последний выталкивает тайник отслеживаемых файлов, оставляя при этом только файлы без следа.

+8
источник

Если вы хотите сохранить неотслеживаемые файлы, но сохранить индексированные файлы (например, те, которые вы собираетесь зафиксировать), просто добавьте -k (сохранить индекс) в -u

git stash -u -k
+3
источник

Вы можете просто сделать это с помощью команды ниже

git stash save --include-untracked

или же

git stash save -u

Для получения дополнительной информации о git stash Посетите этот пост (Нажмите здесь)

+2
источник

предположим, что новый и неотслеживаемый файл называется "views.json". если вы хотите изменить ветку, сохраняя состояние вашего приложения, я обычно набираю:

git add views.json

Затем:

git stash

И это будет спрятано. Тогда я могу просто изменить ветку с

git checkout other-nice-branch
+2
источник

Здесь есть несколько правильных ответов, но я хотел бы указать, что для новых целых каталогов 'git add path' работает НЕ. Поэтому, если у вас есть куча новых файлов в пути без следа и сделайте следующее:

git add untracked-path
git stash "temp stash"

это запишет следующее сообщение:

Saved working directory and index state On master: temp stash
warning: unable to rmdir untracked-path: Directory not empty

и если untracked-path - это единственный путь, который вы запихиваете, stash "temp stash" будет пустой строчкой. Правильный способ состоит в том, чтобы добавить весь путь, а не только имя каталога (т.е. Конец пути с помощью "/" ):

git add untracked-path/
git stash "temp stash"
+1
источник

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

git add --intent-to-add path/to/untracked-file

или

git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 path/to/untracked-file

Однако последнее не работает:

$ git stash
b.rb: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state
0
источник
git stash --include-untracked

мой любимый, поскольку он также сохраняет файлы, которые вы добавили, но не поставили их.

0
источник

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

И так как обычно временной интервал между git stash и git stash pop довольно мал, вам снова потребуется необработанный файл. Поэтому я бы сказал, что неудобство файла, отображаемого в git status, пока вы работаете над чем-то другим (между git stash и git stash pop), меньше, чем неудобства, вызванные работой, и внимание было обращено на это иначе чтобы попытаться добавить файл без следа в ваш кошелек.

-6
источник

Посмотрите другие вопросы по меткам или Задайте вопрос