Программирование PC git stash help Tue, October 08 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

git stash help Печать
Добавил(а) microsin   

Команда git stash временно "припрятывает" ваши текущие наработки в проекте, чтобы можно было перейти на другую ветку репозитория, и впоследствии ввернуться к незаконченным наработкам.

SYNOPSIS

       git stash list [< log-options>]
       git stash show [-u|--include-untracked|--only-untracked] [< diff-options>] [< stash>]
       git stash drop [-q|--quiet] [< stash>]
       git stash ( pop | apply ) [--index] [-q|--quiet] [< stash>]
       git stash branch < branchname> [< stash>]
       git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]
                    [-u|--include-untracked] [-a|--all] [-m|--message < message>]
                    [--pathspec-from-file=< file> [--pathspec-file-nul]]
                    [--] [< pathspec>...]]
       git stash clear
       git stash create [< message>]
       git stash store [-m|--message < message>] [-q|--quiet] < commit>

ОПИСАНИЕ

       Используйте git stash, когда хотите записать текущее состояние рабочей директории и индекс, но хотите сделать откат в чистое состояние рабочей директории проекта. Эта команда сохранит ваши локальные изменения, и вернет состояние рабочей директории, соответствующее головной фиксации (HEAD commit).

       Изменения, сохраненные этой командой, можно посмотреть в списке git stash list, также они могут быть проинспектированы командой git stash show, и восстановлены (потенциально на вершину другой фиксации) командой git stash apply. Вызов git stash без каких-либо аргументов эквивалентен команде git stash push. Сохранение stash по умолчанию перечисляется как "WIP on branchname ...", но вы можете дать ему более подходящее описательное сообщение в командной строке, когда создаете stash.

       Последний созданный вами stash сохраняется в refs/stash; более старые stash находятся в reflog этой ссылки, и могут именоваться обычным синтаксисом reflog (т. е. stash@{0} это самый свежий созданный stash, stash@{1} это созданный перед ним, также возможен stash@{2.hours.ago}). К сохранениям stash можно также обращаться просто по stash-индексу (т. е. целое число n эквивалентно stash@{n}).

КОМАНДЫ

       push [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [-m|--message < message>] [--pathspec-from-file=< file>
       [--pathspec-file-nul]] [--] [< pathspec>...]

           Сохранит ваши локальные изменения в новое сохранение stash и выполнит откат к HEAD (с рабочее дерево и индекс). Здесь часть команды < message> опциональна, и дает описание вместе с сохраненным состоянием.

           Чтобы быстро создать snapshot, можно просто опустить "push". В этом режиме не допускаются аргументы без опций, чтобы не позволить ввести неправильную команду и создать нежелательный stash. Для этого существуют два исключения: stash -p, который действует как псевдоним stash push -p, и элементы pathspec, которые дозволяется указывать после двойной черты -- для разрешения неоднозначности.

       save [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [< message>]

           Эта опция устарела, её заменила git stash push. Она отличается от "stash push" в том, что не может принимать pathspec. Вместо этого все аргументы, не относящиеся к опциям, соединяются друг с другом, формируя stash-сообщение.

       list [< log-options>]

           Выведет список сохранений stash, которые сейчас имеются. Каждое сохранение stash в списке выводится с его именем (например stash@{0} для последнего сохранения, stash@{1} для предыдущего сохранения, и т. д.), именем ветви, которая была текущей в момент создания stash, и коротким описанием фиксации, на котором было создано сохранение stash.

               stash@{0}: WIP on submit: 6ebd0e2... Update git-stash documentation
               stash@{1}: On master: 9cc0589... Add git-stash

           Эта команда принимает опции, применимые к команде git log, чтобы управлять тем, что показывать и как. См. git-log(1) [3].

       show [-u|--include-untracked|--only-untracked] [< diff-options>] [< stash>]

           Покажет изменения, записанные в stash-сохранении как diff между содержимым stash и фиксацией, поверх которой stash был создан первый раз. По умолчанию команда покажет diffstat, но она примет любой формат, известный для git diff (т. е. git stash show -p stash@{1} покажет второе по свежести сохранение в форме patch). Если не предоставлено < diff-option>, то поведение по умолчанию будет задаваться переменными конфигурации stash.showStat и stash.showPatch. Также вы можете использовать stash.showIncludeUntracked для установки, разрешено ли по умолчанию --include-untracked.

       pop [--index] [-q|--quiet] [< stash>]

           Удаляет одно stash-сохранения из stash-списка и применяет его на текущее состояние рабочего дерева, т. е. эта команда дает инверсию операции git stash push. Рабочая директория должна соответствовать индексу.

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

       apply [--index] [-q|--quiet] [< stash>]

           Работает наподобие но не удалит состояние из stash-списка. В отличие от pop, < stash> может быть любой фиксацией, которая выглядит как фиксация, созданная через stash push или stash create.

       branch < branchname> [< stash>]

           Создает и делает checkout новой ветки с именем < branchname>, начинающейся с фиксации, на которой изначально был создан < stash>, и применяет изменения, записанные < stash>, к новому рабочему дереву и индексу. Если команда завершилась успешно, и < stash> это ссылка в форме stash@{< revision>}, то < stash> выбрасывается.

           Это полезно, если ветка, на которой вы запустили git stash push, изменена настолько, что команда git stash apply завершается неудачей из-за конфликтов. Поскольку stash-сохранение применено поверх фиксации, которая была HEAD в момент, когда была запущена команда git stash, это действие восстановит оригинальное stash-состояние без конфликтов.

       clear

           Удалит все stash-сохранения. Имейте в виду, что эти сохранения будут затем объектом очистки репозитория (pruning), в возможно их нельзя будет восстановить (см. далее ПРИМЕРЫ для возможной стратегии).

       drop [-q|--quiet] [< stash>]

           Удалит одно stash-сохранение из списка stash.

       create

           Создаст элемент stash (который представляет собой обычный объект фиксации), и возвратит его имя объекта, без сохранения его где-либо в ref namespace. Это сделано для использования в скриптах. Вероятно это не та команда, которую бы вы хотели использовать; см. выше "push".

       store

           Сохранит указанный stash, созданный командой git stash create (который является подвешенным merge commit) в stash ref, с обновлением stash reflog. Это сделано для использования в скриптах. Вероятно это не та команда, которую бы вы хотели использовать; см. выше "push".

ОПЦИИ

       -a, --all

           Эта опция допустима только для команд push и save. Все проигнорированные и не отслеживаемые файлы также попадут в stash и затем очистятся командой git clean [5].

       -u, --include-untracked, --no-include-untracked

           При использовании с командами push и save все не отслеживаемые файлы также попадут в stash и затем очистятся командой git clean [5].

           При использовании с командой show покажет не отслеживаемые файлы в stash-сохранении как часть diff.

       --only-untracked

           Эта опция допустима только для команды show.

           Покажет только не отслеживаемые файлы в stash-сохранении как часть diff.

       --index

           Эта опция допустима только для команд pop и apply.

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

       -k, --keep-index, --no-keep-index

           Эта опция допустима только для команд push и save. Все изменения, уже добавленные в индекс, остаются нетронутыми.

       -p, --patch

           Эта опция допустима только для команд push и save.

           Интерактивно выберите звенья из различий между HEAD и рабочим деревом, которое будет сохранено stash. Элемент stash построен таким образом, что его состояние индекса совпадает с состоянием индекса вашего репозитория, а его рабочее дерево содержит только изменения, выбранные вами в интерактивном режиме. Затем выполняется откат выбранных изменений из рабочей области. См. раздел "Interactive Mode" в git-add (1), чтобы узнать, как работать в режиме --patch.

           Опция --patch подразумевает --keep-index. Вы можете использовать --no-keep-index, чтобы это отменить.

       --pathspec-from-file=< file>

           Эта опция допустима только для команды push.

           Вместо аргументов командной строки передаются pathspec в < file>. Если < file> точно -, то используется стандартный ввод. Элементы pathspec отделяются друг от друга LF или CR/LF. Элементы pathspec могут быть заключены в двойные кавычки, как было объяснено для переменной конфигурации core.quotePath (см. git-config(1)). См. также --pathspec-file-nul и global --literal-pathspecs.

       --pathspec-file-nul

           Эта опция допустима только для команды push.

           Имеет смысл только с --pathspec-from-file. Элементы pathspec разделяются символом NUL, и все другие символы берутся литерально (включая символы новых строк и двойные кавычки).

       -q, --quiet

           Эта опция допустима только для команд apply, drop, pop, push, save, store.

           Подавляет любые сообщения обратной связи.

       --

           Эта опция допустима только для команды push.

           Отделяет pathspec от опций с целью разрешения неоднозначности.

       < pathspec>...

           Эта опция допустима только для команды push.

           Новый элемент stash запишет измененные состояния только для файлов, которые соответствуют pathspec. Элементы индекса и файлы рабочего дерева откатываются обратно к состоянию HEAD также только для этих файлов, оставляя неизменными файлы, которые не соответствуют pathspec.

           Для дополнительной информации см. элемент pathspec entry в gitglossary(7).

       < stash>

           Эта опция допустима только для команд apply, branch, drop, pop, show.

           Ссылка в форме stash@{< revision>}. Когда не указана < stash> подразумевается последний элемент stash (т. е. stash@{0}).

ОБСУЖДЕНИЕ

       Элемент (сохранение) stash представлен как фиксация, дерево которой записывает состояние рабочего каталога, а его первым родительским элементом является фиксация на HEAD когда элемент stash был создан. Дерево второго родителя записывает состояние индекса при создании элемента, и он становится потомком фиксации HEAD. Граф наследования выглядит примерно так:

                  .----W
                 /    /
           -----H----I

       Здесь H это фиксация HEAD, I это фиксация, записывающая состояние индекса, и W это фиксация, записывающая состояние рабочего дерева.

ПРИМЕРЫ

       Pull в грязное дерево

           Когда находитесь посередине какой-то работы, вы узнаете, что что-то в основном потоке разработки (upstream) поменялось, и возможно имеет отношение к тому, что вы делаете. Когда ваши локальные изменения не конфликтуют с изменениями в upstream, простой git pull позволит вам двигаться дальше.

           Однако есть случаи, когда ваши локальные изменения создают конфликт с изменениями в upstream, и git pull отказывается перезаписать ваши изменения. В таком случае вы все равно можете сделать stash для ваших изменений, выполнить pull, и затем откатить stash, примерно так:

               $ git pull
                ...
               файл foobar не обновился, слияние невозможно
               $ git stash
               $ git pull
               $ git stash pop

       Прерванный рабочий процесс

           Когда находитесь посередине какой-то работы, пришел ваш босс и потребовал немедленно что-то пофиксить. Обычно вы сделаете commit во временную ветку, чтобы как-то сохранить свои изменения, и вернетесь в оригинальную ветку для внесения требуемых исправлений, примерно так:

               # ... кодите кодите кодите ...
               $ git switch -c my_wip
               $ git commit -a -m "WIP"
               $ git switch master
               $ ... вносите срочные исправления ...
               $ git commit -a -m "Fix in a hurry"
               $ git switch my_wip
               $ git reset --soft HEAD^
               # ... продолжаете кодить ...

           Для упрощения этой процедуры вы можете использовать git stash, примерно так:

               # ... кодите кодите кодите ...
               $ git stash
               $ ... вносите срочные исправления ...
               $ git commit -a -m "Fix in a hurry"
               $ git stash pop
               # ... продолжаете кодить ...

       Тестирование частичных фиксаций

           Вы можете использовать git stash push --keep-index, когда хотите сделать два или большее количество фиксаций из изменений в рабочем дереве, и хотите протестить каждое изменение перед фиксацией:

               # ... кодите кодите кодите ...
               $ git add --patch foo            # добавление только первой части к индексу
               $ git stash push --keep-index    # сохранение всех других изменений в stash
               $ редактирование/сборка/проверка первой части изменений
               $ git commit -m 'First part'     # фиксация полностью проверенного изменения
               $ git stash pop                  # возврат к работе над всем другими изменениями
               # ... повтор предыдущих пяти шагов, пока не останется одна фиксация ...
               $ редактирование/сборка/проверка остальных частей изменений
               $ git commit foo -m 'Remaining parts'

       Восстановление элементов stash entries, которые были по ошибке очищены/выкинуты

           Если вы по ошибке выполнили drop или очистку элементов stash, они не могут быть восстановлены с помощью обычных механизмов безопасности. Однако вы можете попробовать следующее колдунство, чтобы получить список элементов stash, все еще находящихся в вашем репозитории, но более недоступных:

               git fsck --unreachable |
               grep commit | cut -d\  -f3 |
               xargs git log --merges --no-walk --grep=WIP

СМ. ТАКЖЕ

       git-checkout(1), git-commit(1), git-reflog(1), git-reset(1), git-switch(1)

[Ссылки]

1. Инструменты Git Припрятывание и очистка site:git-scm.com.
2. Краткий справочник по Git.
3. Руководство по команде git log.
4. Git: просмотр истории фиксаций.
5git clean: как удалить не отслеживаемые файлы.

 

Добавить комментарий


Защитный код
Обновить

Top of Page