В git есть ли способ показать неотслеживаемые спрятанные файлы без применения тайника?

102

Если я побегу git stash -u, я могу спрятать неотслеживаемые файлы. Однако указанные неотслеживаемые файлы вообще не отображаются с расширением git stash show stash@{0}. Есть ли способ показать скрытые файлы без отслеживания?

Макс Нанасы
источник

Ответы:

122

Неотслеживаемые файлы хранятся в третьем родительском элементе фиксации тайника. (На самом деле это не задокументировано, но довольно очевидно из коммита, который представил функцию -u, 787513 ... , и как остальная часть документации дляgit-stash фраз ... или просто путем выполнения git log --graph stash@{0})

Вы можете просмотреть только «неотслеживаемую» часть тайника с помощью:

git show stash@{0}^3

или просто само "неотслеживаемое" дерево через:

git show stash@{0}^3:

или конкретный "неотслеживаемый" файл в дереве через:

git show stash@{0}^3:<path/to/file>

К сожалению, нет хорошего способа получить сводную информацию о различиях между всеми стадиями + неустановленными + неотслеживаемыми и «текущими» состояниями. то есть: git show stash@{0}нельзя заставить включать неотслеживаемые файлы. Это связано с тем, что древовидный объект фиксации тайника, называемый как stash@{0}:, не включает никаких изменений от третьего, «неустановленного» родителя.

Это связано со способом повторного применения тайников: отслеживаемые файлы можно легко применить как исправления, тогда как неотслеживаемые файлы могут применяться только теоретически как «целые файлы».

Уилл Палмер
источник
Итак, родителями фиксации тайника являются (1. Тайник фиксации выполняется против 2. Индекс 3. Не отслеживаемая рабочая копия), а сама фиксация тайника содержит отслеживаемую рабочую копию? git stash showпохоже, показывает разницу между рабочей копией и №1 (соответствующий код из git-stash.sh:, git diff ${FLAGS:---stat} $b_commit $w_commitв котором $ b_commit - №1, а $ w_commit - фиксация тайника); есть ли встроенный способ git stash showвключить № 3?
Макс Нанаси 01
Как вы говорите, я не нашел способ , чтобы получить один сводный вид тайника, но вы можете увидеть его полную информацию в одной команде с: git log --graph --topo-order -m -u. matthewlmcclure.com/s/2014/01/10/…
Мэтт МакКлюр
4
Обратите внимание , что вы получите уродливую ошибку ( fatal: ambiguous argument 'stash@{0}^3': unknown revision or path not in the working tree.) , если вы не на самом деле имеют неотслеживаемые файлы в этом притоне (но думал , что ты сделал).
Randall
2
@antak: Неа, git stash showничего не показывают неотслеживаемые файлы (истинные , по крайней мере , мерзавец 2.7.4):
Норберт Берчи
1
Примечание (2.13.2-linux): git stash popсначала попытается восстановить неотслеживаемые файлы, а затем попытается восстановить отслеженные файлы. Если последняя операция завершилась неудачно (например, конфликт), первая операция не откатывается (unracked-file-stash останется как есть, но файлы не будут удалены с диска), поэтому, даже если вы исправите конфликт, следующее всплывающее сообщение не удастся тем не мение.
Маринос Ан
22

Вы можете перечислить все коммиты тайника с помощью следующей команды:

git rev-list -g stash

Поскольку тайники представлены как 3-сторонняя фиксация слияния HEAD, индекса и «корневого» фиксации неотслеживаемых файлов без родительского контроля, тайники неотслеживаемых файлов могут быть перечислены путем передачи вышеприведенного вывода в следующее:

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 неотслеживаемые файлы

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
Стив
источник
10

Чтобы перечислить неотслеживаемые файлы в тайнике:

git ls-tree -r stash@{0}^3 --name-only

Чтобы показать полную разницу всех неотслеживаемых файлов (с содержимым):

git show stash@{0}^3

Эти команды читают последний (самый последний) тайник. Для более ранних тайников увеличьте число после «тайника @», например, stash@{2}для второго тайника из последнего.

Причина это работает в том , что git stashсоздает слияние совершить для каждого тайника, который можно ссылаться , как stash@{0}, и stash@{1}т.д. первым родителем этого коммита ГОЛОВА во время притона, то второй родитель содержит изменения отслеживаемых файлы и третий (который может не существовать) изменения в неотслеживаемых файлах.

Это частично объясняется на странице руководства в разделе «Обсуждение» .

Wisbucky
источник
6

Чтобы увидеть все файлы в тайнике (как отслеживаемые, так и неотслеживаемые), я добавил этот псевдоним в свою конфигурацию:

showstash = "!if test -z $1; then set -- 0; fi; git show --stat stash@{$1} && git show --stat stash@{$1}^3 2>/dev/null || echo No untracked files -"

Требуется единственный аргумент о том, какой тайник вы хотите просмотреть. Обратите внимание, что он по-прежнему будет представлен в двух списках подряд.

if...fiРаздел изменяет Баш рассуждение $ 1 в 0 , если ни один не был принят.

Randall
источник
5

Обходной путь: промежуточные файлы перед их хранением будут git stash show -pработать должным образом .

git add .
git stash save

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

Weshouman
источник