Сохранение незавершенной работы

GitGitBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

С возвращением, исследователь Git! Сегодня мы углубимся в одну из самых полезных функций Git для управления незавершенной работой: в функцию stash (хранения изменений). Возникало ли у вас такое, что вы работали над какой-то функцией, а потом внезапно вам нужно было переключиться на другую задачу? Git stash приходит на помощь!

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

В этом LabEx вы узнаете, как использовать Git stash для сохранения незавершенной работы, как применить сохраненные изменения, создать ветки из сохраненных состояний, управлять несколькими сохраненными состояниями и очистить их. По окончанию этого LabEx у вас появится мощный новый инструмент в вашем арсенале Git, который сделает ваш рабочий процесс более плавным и гибким.

Давайте начнем и раскроем мощь Git stash!


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL git(("Git")) -.-> git/BranchManagementGroup(["Branch Management"]) git(("Git")) -.-> git/SetupandConfigGroup(["Setup and Config"]) git(("Git")) -.-> git/BasicOperationsGroup(["Basic Operations"]) git(("Git")) -.-> git/DataManagementGroup(["Data Management"]) git/SetupandConfigGroup -.-> git/init("Initialize Repo") git/BasicOperationsGroup -.-> git/commit("Create Commit") git/DataManagementGroup -.-> git/stash("Save Changes Temporarily") git/BranchManagementGroup -.-> git/branch("Handle Branches") subgraph Lab Skills git/init -.-> lab-387492{{"Сохранение незавершенной работы"}} git/commit -.-> lab-387492{{"Сохранение незавершенной работы"}} git/stash -.-> lab-387492{{"Сохранение незавершенной работы"}} git/branch -.-> lab-387492{{"Сохранение незавершенной работы"}} end

Настройка рабочего пространства

Прежде чем мы приступим к использованию функции stash (хранения изменений), настроим рабочее пространство для экспериментов. Мы создадим новую директорию, инициализируем репозиторий Git и добавим некоторый начальный контент.

Откройте терминал и введите следующие команды:

cd ~/project
mkdir git-stash-lab
cd git-stash-lab
git init
echo "## Git Stash Lab" > README.md
git add README.md
git commit -m "Initial commit"

Разберем, что делают эти команды:

  1. cd ~/project: Эта команда изменяет текущую директорию на папку "project" в вашем домашнем каталоге.
  2. mkdir git-stash-lab: Эта команда создает новую директорию с именем "git-stash-lab".
  3. cd git-stash-lab: Эта команда перемещает вас в только что созданную директорию.
  4. git init: Эта команда инициализирует новый репозиторий Git в текущей директории.
  5. echo "## Git Stash Lab" > README.md: Эта команда создает новый файл с именем "README.md" с содержимым "## Git Stash Lab".
  6. git add README.md: Эта команда добавляет новый файл в область подготовленных изменений (staging area) для коммита.
  7. git commit -m "Initial commit": Эта команда создает ваш первый коммит с подготовленными изменениями.

Отлично! Теперь у нас есть репозиторий с одним коммитом. Проверим статус:

git status

Вы должны увидеть сообщение, говорящее, что ваше рабочее дерево чисто. Это означает, что мы готовы начать экспериментировать с функцией Git stash!

Если вы столкнетесь с какими-либо проблемами, убедитесь, что вы находитесь в правильной директории и что Git установлен на вашей системе. Вы можете проверить установку Git, выполнив команду git --version.

Сохранение изменений в stash

Теперь, когда рабочее пространство настроено, давайте внесем некоторые изменения и узнаем, как сохранить их в stash (хранилище временных изменений).

Сначала внесем изменения в файл README.md:

echo "This is a work in progress" >> README.md

Эта команда добавляет новую строку в файл README.md. Также создадим новый файл:

echo "Some important notes" > notes.txt

Теперь, если выполнить команду git status, мы увидим, что есть как измененные, так и неотслеживаемые файлы:

git status

Вы должны увидеть вывод, показывающий, что файл README.md изменен, а файл notes.txt не отслеживается.

Представьте, что в этот момент вам нужно быстро переключиться на другую задачу, но вы не готовы коммитить (фиксировать) эти изменения. Именно здесь пригодится команда git stash!

Чтобы сохранить изменения в stash, выполните:

git stash

Вы должны увидеть вывод, похожий на следующий:

Saved working directory and index state WIP on master: 1234567 Initial commit

Теперь, если снова выполнить команду git status, вы увидите что-то интересное:

git status

Вы заметите, что файл README.md больше не показывается как измененный, но файл notes.txt все еще перечислен как неотслеживаемый. Это важный момент о команде git stash:

Важно: По умолчанию команда git stash сохраняет только:

  1. Изменения в отслеживаемых файлах (файлах, которые уже отслеживаются Git)
  2. Подготовленные к коммиту изменения (staged changes)

Неотслеживаемые файлы (как наш notes.txt) по умолчанию не включаются в stash. Это поведение гарантирует, что Git случайно не скроет новые файлы, которые вы, возможно, не хотите включать в репозиторий.

Если вы хотите включить неотслеживаемые файлы в stash, вы можете использовать опцию -u (или --include-untracked):

git stash -u

После выполнения этой команды как изменения в файле README.md, так и новый файл notes.txt будут сохранены в stash.

Чтобы посмотреть, что находится в вашем stash, вы можете использовать:

git stash list

Вы должны увидеть одну или две записи в stash, в зависимости от того, использовали ли вы опцию -u.

Нажмите q, чтобы выйти из просмотра списка stash.

Помните, что сохранение изменений в stash идеально подходит для быстрых переключений контекста. Однако это не замена коммитам в долгосрочном рабочем процессе. Stash предназначен для временного хранения.

Применение сохраненных в stash изменений

Теперь, когда мы сохранили наши изменения в stash, давайте узнаем, как вернуть их. Для этого есть два основных комманды: git stash apply и git stash pop.

Начнем с git stash apply:

git stash apply

После выполнения этой команды вы, возможно, заметите что-то неожиданное. Проверим статус:

git status

Вы должны увидеть вывод, похожий на следующий:

On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        notes.txt

nothing added to commit but untracked files present (use "git add" to track)

Неожиданно, вы увидите только файл notes.txt как неотслеживаемый, и никаких изменений в файле README.md не будет видно. Это происходит по следующим причинам:

  1. На шаге 2 мы сначала использовали git stash без опции -u, которая сохранила только изменения в файле README.md.
  2. Затем мы использовали git stash -u, которая сохранила как изменения в файле README.md, так и неотслеживаемый файл notes.txt.
  3. Когда мы применяем stash, Git применяет самый свежий stash (тот, который был создан с опцией -u), но изменения в файле README.md не отображаются, потому что они уже были включены в предыдущий stash.

Чтобы увидеть все изменения, включая те, что были сделаны в файле README.md, вы можете использовать:

git stash apply stash@{1}

Теперь, если вы снова проверите статус, вы должны увидеть как изменения в файле README.md, так и файл notes.txt как неотслеживаемый.

Эта ситуация подчеркивает важный аспект работы с stash: порядок создания и применения stash может повлиять на результат. Лучше всегда проверять содержимое своих stash перед их применением, особенно когда вы работаете с несколькими stash.

Разница между apply и pop заключается в том, что apply сохраняет изменения в stash, в то время как pop удаляет их из stash после применения.

git stash clear
git stash -u
git stash list

Сначала мы очищаем все stash, чтобы начать с чистого листа, затем сохраняем наши изменения с опцией -u, чтобы включить неотслеживаемые файлы. Наконец, мы выводим список своих stash, чтобы убедиться, что stash был создан.

Давайте снова сохраним наши изменения в stash и попробуем pop:

git stash pop

Вы увидите вывод, похожий на предыдущий, но если теперь выполнить git stash list, вы увидите, что ваш stash пуст.

Зачем нужны и apply, и pop? apply полезен, когда вы хотите применить одни и те же сохраненные в stash изменения к нескольким веткам. pop чаще используется, когда вы просто продолжаете работу на той же ветке.

Создание ветки из stash

Иногда вы можете понять, что изменения, сохраненные в stash, должны быть на отдельной ветке. Git делает это простым с помощью команды git stash branch.

Сначала создадим новые изменения и сохраним их в stash:

echo "Feature in progress" >> README.md
echo "More notes" >> notes.txt
git stash -u

Теперь создадим новую ветку с этими изменениями:

git stash branch feature-branch

Эта команда создает новую ветку с именем "feature-branch", переключается на нее и затем применяет сохраненные в stash изменения к ней. Затем stash удаляется из списка stash.

Вы должны увидеть вывод, похожий на следующий:

Switched to a new branch 'feature-branch'
On branch feature-branch
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   README.md

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        notes.txt

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (1234567890abcdef1234567890abcdef12345678)

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

Помните, что после создания ветки из stash вам нужно будет закоммитить изменения, если вы хотите сохранить их:

git add README.md notes.txt
git commit -m "Start new feature"

Для возврата на ветку master используйте:

git checkout master

Управление несколькими stash

При работе с Git вы можете сохранить несколько наборов изменений в разных stash. Git позволяет легко управлять несколькими stash. Исследуем, как создавать, перечислять и управлять несколькими stash.

Сначала создадим три stash с разными изменениями:

## First stash
echo "Change 1" >> README.md
git stash push -m "First change"

## Second stash with untracked file
echo "Change 2" >> README.md
echo "Note 2" >> notes.txt
git stash push -u -m "Second change"

## Third stash
echo "Change 3" >> README.md
git stash push -m "Third change"

Разберем, что мы сделали:

  1. Создали первый stash с изменением в файле README.md.
  2. Создали второй stash с изменением в файле README.md и новым неотслеживаемым файлом.
  3. Создали третий stash с еще одним изменением в файле README.md.
  4. Использовали флаг -m, чтобы добавить описательные сообщения.
  5. Использовали флаг -u для второго stash, чтобы включить неотслеживаемый файл.

Теперь выведем список наших stash:

git stash list

Вы должны увидеть вывод, похожий на следующий:

stash@{0}: On master: Third change
stash@{1}: On master: Second change
stash@{2}: On master: First change

Вы можете просмотреть содержимое stash без его применения:

git stash show stash@{1}

Для получения более подробной информации добавьте флаг -p, чтобы увидеть полный дифф:

git stash show -p stash@{1}

Создадим еще два stash, чтобы потренироваться в управлении большим набором изменений:

## Fourth stash
echo "Change 4" >> README.md
git stash push -m "Fourth change"

## Fifth stash
echo "Change 5" >> README.md
git stash push -m "Fifth change"

Проверьте список своих stash еще раз:

git stash list

Теперь в списке должно быть пять stash:

stash@{0}: On master: Fifth change
stash@{1}: On master: Fourth change
stash@{2}: On master: Third change
stash@{3}: On master: Second change
stash@{4}: On master: First change

Управление несколькими stash может быть полезно, когда вы одновременно работаете над несколькими задачами. Однако старайтесь не накапливать слишком много stash, так как это может привести к путанице. Рассмотрите возможность использования веток для более длительной работы.

Помните: stash предназначены для временного хранения. Если вы храните stash длительное время, рассмотрите возможность использования функциональных веток (feature branches) или коммитинга своих изменений.

Очистка stash

При использовании stash в рабочем процессе вы можете накопить stash, которые вам больше не нужны. Хорошей практикой является регулярная очистка stash, чтобы все было организовано.

Для удаления одного stash вы можете использовать команду drop, которую мы видели ранее:

git stash drop stash@{2}

Это удаляет самый старый stash из нашего списка.

Если вы хотите удалить все свои stash сразу, вы можете использовать:

git stash clear

Будьте очень осторожны с этой командой! Она удалит все ваши stash, и это действие нельзя отменить.

Другая полезная команда - git stash pop, которую мы также видели ранее. Она применяет самый свежий stash и затем удаляет его из списка stash:

git stash pop

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

Итоги

Поздравляем, мастер Git stash! Вы только что добавили мощный новый инструмент в свой арсенал Git. Давайте повторим ключевые концепции, которые мы рассмотрели:

  1. Сохранение изменений в stash: Вы узнали, как временно сохранить незавершенную работу с помощью git stash.
  2. Применение сохраненных в stash изменений: Вы узнали, как вернуть сохраненные в stash изменения с помощью git stash apply и git stash pop.
  3. Создание веток из stash: Вы увидели, как превратить сохраненный набор изменений в новую ветку с помощью git stash branch.
  4. Управление несколькими stash: Вы узнали, как работать с несколькими stash, применяя и просматривая определенные stash по мере необходимости.
  5. Очистка stash: Вы научились правильно управлять stash, узнав, как удалять отдельные stash и очищать все stash.

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

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