Можно ли предварительно просмотреть содержимое тайника в git?


554

Я часто откладываю работу на потом, потом появляются другие вещи, и через несколько недель я хочу осмотреть тайник и выяснить, какие изменения он внесет, если применить его к рабочему дереву в его текущем состоянии.

Я знаю, что могу сделать git diff для тайника, но это показывает мне все различия между рабочим деревом и тайником, тогда как мне просто интересно знать, что изменится применяемый тайник.

Как я могу это сделать?


1
colorized diff output: git stash show -p stash@{1} >~/.diff && vim ~/.diff(не обязательно должен быть vim. любой текстовый редактор, если ваш текстовый редактор имеет поддержку подсветки синтаксиса для diffвывода).
Тревор Бойд Смит

Ответы:


729

git stash showпокажет вам файлы, которые изменились в вашем последнем тайнике. Вы можете добавить -pопцию, чтобы показать разницу.

git stash show -p

Если интересующий вас тайник не самый последний, добавьте его имя в конец команды:

git stash show -p stash@{2}

Это выглядит хорошо, и я вижу это в руководстве, но когда я пытаюсь это дать мне fatal: unable to create temp-file: Invalid argument- есть идеи почему?
Бенджол

29
Используйте git stash show -p stash@{0}для просмотра конкретного тайника. 0 показывает последний тон, 1 второй последний .. и т. Д. git stash listПокажет все доступные.
brita_

6
Если вы используете PowerShell, вам нужно будет поместить имя тайника в кавычки. (то есть: git stash show -p 'stash@{0}')
Скот-Паско


1
Если вы хотите сохранить diff в файлеgit stash show -p stash@{0}> stash.txt
S_K

87

Чтобы просмотреть текущий список тайников:

git stash list

Вы увидите список вроде этого:

stash@{0}: WIP on ...
stash@{1}: ...
stash@{2}: ...
...

Для просмотра различий на любом из этих тайников:

git stash show -p stash@{n}

34

Я фанат gitkграфического пользовательского интерфейса для визуализации git-репозиториев. Вы можете просмотреть последний сохраненный элемент:

gitk stash

Вы также можете использовать просмотр любых ваших скрытых изменений (как указано в git stash list). Например:

gitk stash@{2}

На скриншоте ниже вы можете увидеть тайник как коммит в верхнем левом углу, когда и откуда он появился в истории коммитов, список файлов, измененных в правом нижнем углу, и построчный diff в нижнем -оставил. Все, пока тайник все еще спрятан.

Гитк, просматривая тайник


5
Вы можете указать несколько stash@{X}значений в командной строке, чтобы увидеть больше результатов одновременно, но я не нашел простого способа просто сказать «показать все записи тайника» в gitk.
Нобар

5
gitk stashКажется, это будет сокращением дляgitk stash@{0}
Лейф Грюнволдт

3
чтобы показать все тайники в gitk, которые вы можете использовать, gitk `git stash list --pretty=format:%gd`а затем выполните поиск «WIP on», чтобы перейти к следующему тайнику.
Икар Похорски

2
gitk --reflogпозволяет увидеть все тайники и многое другое.
Нобар

1
Gitk был единственным инструментом, который прямо показал мне, что в тайнике были сохраненные файлы. Все остальные просто показали мне «без различий».
Мартин Боннер поддерживает Монику

22

Чтобы просмотреть все изменения в неиспользованном тайнике:

git stash show -p stash@{0}

Чтобы просмотреть изменения одного конкретного файла в неиспользованном тайнике:

git diff HEAD stash@{0} -- path/to/filename.php

если вы не помните имена файлов, это также работает для всех файлов, измененных git diff HEAD stash @ {0}
Simeon

Просто для ясности: -pэто сокращение от --patch. Опция исходит от git-diff. Если вы предпочитаете длинную форму, вы можете написать git stash show --patch.
Петерино

5

Помимо рекомендации gitk в: Можно ли предварительно просмотреть содержимое тайника в git? Вы можете установить тиг и позвонить tig stash. Эта бесплатная / открытая консольная программа также позволяет вам выбирать, какой тайник сравнивать


1
Похоже, идеальный инструмент для управления несколькими тайниками! Вы можете также попы и падение тайников с Pи !ключами соответственно.
Икар Похорски

Альтернативы TUI всегда хороши, но для людей, которые уже привыкли или как-то предпочитают, gitk относительно легко взломать его, чтобы показать все тайники .
1737973,


4

Когда этот вопрос был задан впервые, это, возможно, не было вариантом, но, если вы используете PyCharm, вы можете использовать UnStash Changesинструмент (VCS-> Git-> UnStash Changes ...). Это позволяет вам просматривать список сохраненных изменений, а также вставлять, отбрасывать, очищать или применять (в новую ветку, если необходимо):

Unstash Changes Window

и просмотрите измененные файлы для каждого тайника:

Окно "Пути затронуты"

а также различия в файле. В diff-файлах вы можете выбрать отдельные изменения, чтобы применить их из сохраненных изменений к рабочей ветви (используя шеврон, указывающий влево):

введите описание изображения здесь


3

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

$ git stash list

stash@{0}: WIP on dev: ddd4d75 spelling fix

stash@{1}: WIP on dev: 40e65a8 setting width for messages

......

......

......


stash@{12}: WIP on dev: 264fdab added token based auth

Самый новый тайник - первый.

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

git stash show -p stash@{3}

По аналогии,

git stash show -p stash@{n}

Вы также можете проверить diff, используя команду:

git diff HEAD stash@{n} -- /path/to/file

3

да, лучший способ увидеть, что модифицируется, это сохранить в файл, например:

git stash show -p stash@{0} > stash.txt

2

Сначала мы можем использовать список git stash, чтобы получить все элементы stash:

$git stash list
stash@{0}: WIP on ...
stash@{1}: WIP on ....
stash@{2}: WIP on ...

Затем мы можем использовать git stash show stash@{N}для проверки файлов под конкретным тайником N. Если мы его запустим, то получим:

$ git stash show stash@{2}
fatal: ambiguous argument 'stash@2': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

Причиной этого может быть то, что оболочка съедает фигурные скобки, а мерзавец видит, stash@2а нет stash@{2}. И чтобы это исправить, нам нужно использовать одинарные кавычки для фигурных скобок:

git stash show stash@'{2'}
com/java/myproject/my-xml-impl.xml                     | 16 ++++++++--------
com/java/myproject/MyJavaClass.java                    | 16 ++++++++--------
etc.

2

Просмотр списка сохраненных изменений

git stash list

Для просмотра списка файлов, измененных в конкретном тайнике

git stash show -p stash@{0} --name-only

Для просмотра конкретного файла в тайнике

git show stash@{0} path/to/file

1

Показать все тайники

Только имена файлов:

for i in $(git stash list --format="%gd") ; do echo "======$i======"; git stash show $i; done

Полное содержимое файла во всех тайниках:

for i in $(git stash list --format="%gd") ; do echo "======$i======"; git stash show -p $i; done

Вы получите цветной вывод различий, который вы можете пролистать space ( вперед ) и b( назад ), и qзакрыть пейджер для текущего тайника. Если вы предпочитаете иметь его в файле, добавьте > stashes.diffкоманду.


1

В дополнение к существующим ответам, которые предлагают использовать (чтобы показать разницу от третьего до последнего тайника)

git stash show -p stash@{2}

Обратите внимание, что в git-stashдокументации написано, что

На stashes также можно ссылаться, указав только индекс stash (например, целое число nэквивалентно stash@{n}).

Поэтому также возможно использовать (это эквивалентно команде выше)

git stash show -p 2

Что также должно избежать некоторых проблем с Powershell .


1

Мне нравится, как gitkможно показать, что именно не было отслежено или находится в индексе, но по умолчанию он будет отображать эти «коммиты» тайника в середине всех других ваших коммитов в текущей ветви.

Хитрость заключается в запуске Gitk следующим образом:

gitk "stash@{0}^!"

(Цитата приведена для того, чтобы заставить его работать в Powershell, но таким образом он должен работать и в других оболочках.)

Если вы посмотрите этот синтаксис на странице справки gitrevisions, вы найдете следующее:

Запись r1^!включает коммит r1, но исключает всех его родителей. Само по себе это обозначение обозначает единственный коммит r1 .

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


Если вы хотите пойти дальше и перечислить все тайники, вы можете запустить это:

gitk `git stash list '--pretty=format:%gd^!'`

(Эти одинарные кавычки внутри обратных кавычек необходимы для успокоения Bash, в противном случае он жалуется на восклицательный знак)

Если вы используете Windows и используете cmd или Powershell:

gitk "--argscmd=git stash list --pretty=format:%gd^!"

0

Следующая команда может быть использована для извлечения различий из спрятанных изменений в любой другой стэш или коммит или ветвь или HEAD.

git stash show
git show
git diff
git difftool

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

  1. мерзавец шоу

Простая команда git stash show дает очень краткую сводку изменений файла, но не показывает разницу изменений с текущей HEAD.

  1. мерзавец

Команда git-show используется для просмотра различных типов объектов.

Команда git-show используется не только для визуализации изменений в тайнике, но и для просмотра одного или нескольких объектов, таких как BLOB-объекты, деревья, теги и коммиты.

  1. мерзавец

Команда git-diff также является одной из общих команд, которая используется для отображения изменений между коммитами, коммитом и рабочим деревом и т. Д.

По умолчанию, git diff будет показывать разницу выбранного тайника с текущим состоянием хранилища (измененные файлы), если не указана другая ссылка на тайник или коммит.

Чтобы получить разницу между самым верхним тайником @ {0} и главной веткой:

$ git diff stash @ {0} master

Отображать только имена файлов без различия изменений:

$ git diff - только для имени stash @ {0} master

Посмотрите разницу между выбранными тайниками для выбранного файла:

$ git diff stash @ {0} ^ 1 stash @ {0} -

  1. мерзавец difftool

Команда git-difftool также может использоваться для поиска различий между выбранным тайником и выбранным коммитом или ветвью или тайником

Посмотрите разницу между последними двумя тайниками:

$ git difftool stash @ {0} stash @ {0} ^ 1

git difftool - dir-diff stash @ {0} stash @ {0} ^ 1

Резюме:

Команды, которые полезны для извлечения diff из выбранного stash git stash show, git show, git diff, git difftool.

Смотрите разницу, используя команду git stash show,

git stash show -p stash @ {0}

Смотрите изменения в тайнике с помощью команды git show,

git show stash @ {1}

Посмотрите разницу между последним тайником и выбранным коммитом, используя команду git diff,

git diff stash @ {0}

Ссылки:

https://howto.lintel.in/how-to-see-stashed-changes-using-git-stash/

https://git-scm.com/docs/git-show

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.