Я хотел бы знать, можно ли извлечь один файл или diff из файла из тэга git, не выталкивая смену stash changes.
Может ли кто-нибудь дать некоторые предложения/идеи об этом?
Я хотел бы знать, можно ли извлечь один файл или diff из файла из тэга git, не выталкивая смену stash changes.
Может ли кто-нибудь дать некоторые предложения/идеи об этом?
На странице руководства git stash вы можете прочитать (в разделе "Обсуждение" сразу после описания "Опции"):
Тайник представлен как коммит, дерево которого записывает состояние рабочий каталог, и его первым родителем является коммит в HEAD, когда stash был создан.
Таким образом, вы можете рассматривать stash (например, [email protected]{0}
- это первый/самый верхний stash) как коммит слияния и использовать:
$ git diff [email protected]{0}^1 [email protected]{0} -- <filename>
Объяснение: [email protected]{0}^1
означает первого родителя данного stashа, который, как указано в пояснении выше, является коммитом, при котором изменения были спрятаны. Мы используем эту форму "git diff" (с двумя коммитами), потому что [email protected]{0}
/refs/stash
является коммитом слияния, и мы должны указать git, от какого родителя мы хотим диффендировать. Более загадочный:
$ git diff [email protected]{0}^! -- <filename>
также должно работать (см. справочную страницу git rev-parse для объяснения синтаксиса rev^!
в разделе "Задание диапазонов").
Кроме того, вы можете использовать git checkout, чтобы проверить один файл из stashа:
$ git checkout [email protected]{0} -- <filename>
или сохранить его под другим именем:
$ git show [email protected]{0}:<full filename> > <newfile>
или
$ git show [email protected]{0}:./<relative filename> > <newfile>
(обратите внимание, что здесь & lt; полное имя файла & gt; является полным путем к файлу относительно верхнего каталога проекта (подумайте: относительно [email protected]{0}
)).
Возможно, вам потребуется защитить [email protected]{0}
от расширения оболочки, то есть использовать "[email protected]{0}"
или '[email protected]{0}'
.
Если вы используете git stash apply
, а не git stash pop
, он применит stash к вашему рабочему дереву, но сохранит stash.
При этом вы можете add
/commit
файл, который вы хотите, а затем reset остальные изменения.
Чтобы увидеть весь файл: git show [email protected]{0}:<filename>
Чтобы увидеть diff: git diff [email protected]{0}^1 [email protected]{0} -- <filename>
Существует простой способ получить изменения из любой ветки, включая stashes:
$ git checkout --patch [email protected]{0} path/to/file
Вы можете опустить спецификацию файла, если хотите запланировать во многих частях. Или пропустите патч (но не путь), чтобы получить все изменения в одном файле. Замените 0
номером тайника git stash list
, если у вас несколько. Обратите внимание, что это похоже на diff
и предлагает применить все различия между ветвями. Чтобы получить изменения только от одного фиксатора /stash, посмотрите git cherry-pick --no-commit
.
$ git checkout [email protected]{0} -- <filename>
Примечание:
Убедитесь, что вы ставите пробел после "-" и параметра имени файла
Замените ноль (0) вашим конкретным номером stashа. Чтобы получить список stashов, используйте:
git stash list
Основано на ответе Якуба Наренбского - более короткая версия
Вы можете получить diff для кошелька с "git show [email protected]{0}
" (или любым номером табуляции, см. "git список закладок" ). Легко извлечь секцию diff для одного файла.
Простейшее понятие для понимания, хотя, может быть, и не самое лучшее, заключается в том, что у вас есть три файла, и вы хотите сшить один файл.
Если вы выполните git stash
, чтобы скрыть их все, git stash apply
, чтобы вернуть их обратно, а затем git checkout f.c
в файл, о котором идет речь, для эффективного reset.
Если вы хотите разблокировать этот запуск файла, выполните git reset --hard
, а затем запустите git stash apply
снова, воспользовавшись тем, что git stash apply
не очищает diff от стека стека.
Если спрятанные файлы необходимо объединить с текущей версией, используйте предыдущие способы с использованием diff. В противном случае вы можете использовать git pop
для их блокировки, git add fileWantToKeep
для размещения вашего файла и сделать git stash save --keep-index
, для того, чтобы сшить все, кроме того, что находится на сцене.
Помните, что разница в этом случае с предыдущими заключается в том, что он "выталкивает" файл из stash. Предыдущие ответы сохраняют его git checkout [email protected]{0} -- <filename>
, поэтому он идет в соответствии с вашими потребностями.