Сравнение 5 команд Git: revert, checkout, reset, merge и rebase
by eFusionrevert, checkout, reset
123ad3bd-d2f7-4386-9c75-45b86a7e015bКоманды revert
, checkout
, reset
позволяют отменять изменения в репозитории и управлять ими. Поведение похожее, поэтому команды действительно легко спутать. Рассмотрим подробно каждую из них.
git revert
b73c7b7c-2fdc-48a4-bee3-fe44b1d8a826Команда git revert
– безопасный способ отменить операцию без потери истории коммитов. Команда отменяет действия прошлых коммитов, создавая новый, содержащий все отменённые изменения. Эта команда полезна, когда вы уже запушили изменения в удаленный репозиторий, так как она сохраняет нетронутым исходный коммит.
0f1c865f-fc87-47bd-942b-150e49b66e47Откатиться с помощью commit-хэшей:
git revert [SHA]
49cf6d10-ac1e-49db-909f-79d62bdf5efbМожно и с помощью диапазонов:
git revert HEAD~[num-of-commits-back]
git checkout
61e2b5e7-1695-4fce-ad05-7e66db67a7f6Универсальный инструмент git checkout
позволяет переключаться между ветками, проверять старые коммиты и отменять локальные незакоммиченные изменения, переключая HEAD
и изменяя рабочий каталог.
d1da8e3b-8f10-42c5-8923-c2c93553ca3aДля переключения между ветками:
git checkout [название ветки]
50efd3f1-89b6-4160-ae6b-7aa6b0eaaab0Для проверки более старого коммита с помощью хэша:
git checkout [SHA]
4dd14b29-e8ee-4f86-8852-5d2d3fcc0b61Чтобы проверить более старый коммит, используя диапазоны:
git checkout HEAD~[num-of-commits-back]
6235100f-d3d8-411b-99cd-97c66daeab79Чтобы отменить все локальные незакоммиченные изменения:
git checkout
b7de08f1-9ad4-4bd3-8572-40c3b8d985ceЧтобы отменить определенное локальное незакоммиченное изменение:
git checkout -- [имя файла]
git reset
1892ede9-0038-41c3-9e6c-2f8ee0f5ee84Команда git reset
– это мощный способ отменить операцию. Существует три возможных аргумента:
074b4173-93a8-4ab5-8c9b-9cfd57a963a4--mixed
1c8e0616-10df-4e78-a63f-3aca780bfc66Значение по умолчанию. Команда git reset --mixed
аналогична git reset
. Вы переключите HEAD
на последний коммит, и все изменения, добавленные после него, будут доступны в качестве неотслеживаемых (untracked
) изменений в вашем рабочем каталоге.
b9b29ebd-8e3f-441a-8fa3-9f9022beeab2--soft
3e1af80d-08f8-4b19-aee7-7c56401bc9b0HEAD переключается на последний коммит, однако, изменения, добавленные после этой фиксации, остаются с пометкой staged
.
86c06c4c-cf93-42a8-95ca-c63e55448906--hard
870491c4-0b9b-4bbd-964f-5cdc81892c19Используйте команду git reset --hard
только тогда, когда вы знаете, что делаете. Вы переключите HEAD
на последний коммит и уничтожите изменения, сделанные после него. Это действие не может быть отменено.
09cffb52-c6ba-440d-a06d-c80522f6d290Вы не должны использовать git reset
, когда вы уже запушили данные на удаленный репозиторий. Удаление коммита другого члена команды нарушит его рабочий процесс.
fb9f16e1-e824-47cc-9915-436ce532c565Используйте git reset -- [имя файла]
, чтобы отменить изменения в файле, который еще не был зафиксирован.
merge vs rebase
e396a3fc-c306-460a-9066-daa66c5781eaКогда над проектом работает несколько человек, в какой-то момент нужно объединить код. Команды rebase
и merge
имеют разные подходы для консолидации изменений из одной ветви в другую.
git merge
7a35ba3e-8d05-4aee-96fd-f868d837a8c9В git merge
используется неразрушающая операция для объединения историй двух веток без их изменения. Команда создает новый merge commit
. Это отличный способ консолидировать изменения, однако ваша история коммитов может получить несколько merge-коммитов в зависимости от того, насколько активна мастер-ветка.
d88b8a25-1647-4097-9d2c-027ce5ddb74eЧтобы объединить последние изменения из master в вашу ветку:
git checkout [branch-name]
git merge master
git rebase
a16324e8-1482-41d8-8448-7f88e0bf1c95Команда git rebase
перемещает историю всей ветки поверх другой, переписывая историю проекта новыми коммитами.
dc45c1ba-26af-47e0-b21a-a3dd323580ebКоманда полезна, если вы предпочитаете чистую и линейную историю проекта. Однако перестроить изменения, перенесенные в главную ветку удаленного репозитория небезопасно, т. к. вы будете изменять историю главной ветви, в то время как члены вашей команды будут продолжать работать над ней.
ab12f8b1-4749-4cd7-a5aa-2debcf130a4fКроме того, Git не позволит вам легко запушить пересобранный бранч на удаленный репозиторий. Вам придется заставить его это сделать при помощи git push --force
, который перезаписывает удаленную ветку и может вызвать проблемы у других участников.
Заключение
d76f04ca-56d2-4e19-b776-c8bee39a728bGit очень мощный инструмент, имеющий массу интересных и малоизвестных команд. В этой публикации мы рассмотрели команды, которые чаще всего вызывают бурю эмоций и комментариев на просторах сети. Внимательно изучите данные команды, и если что-то останется непонятным – обратитесь к официальному хелпу.