Сравнение 5 команд Git: revert, checkout, reset, merge и rebase

by

revert, checkout, reset

123ad3bd-d2f7-4386-9c75-45b86a7e015bКоманды revert, checkout, reset позволяют отменять изменения в репозитории и управлять ими. Поведение похожее, поэтому команды действительно легко спутать. Рассмотрим подробно каждую из них.

https://media.proglib.io/posts/2020/05/22/b75f03e58681bec96367bfcc3a7b310f.jpg

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]

https://media.proglib.io/posts/2020/05/22/2351ca6b34a823caaec68e851376704e.png
Действие git revert

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 -- [имя файла]

https://media.proglib.io/posts/2020/05/22/52409697a255713cad06128fae1c6834.png
Действие 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 на последний коммит и уничтожите изменения, сделанные после него. Это действие не может быть отменено.

https://media.proglib.io/posts/2020/05/22/71eaee16d7f0dbf6e1b9540488dbb87c.png
Действие git reset

09cffb52-c6ba-440d-a06d-c80522f6d290Вы не должны использовать git reset, когда вы уже запушили данные на удаленный репозиторий. Удаление коммита другого члена команды нарушит его рабочий процесс.

fb9f16e1-e824-47cc-9915-436ce532c565Используйте git reset -- [имя файла], чтобы отменить изменения в файле, который еще не был зафиксирован.

merge vs rebase

e396a3fc-c306-460a-9066-daa66c5781eaКогда над проектом работает несколько человек, в какой-то момент нужно объединить код. Команды rebase и merge имеют разные подходы для консолидации изменений из одной ветви в другую.

https://media.proglib.io/posts/2020/05/22/353e2bef5da2f1343d56bbe54ee76692.png
Сравнение merge и rebase

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 очень мощный инструмент, имеющий массу интересных и малоизвестных команд. В этой публикации мы рассмотрели команды, которые чаще всего вызывают бурю эмоций и комментариев на просторах сети. Внимательно изучите данные команды, и если что-то останется непонятным – обратитесь к официальному хелпу.

Источники