Перейти к содержимому

Введение

undoing changes

Описание

Вместо традиционных систем «отмены» Git использует собственную систему с совершенно другой терминологией, включающую такие команды, как git clean, git rm, git reset и так далее. Каждая из этих команд выполняет определенные функции и используется для отмены изменений в локальных и общих репозиториях.

Просмотр старых коммитов

После создания истории проекта становится возможным просмотреть все коммиты в ней. Лучшим инструментом для просмотра старых коммитов считается git log. У каждого коммита есть свой уникальный хеш, который используется для возврата к этому коммиту.

Введение

bash
git log --oneline
a3b2a21ad Crossword solver with Vue.js
c54ce0237 New logic for crossword game
3acb8d0de Some changes in crossword logic
de32112e3 Styling crossword table area

По умолчанию git log отображает только коммиты выбранной ветки. Чтобы просмотреть все коммиты во всех ветках, выполните команду git log --all. Используйте git checkout или git switch для перехода к другим веткам.

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

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

git log --oneline

bash
git log --oneline

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

Результат git log

bash
b7119f2 Changes in Scrabble Solver
234be24 Fixing search input bug 
b235bf4 Make some changes to solver.php
256a81c Create solver.php
3243e12 Initial changes

Используйте команду git checkout, чтобы перейти к нужному коммиту.

git checkout commit

bash
git checkout b235bf4

После этого у вас появится возможность просматривать файлы, запускать тесты и так далее. Даже если вы отредактируете файлы, вы можете быть уверены, что текущее состояние вашего проекта не будет потеряно, поскольку все ваши действия здесь не сохранятся в репозитории. Выполните команду git checkout master, чтобы вернуться к текущему состоянию проекта и продолжить разработку.

git checkout branch

bash
git checkout master

Вернувшись в ветку master, вы можете использовать git revert или git reset, чтобы отменить любые изменения.

Отмена зафиксированного снимка

Существует несколько способов отмены коммита. Предположим, история наших коммитов выглядит следующим образом:

Отмена зафиксированного снимка

bash
git log --oneline
863fa8e Making some improvements
b235bf4 Make some changes to solver.php
256a81c Create solver.php
3243e12 Initial changes

Ниже мы рассмотрим различные методы отмены коммита 863fa8e Making some improvements.

Отмена коммитов с помощью git checkout

Команда git checkout перейдет к предыдущему коммиту, b235bf4, переведя репозиторий в состояние до внесения улучшений. В результате состояние репозитория станет «отсоединенным HEAD» (detached HEAD). Нахождение в отсоединенном состоянии означает, что каждый новый созданный коммит станет «сиротой» при возврате к обычной ветке. Такие коммиты-сироты в конечном итоге могут быть удалены сборщиком мусора Git. Чтобы не потерять работу, создайте ветку из этого состояния. Из состояния отсоединенного HEAD репозитория вы можете выполнить git checkout -b new_branch_without_improvement_commit. В результате у вас появится новая ветка с именем new_branch_without_improvement_commit, и вы перейдете в это состояние. Теперь у нас есть новая временная шкала истории без коммита 863fa8e. На этом этапе, когда коммит 863fa8e больше не существует, мы можем рассмотреть некоторые стратегии отмены.

Отмена публичного коммита с помощью git revert

Команда git revert HEAD создает новый коммит, содержащий обратные изменения последнего коммита, и добавляет его в текущую ветку:

Отмена публичного коммита с помощью git revert

bash
git log --oneline
23a4b42 Revert "Making some improvements"
234be24 Making some improvements
b235bf4 Make some changes to solver.php
256a81c Create solver.php
3243e12 Initial changes

Теперь коммит 234be24 снова отменен, хотя он все еще присутствует в истории, а новый коммит 23a4b42 является обратной версией изменений, внесенных в 234be24. В отличие от предыдущего метода с checkout, вы можете продолжать работать в той же ветке. Это идеальный метод «отмены» для работы с репозиториями, доступными публично.

Отмена коммита с помощью git reset

Команда git reset является универсальной и имеет множество применений. При выполнении git reset --hard b235bf4 история коммитов будет сброшена до указанного коммита. На этом этапе выполнение git log покажет, что история выглядит следующим образом:

Отмена коммита с помощью git reset

bash
git log --oneline
b235bf4 Make some changes to solver.php
256a81c Create solver.php
3243e12 Initial changes

Отмена последнего коммита

Описанные выше стратегии отмены одинаково хорошо работают и с последним коммитом. Однако в некоторых случаях вам не нужно удалять или сбрасывать самый свежий коммит. Возможно, он был создан слишком рано. В таком случае вы можете изменить этот коммит, выполнив git commit --amend, после внесения дополнительных изменений в рабочую директорию и их добавления в индекс с помощью git add. В этот момент Git откроет настроенный системный редактор, позволяющий изменить сообщение последнего коммита. Эти новые изменения будут добавлены к измененному коммиту.

Отмена незафиксированных изменений

Изменения находятся в индексе подготовки (staging index) и в рабочей директории до фиксации в истории репозитория. Поэтому вы можете захотеть отменить их в этих двух областях. Если вам нужна более подробная информация об этих областях, ознакомьтесь с командой git reset.

bash
# Unstage a file
git reset HEAD <file>
# Discard changes in the working directory
git checkout -- <file>

Рабочая директория

Рабочая директория представляет собой файлы в файловой системе вашего компьютера, которые доступны редактору кода для внесения изменений. Git предоставляет несколько инструментов для управления рабочей директорией, включая команды git clean и git reset.

Индекс подготовки

Индекс подготовки (staging index) — это одно из деревьев Git. Он отслеживает изменения, зафиксированные в рабочей директории. Команда, добавляющая изменения в область подготовки, — это git add. Здесь мы можем использовать команду git reset для отмены изменений. Сброс с флагом --mixed перемещает изменения из индекса подготовки обратно в рабочую директорию.

Отмена публичных изменений

Лучший способ отмены публичных изменений — использование команды git revert. Никогда не используйте git reset для этих целей, так как это удалит коммиты из общей истории. git reset предназначен для отмены локальных изменений в рабочей директории и индексе подготовки. git revert сохранит коммиты, которые вы хотите отменить, и создаст новый коммит вместо того, который вам не нужен.

Практика

Каковы функции различных команд Git, используемых для отмены изменений и коммитов?

Считаете ли это полезным?

Предпросмотр dual-run — сравните с маршрутами Symfony на продакшене.