Git diff против тайника - PullRequest
       19

Git diff против тайника

1170 голосов
/ 06 октября 2011

Как я могу увидеть, какие изменения будут сделаны без сохранения в текущем рабочем дереве?Я хотел бы знать, какие изменения будут внесены, прежде чем их применять!

Ответы [ 12 ]

1618 голосов
/ 06 октября 2011

См. Самый последний тайник:

git stash show -p

См. Произвольный тайник:

git stash show -p stash@{1}

На страницах git stash:

По умолчаниюкоманда показывает diffstat, но она принимает любой формат, известный git diff (например, git stash show -p stash @ {1} для просмотра второго самого последнего тайта в форме патча).

278 голосов
/ 26 июля 2012

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

git stash show -p

Чтобы увидеть произвольный тайник:

git stash show -p stash@{1}

Также я использую git diff для сравнения тайника с любой веткой.

Вы можете использовать:

git diff stash@{0} master

Просмотр всех изменений по сравнению с мастером ветвления.


Или Вы можете использовать:

git diff --name-only stash@{0} master

Чтобы легко найти только измененные имена файлов.

87 голосов
/ 27 марта 2013

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

git diff stash@{0}^!

Сравнивает тайник с коммитом, на котором он основан.

37 голосов
/ 21 января 2013

Если ваше рабочее дерево грязное , вы можете сравнить его с тайником, сначала зафиксировав грязное рабочее дерево, а затем сравнив его с тайником. После этого вы можете отменить коммит с грязным рабочим деревом (так как вы можете не захотеть иметь этот грязный коммит в вашем журнале коммитов).

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

  • Передайте свое грязное рабочее дерево:

    git add .
    git commit -m "Dirty commit"
    
  • Разберите тайник с этим коммитом:

    git diff HEAD stash@{0}
    
  • Затем, после этого, вы можете отменить коммит и поместить его обратно в рабочий каталог:

    git reset --soft HEAD~1
    git reset .
    

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

21 голосов
/ 28 июня 2016

@ ответ Магне - единственный, который (очень поздно) встречается с ответом на самую гибкую / полезную интерпретацию вопроса, но это немного сложнее, чем необходимо.Вместо фиксации и сброса просто спрячьте свою рабочую копию, сравните и распакуйте ее.

git stash save "temp"
git diff stash@{0} stash@{1}
git stash pop

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

«Но что, если у меня нет текущей работы?» Тогда вы в обычном скучном деле.Просто используйте @ Amber's answer

git stash show

или @ czerasz's answer

git diff stash@{0}

или признайте, что копирование и снятие с счета быстро и легко в любом случае, просто распакуйте изменения и осмотрите их.Если вы не хотите, чтобы они в данный момент выбрасывались (текущий индекс / рабочая папка меняется).В полном объеме это

git stash apply
git diff
git reset
git checkout
18 голосов
/ 23 января 2014

Это работает для меня на git версии 1.8.5.2:

git diff stash HEAD
9 голосов
/ 09 сентября 2015

Если у вас есть инструменты для сравнения (например, вне всякого сравнения)

git difftool stash HEAD
1 голос
/ 14 февраля 2019

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

git diff stash@{0} -- fileName (with path)
1 голос
/ 08 февраля 2018

Один из способов сделать это, ничего не перемещая, - воспользоваться тем, что patch может читать git diff (в основном унифицированные diff)

git stash show -p | patch -p1 --verbose --dry-run

Это покажет вам пошаговый предварительный просмотр того, что обычно делает патч. Дополнительным преимуществом этого является то, что патч не помешает самому записать патч в рабочее дерево, если по какой-то причине вам просто нужен git, чтобы замолчать о коммитах перед изменением, продолжайте и удалите --dry- бегите и следуйте подробным инструкциям.

1 голос
/ 18 августа 2016

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

git stash show --help даст вам все, что вам нужно;включая stash show info.

show []

Показать изменения, записанные в stash, в виде различий между сохраненным состоянием и его исходным родителем.Если нет, показывает последний.По умолчанию команда показывает diffstat, но она принимает любой формат, известный для git diff (например, git stash show -p stash @ {1} для просмотра второго самого последнего хранилища в форме патча).Вы можете использовать переменные конфигурации stash.showStat и / или stash.showPatch, чтобы изменить поведение по умолчанию.

...