Как извлечь один файл (или изменения в файл) из тэга git?

Я хотел бы знать, можно ли извлечь один файл или diff из файла из тэга git, не выталкивая смену stash changes.

Может ли кто-нибудь дать некоторые предложения/идеи об этом?

Ответы

Ответ 1

На странице руководства 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}'.

Ответ 2

Если вы используете git stash apply, а не git stash pop, он применит stash к вашему рабочему дереву, но сохранит stash.

При этом вы можете add/commit файл, который вы хотите, а затем reset остальные изменения.

Ответ 4

Существует простой способ получить изменения из любой ветки, включая stashes:

$ git checkout --patch [email protected]{0} path/to/file

Вы можете опустить спецификацию файла, если хотите запланировать во многих частях. Или пропустите патч (но не путь), чтобы получить все изменения в одном файле. Замените 0 номером тайника git stash list, если у вас несколько. Обратите внимание, что это похоже на diff и предлагает применить все различия между ветвями. Чтобы получить изменения только от одного фиксатора /stash, посмотрите git cherry-pick --no-commit.

Ответ 5

$ git checkout [email protected]{0} -- <filename>

Примечание:

  1. Убедитесь, что вы ставите пробел после "-" и параметра имени файла

  2. Замените ноль (0) вашим конкретным номером stashа. Чтобы получить список stashов, используйте:

    git stash list
    

Основано на ответе Якуба Наренбского - более короткая версия

Ответ 6

Вы можете получить diff для кошелька с "git show [email protected]{0}" (или любым номером табуляции, см. "git список закладок" ). Легко извлечь секцию diff для одного файла.

Ответ 7

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

Если вы выполните git stash, чтобы скрыть их все, git stash apply, чтобы вернуть их обратно, а затем git checkout f.c в файл, о котором идет речь, для эффективного reset.

Если вы хотите разблокировать этот запуск файла, выполните git reset --hard, а затем запустите git stash apply снова, воспользовавшись тем, что git stash apply не очищает diff от стека стека.

Ответ 8

Если спрятанные файлы необходимо объединить с текущей версией, используйте предыдущие способы с использованием diff. В противном случае вы можете использовать git pop для их блокировки, git add fileWantToKeep для размещения вашего файла и сделать git stash save --keep-index, для того, чтобы сшить все, кроме того, что находится на сцене. Помните, что разница в этом случае с предыдущими заключается в том, что он "выталкивает" файл из stash. Предыдущие ответы сохраняют его git checkout [email protected]{0} -- <filename>, поэтому он идет в соответствии с вашими потребностями.