Я хотел бы знать, возможно ли извлечь отдельный файл или diff из файла git stash, не отключая набор изменений stash.
Может ли кто-нибудь предоставить некоторые предложения / идеи по этому поводу?
На странице руководства 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
)Существует простой способ получить изменения из любой ветки, включая тайники:
Вы можете опустить спецификацию файла, если вы хотите патчить во многих частях. Или пропустите патч (но не путь), чтобы получить все изменения в одном файле. Замените
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
использовать ваш любимый внешний диф.Ноты:
Убедитесь, что вы поставили пробел после "-" и параметра имени файла
Замените ноль (0) вашим конкретным номером тайника. Чтобы получить список тайников, используйте:
На основании ответа Якуба Наренбского - более короткая версия
источник
Вы можете получить 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 checkout
потому что вы не потеряете все изменения, внесенные в файл с момента создания тайника.источник
Используйте расширение Git Stash в коде Visual Studio
источник