В git, есть ли способ показать неотслеженные спрятанные файлы без применения тайника?
Если я git stash -u
, Я могу спрятать неотслеживаемый файлы. Тем не менее, упомянутые неотслеженные файлы вообще не отображаются с git stash show stash@{0}
. Есть ли способ показать неотслеженные спрятанные файлы без применения тайника?
5 ответов:
Неотслеженные файлы хранятся в третьем родителе фиксации тайника. (Это на самом деле не документировано, но довольно очевидно из фиксация, которая ввела функцию-u, 787513..., а как остальная документация для
git-stash
фразы вещи... или просто делатьgit log --graph stash@{0}
)вы можете посмотреть только в "скрытой" части заначку через:
git show stash@{0}^3
или просто само дерево " untracked, через:
git show stash@{0}^3:
или конкретный "неотслеженный" файл в дереве, через:
git show stash@{0}^3:<path/to/file>
к сожалению, нет хорошего способа получить сводку различий между всеми этапными+неустановленными+неотслеженными против "текущего" состояния. т. е.:
git show stash@{0}
невозможно включить неотслеживаемый файлы. Это связано с тем, что объект дерева тайника фиксирует себя, называемыйstash@{0}:
, не содержит каких-либо изменений с третьей, "проиндексировано" родителя.это связано с образом тайники применяются повторно: отслеживаемые файлы могут быть легко применены как патчи, в то время как неотслеживаемые файлы могут быть применены только теоретически как "целые файлы".
вы можете перечислить все фиксации stash с помощью следующей команды:
git rev-list -g stash
поскольку тайники представлены как 3-х сторонняя фиксация слияния HEAD, index и родительская" корневая " фиксация неотслеженных файлов, неотслеженные файловые тайники могут быть перечислены путем передачи вышеуказанного вывода в следующее:
git rev-list -g stash | git rev-list --stdin --max-parents=0
полезные приложения выше:
показывать только неотслеженные, спрятанные файлы
git rev-list -g stash | git rev-list --stdin --max-parents=0 | xargs git show --stat
конечно, удалить
--stat
посмотреть содержимое файлов.найти конкретный файл
git rev-list -g stash | xargs -n1 git ls-tree -r | sort -u | grep <pattern>
Grep untracked files
git rev-list -g stash | git rev-list --stdin --max-parents=0 | xargs git grep <pattern>
перечислите все содержимое всех тайников
git rev-list -g stash | git rev-list --stdin | xargs git show --stat
в список игнорируемых файлов в заначке:
git ls-tree -r stash@{0}^3 --name-only
чтобы показать полное различие всех неотслеженных файлов (с содержимым):
git show stash@{0}^3
эти команды считывают последний (самый последний) тайник. Для более ранних тайников увеличьте число за " stash@", например
stash@{2}
за секунду из последнего тайника.причина, по которой это работает, заключается в том, что
git stash
создает фиксацию слияния для каждого тайника, который может быть выглядит какstash@{0}
,stash@{1}
etc. Первый родитель этой фиксации является головкой во время тайника, второй родитель содержит изменения в отслеживаемых файлах, а третий (который может не существовать) изменения в неотслеживаемых файлах.это частично объясняется в manpage в разделе "Обсуждение".
чтобы увидеть все файлы в тайнике (как отслеживаются, так и не отслеживаются), я добавил этот псевдоним в свою конфигурацию:
showstash = "!if test -z ; then set -- 0; fi; git show --stat stash@{} && git show --stat stash@{}^3 2>/dev/null || echo No untracked files -"
это занимает один аргумент какой тайник вы хотите просмотреть. Обратите внимание, что он по-прежнему будет представлять его в двух списках спина к спине.
The
if...fi
раздел изменяет аргумент bash $1 до 0, если ни один не был принят.
обходной путь: промежуточные файлы перед их сохранением сделают
git stash show -p
работать, как ожидалось.
git add .
git stash save
Примечание: этот путь дает силу добавляя взаимодействующие части слишком,вот как.
внимание: убедитесь, что у вас нет ранее поставленной работы, или вы не сможете ее отличить.
Это может быть полезно.