Если я побегу git stash -u
, я могу спрятать неотслеживаемые файлы. Однако указанные неотслеживаемые файлы вообще не отображаются с расширением git stash show stash@{0}
. Есть ли способ показать скрытые файлы без отслеживания?
Если я побегу git stash -u
, я могу спрятать неотслеживаемые файлы. Однако указанные неотслеживаемые файлы вообще не отображаются с расширением git stash show stash@{0}
. Есть ли способ показать скрытые файлы без отслеживания?
Ответы:
Неотслеживаемые файлы хранятся в третьем родительском элементе фиксации тайника. (На самом деле это не задокументировано, но довольно очевидно из коммита, который представил функцию -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}:
, не включает никаких изменений от третьего, «неустановленного» родителя.
Это связано со способом повторного применения тайников: отслеживаемые файлы можно легко применить как исправления, тогда как неотслеживаемые файлы могут применяться только теоретически как «целые файлы».
git log --graph --topo-order -m -u
. matthewlmcclure.com/s/2014/01/10/…
fatal: ambiguous argument 'stash@{0}^3': unknown revision or path not in the working tree.
) , если вы не на самом деле имеют неотслеживаемые файлы в этом притоне (но думал , что ты сделал).
git stash show
ничего не показывают неотслеживаемые файлы (истинные , по крайней мере , мерзавец 2.7.4):
git stash pop
сначала попытается восстановить неотслеживаемые файлы, а затем попытается восстановить отслеженные файлы. Если последняя операция завершилась неудачно (например, конфликт), первая операция не откатывается (unracked-file-stash останется как есть, но файлы не будут удалены с диска), поэтому, даже если вы исправите конфликт, следующее всплывающее сообщение не удастся тем не мение.
Вы можете перечислить все коммиты тайника с помощью следующей команды:
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>
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@{2}
для второго тайника из последнего.
Причина это работает в том , что git stash
создает слияние совершить для каждого тайника, который можно ссылаться , как stash@{0}
, и stash@{1}
т.д. первым родителем этого коммита ГОЛОВА во время притона, то второй родитель содержит изменения отслеживаемых файлы и третий (который может не существовать) изменения в неотслеживаемых файлах.
Это частично объясняется на странице руководства в разделе «Обсуждение» .
Чтобы увидеть все файлы в тайнике (как отслеживаемые, так и неотслеживаемые), я добавил этот псевдоним в свою конфигурацию:
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 , если ни один не был принят.
Обходной путь: промежуточные файлы перед их хранением будут git stash show -p
работать должным образом .
git add .
git stash save
Примечание. Этот способ дает возможность добавлять интерактивные части, вот как это сделать .
Внимание: убедитесь, что у вас нет заранее поставленной работы, иначе вы не сможете ее различить.
Это может быть полезно.
git stash show
похоже, показывает разницу между рабочей копией и №1 (соответствующий код из git-stash.sh:,git diff ${FLAGS:---stat} $b_commit $w_commit
в котором $ b_commit - №1, а $ w_commit - фиксация тайника); есть ли встроенный способgit stash show
включить № 3?