Мы ежедневно работаем с системой контроля версий, как правило, это Git. Система контроля версий позволяет организовать совместную работу над проектом и отслеживать вносимые изменения, при этом мы можем выполнить откат к предыдущей версии, если потребуется.
Новички быстро осваивают Git и начинают использовать его в работе. Но иногда может потребоваться откатится к предыдущей версии и сделать это нужно правильно. Эта задача нередко ставит новичков в тупик.
Чтобы начать работу с системой контроля версий Git вам необходимо создать репозиторий на GitHub или GitLab.
Необходимо клонировать созданный репозиторий. В результате у вас будет локальная копия (Local Repository) удалённого репозитория (Remote Repository), как на схеме выше.
git clone https://github.com/<your_user_name>/<repo_name>
Важно понимать, что когда вы работаете над проектом все изменения по-прежнему хранятся только в рабочем каталоге (Working Directory). Чтобы Git начал отслеживать состояние файлов необходимо добавить их в индекс (Staging).
Команда добавляет указанный файл в индекс:
git add <file-name>
Можно сразу добавить все файлы в индекс:
git add .
Можно проверить, что файлы действительно добавлены в индекс:
git status
Но все изменения, которые мы сделали по-прежнему, хранятся только в рабочем каталоге. Чтобы сохранить изменения в Git, нужно их зафиксировать, создав коммит.
Старайтесь снабжать коммиты информативными комментариями, это поможет вам быстро находить необходимые коммиты.
git commit -m "<comment>"
Посмотреть содержимое последнего коммита
git show HEAD
HEAD
- это hash последнего коммита.
Чтобы отобразить последние изменения в рабочем каталоге, которые ещё не включены в коммит, выполните команду:
git diff
Вы также можете посмотреть историю коммитов в данной ветке.
git log
Вывод команды git log
содержит хэш коммитов. Вы можете использовать хэш коммитов вместе с командами git show
и git diff,
чтобы получить информацию о любом коммите, а также сравнить два коммита между собой.
Утилита git
достаточно информативна, но рекомендую попробовать утилиту tig, работать с ней ещё удобнее.
Теперь наш локальный репозиторий содержит информацию об изменениях, осталось обновить информацию в удалённом репозитории. Сделать это не сложно:
git push
Ваши коллеги, работающие над проектом, точно так же могут сохранять изменения в удалённый репозиторий. Вы всегда можете загрузить последние изменения из удаленного репозитория, чтобы работать с последней версией файлов:
git pull
Если вы регулярно используете Git в своей работе, то, скорее всего, описанные команды вам знакомы и вы пользуетесь ими регулярно. Но как быть, если нужно откатить состояние на определённый коммит? С этим порой возникают проблемы. Хотя ничего сложного в этом нет, сейчас разберёмся.
Предположим, возникла ситуация, когда в ходе работы над проектом вы поняли, что последние коммиты не нужны, например, была допущена ошибка в первом из них. Мы можем указать, на какой коммит нужно откатиться, и все коммиты, созданные после него будут удалены. Для примера откатимся на 2 коммита назад:
git reset HEAD~2
Также можно откатится на определённый коммит, указав его хэш:
git reset <commit_hash>
Учтите, что будут удалены только коммиты, содержимое файлов в рабочем каталоге при этом не изменится. Чтобы удалить эти файлы, выполните команду:
git checkout .
Можно также откатить изменения в определенном файле:
git checkout <file_name>
Но так как файлы будут удалены безвозвратно, лучше предварительно выполнить команду git status
, чтобы убедиться, что эти файлы больше не нужны.
Обратите внимание, что у команды git reset
есть три режима работы:
soft - HEAD будет указывать на коммит, который вы указали в команде. При этом индекс не меняется.
mixed (default) - HEAD также будет указывать на коммит, который вы указали в команде. Но изменения, связанные с удалёнными коммитами, будут удалены из индекса. Если выполнить команду
git commit
, то ничего не произойдёт.hard - повторят эффект mixed, но также изменит файлы в вашем рабочем каталоге.
Таким образом, вы можете использовать флаг --hard
вместо команды git checkout
.
Внести указанные изменения вы можете, если изменения ещё не отправлены в удалённый репозиторий.
Так же есть возможность отредактировать последний коммит не удаляя его. Например, вы сделали коммит преждевременно. В этом случае его можно исправить.
После того, как вы внесёте дополнительные изменения в рабочий каталог, добавьте их в раздел проиндексированных файлов с помощью команды git add
, потом выполните команду:
git commit --amend
При этом Git откроет редактор, где вы сможете изменить комментарий этого коммита. Все зафиксированные изменения будут добавлены в отредактированный коммит.
Если изменения уже отправлены в удалённый репозиторий, можно создать новый коммит, который будет содержать обратные изменения. Таким образом, можно откатить несколько коммитов.
git revert <commit_hash>
Команду git revert
можно также использовать с HEAD
, если нам нужно отменить последний коммит.
Обратите внимание на ещё одну команду git restore
, которая помогает отменить незафиксированные локальные изменения. Эту команду можно использовать для отмены действий команды git add
, чтобы убрать из индекса файлы, которые вы добавили ранее.
git restore --staged <file>
Также эту команду можно использовать для отмены локальных изменений в файле, тем самым восстанавливая его последнее зафиксированное состояние:
git restore <file>
Вы также можете восстановить состояние файла на определённый коммит.
Подписывайтесь на наш телеграм-канал Mops DevOps, чтобы не пропустить лучшие статьи, видео и митапы!
nanallew
Привет автор :) Не совсем понятен посыл этого поста, быстрый старт откатывания файлов?) Прошу прощения, но эту информацию можно получить с помощью одного запроса в гугле, зачем тогда всё остальное тут описано?) Сам пост, это какой-то нисходящий подход к изучению гита с явным упором не на новичков, а например на людей которые пользовались Hg и решили «быстро» изучить что же такое Git.
Советую дополнить пост что бы не оставлять труд на полуготовности, например рассмотри такие моменты:
— А что такое гит?
— Что из себя представляет модель гита?
— Какие процессы в реальном мире можно рассматривать по аналогии к гиту?
— Что упрощает или позволяет делать ГИТ?
— Каким образом работают команды?
А то получается что «быстрый» старт тут от идеи быстро написать пост о чём то небольшом и не существенном.
Удачи автору:)