Ответы:
На странице руководства git stash вы можете прочитать (в разделе «Обсуждение» сразу после описания «Опции»), что:
Тайник представляется в виде коммита, в дереве которого записывается состояние рабочего каталога, а его первым родителем является коммит в HEAD при создании тайника.
Таким образом, вы можете рассматривать stash (например, stash stash@{0}first / topmost) как коммит слияния и использовать:
$ git diff stash@{0}^1 stash@{0} -- <filename>
Объяснение: stash@{0}^1означает первого родителя данного тайника, который, как указано в приведенном выше объяснении, является коммитом, при котором изменения были спрятаны. Мы используем эту форму «git diff» (с двумя коммитами), потому что stash@{0}/ refs/stashявляется коммитом слияния, и мы должны указать git, против какого родителя мы хотим использовать diff. Более загадочный:
$ git diff stash@{0}^! -- <filename>
также должен работать (см. страницу руководства git rev-parse для объяснения rev^!синтаксиса в разделе «Задание диапазонов»).
Точно так же вы можете использовать git checkout для проверки одного файла из тайника:
$ git checkout stash@{0} -- <filename>
или сохранить его под другим именем файла:
$ git show stash@{0}:<full filename> > <newfile>
или
$ git show stash@{0}:./<relative filename> > <newfile>
( обратите внимание, что здесь <полное имя файла> - это полный путь к файлу относительно верхнего каталога проекта (думаю: относительно stash@{0})).
Вам может потребоваться защитить stash@{0}от расширения оболочки, то есть использовать "stash@{0}"или 'stash@{0}'.
git checkoutсправочную страницу. Он не может перенести файл в другое место. Ссылка на это есть в: stackoverflow.com/questions/888414/…
git checkoutподход копирует точный файл из тайника - он не сливается с тем, что находится в вашем рабочем каталоге, как git stash applyбыло бы. (Так что если у вас есть какие-либо изменения в базе, на которой был создан тайник, они будут потеряны).
git stash applyобъединения изменений в файле, который был изменен в рабочем дереве с момента его сохранения, этот файл в рабочем дереве должен быть подготовлен. Для автоматического слияния одинаковые файлы не могут быть изменены как в рабочей копии, так и в сохраненной копии для объединения. Наконец, применение stash не удаляет элемент из stash, как git stash popбыло бы.
Если вы используете git stash applyвместо git stash pop, он будет применять тайник к вашему рабочему дереву, но все равно сохраните тайник.
После этого вы можете add/ commitфайл, который вы хотите, а затем сбросить оставшиеся изменения.
git stash pop stash@{0}(Перечислите спрятанных изменения: git stash list)
Существует простой способ получить изменения из любой ветки, включая тайники:
$ git checkout --patch stash@{0} path/to/file
Вы можете опустить спецификацию файла, если вы хотите патчить во многих частях. Или пропустите патч (но не путь), чтобы получить все изменения в одном файле. Замените 0на номер тайника из git stash list, если у вас их больше одного. Обратите внимание, что это как diff, и предлагает применить все различия между ветвями. Чтобы получить изменения только от одного коммита / тайника, взгляните на git cherry-pick --no-commit.
git help checkout. --patchвыполняет интерактивное слияние, применяет любой блок (и), который вы одобряете в оболочке (или все, что вы сохраняете, если решите eудалить патч). Один только путь перезапишет файл, как я написал, «все изменения».
git config --global alias.applydiffat '!git checkout --patch "$1" -- $(git diff --name-only "$1"^ "$1")' - тогда в процессе git applydiffat stash@{4}используются только файлы, которые изменились между тайником и его родителем.
Чтобы увидеть весь файл: git show stash@{0}:<filename>
Чтобы увидеть разницу: git diff stash@{0}^1 stash@{0} -- <filename>
diffс difftoolиспользовать ваш любимый внешний диф.
$ git checkout stash@{0} -- <filename>
Ноты:
Убедитесь, что вы поставили пробел после "-" и параметра имени файла
Замените ноль (0) вашим конкретным номером тайника. Чтобы получить список тайников, используйте:
git stash list
На основании ответа Якуба Наренбского - более короткая версия
Вы можете получить diff для тайника с помощью « git show stash@{0}» (или любого другого номера тайника; см. «Git stash list»). Легко извлечь раздел diff для одного файла.
git show stashчтобы показать самый верхний тайник (обычно единственный, который у вас есть). Точно так же вы можете показать разницу между вашей текущей веткой и тайником с git diff head stash.
Самая простая концепция для понимания, хотя, возможно, и не самая лучшая, это то, что вы изменили три файла и хотите сохранить один файл.
Если вы сделаете, git stashчтобы спрятать их все, git stash applyвернуть их снова и затем git checkout f.cв файл, чтобы эффективно сбросить его.
Если вы хотите распаковать этот файл, запустите a, git reset --hardа затем git stash applyснова запустите , воспользовавшись тем, что git stash applyне очищает diff из стека stash.
Если спрятанные файлы необходимо объединить с текущей версией, используйте предыдущие способы, используя diff. В противном случае вы можете использовать их git popдля распаковки, git add fileWantToKeepдля размещения вашего файла, и сделать git stash save --keep-index, чтобы спрятать все, кроме того, что находится на сцене. Помните, что отличие этого способа от предыдущих заключается в том, что он «выталкивает» файл из stash. Предыдущие ответы сохраняют git checkout stash@{0} -- <filename>его в соответствии с вашими потребностями.
Используйте следующее, чтобы применить изменения к файлу в тайнике к вашему рабочему дереву.
git diff stash^! -- <filename> | git apply
Как правило, это лучше, чем использовать, git checkoutпотому что вы не потеряете все изменения, внесенные в файл с момента создания тайника.
Используйте расширение Git Stash в коде Visual Studio