

Некоторые команды Git дают схожие результаты. Важно понимать разницу и применять правильные инструменты. Сайт proglib.io опубликовал перевод статьи «Git Explained: An In-Depth Comparison», где объясняется разница между revert, checkout и reset, а также сравниваются merge и rebase.
revert, checkout, reset
Команды revert
, checkout
, reset
позволяют отменять изменения в репозитории и управлять ими. Поведение похожее, поэтому команды действительно легко спутать. Рассмотрим подробно каждую из них.
git revert
Команда git revert
– безопасный способ отменить операцию без потери истории коммитов. Команда отменяет действия прошлых коммитов, создавая новый, содержащий все отменённые изменения. Эта команда полезна, когда вы уже запушили изменения в удаленный репозиторий, так как она сохраняет нетронутым исходный коммит.
Откатиться с помощью commit-хэшей:
git revert [SHA]
Можно и с помощью диапазонов:
git revert HEAD~[num-of-commits-back]


git checkout
Универсальный инструмент git checkout
позволяет переключаться между ветками, проверять старые коммиты и отменять локальные незакоммиченные изменения, переключая HEAD
и изменяя рабочий каталог.
Для переключения между ветками:
git checkout [название ветки]
Для проверки более старого коммита с помощью хэша:
git checkout [SHA]
Чтобы проверить более старый коммит, используя диапазоны:
git checkout HEAD~[num-of-commits-back]
Чтобы отменить все локальные незакоммиченные изменения:
git checkout
Чтобы отменить определенное локальное незакоммиченное изменение:
git checkout -- [имя файла]


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 checkout [branch-name] git merge master
git rebase
Команда git rebase
перемещает историю всей ветки поверх другой, переписывая историю проекта новыми коммитами.
Команда полезна, если вы предпочитаете чистую и линейную историю проекта. Однако перестроить изменения, перенесенные в главную ветку удаленного репозитория небезопасно, т. к. вы будете изменять историю главной ветви, в то время как члены вашей команды будут продолжать работать над ней.
Кроме того, Git не позволит вам легко запушить пересобранный бранч на удаленный репозиторий. Вам придется заставить его это сделать при помощи git push --force
, который перезаписывает удаленную ветку и может вызвать проблемы у других участников.
Заключение
Git очень мощный инструмент, имеющий массу интересных и малоизвестных команд. В этой публикации мы рассмотрели команды, которые чаще всего вызывают бурю эмоций и комментариев на просторах сети. Внимательно изучите данные команды, и если что-то останется непонятным – обратитесь к официальному хелпу.
[customscript]techrocks_custom_after_post_html[/customscript]
[customscript]techrocks_custom_script[/customscript]