revert, checkout, reset
Команды revert
, checkout
, reset
позволяют отменять изменения в репозитории и управлять ими. Поведение похожее, поэтому команды действительно легко спутать. Рассмотрим подробно
каждую из них.
git revert
Команда git revert
– безопасный способ отменить операцию без потери истории коммитов.
Команда отменяет действия прошлых коммитов, создавая новый, содержащий все отменённые изменения. Эта команда полезна, когда вы уже запушили изменения в удаленный репозиторий, так как она сохраняет нетронутым исходный коммит.
Откатиться с помощью commit-хэшей:
Можно и с помощью диапазонов:
git checkout
Универсальный
инструмент git checkout
позволяет переключаться между ветками, проверять старые коммиты и
отменять локальные незакоммиченные изменения, переключая HEAD
и изменяя рабочий каталог.
Для переключения между ветками:
Для проверки более старого коммита с помощью хэша:
Чтобы проверить более старый коммит, используя диапазоны:
Чтобы отменить все локальные незакоммиченные изменения:
Чтобы отменить определенное локальное незакоммиченное изменение:
git reset
Команда git reset
– это мощный способ отменить операцию. Существует три возможных аргумента:
--mixed
Значение по умолчанию. Команда
git reset --mixed
аналогична git reset
. Вы переключите
HEAD
на последний коммит, и все изменения, добавленные после него, будут
доступны в качестве неотслеживаемых (untracked
) изменений в вашем рабочем
каталоге.
--soft
HEAD переключается
на последний коммит, однако, изменения, добавленные после этой фиксации,
остаются с пометкой staged
.
--hard
Используйте команду git
reset --hard
только тогда, когда вы знаете, что делаете. Вы переключите HEAD
на
последний коммит и уничтожите изменения, сделанные после него. Это действие не
может быть отменено.
Вы не должны
использовать git reset
, когда вы уже запушили данные на удаленный репозиторий.
Удаление коммита другого члена команды нарушит его рабочий процесс.
Используйте git reset
-- [имя файла]
, чтобы отменить изменения в файле, который еще не был
зафиксирован.
merge vs rebase
Когда над проектом
работает несколько человек, в какой-то момент нужно объединить код.
Команды rebase
и merge
имеют разные подходы для консолидации изменений из одной
ветви в другую.
git merge
В git merge
используется
неразрушающая операция для объединения историй двух веток без их изменения. Команда создает новый merge commit
. Это отличный
способ консолидировать изменения, однако ваша история коммитов может получить
несколько merge-коммитов в зависимости от того, насколько активна мастер-ветка.
Чтобы объединить последние изменения из master в вашу ветку:
git rebase
Команда git rebase
перемещает историю всей ветки поверх другой,
переписывая историю проекта новыми коммитами.
Команда полезна, если вы предпочитаете чистую и линейную историю проекта. Однако перестроить изменения, перенесенные в главную ветку удаленного репозитория небезопасно, т. к. вы будете изменять историю главной ветви, в то время как члены вашей команды будут продолжать работать над ней.
Кроме того, Git не
позволит вам легко запушить пересобранный бранч на удаленный репозиторий. Вам придется
заставить его это сделать при помощи git push --force
, который перезаписывает
удаленную ветку и может вызвать проблемы у других участников.
Заключение
Git очень мощный инструмент, имеющий массу интересных и малоизвестных команд. В этой публикации мы рассмотрели команды, которые чаще всего вызывают бурю эмоций и комментариев на просторах сети. Внимательно изучите данные команды, и если что-то останется непонятным – обратитесь к официальному хелпу.
Комментарии