Ответы:
На странице руководства 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