Как быстро изучить Git с нуля
Git — это система версионирования документов. Она позволяет пользователям создавать несколько параллельных версий, независимо управлять ими и сливать друг в друга с автоматическим нахождением конфликтных строк.
Когда документ правит один человек, то никаких проблем не возникает, хотя иногда хочется видеть историю изменений с возможностью вернуться на предыдущую версию. А что, если над документом работают два человека?
— Вась, только что залил новую версию отчёта. Добавил одну страницу в третью главу.
— Ёпт, а я третью главу уже с нуля переписал...
— ...
— Ладно, давай подходи к моему компу со своим файлом, счас вместе глянем как это разрулить.
Раньше приходилось либо разбивать такой документ на несколько, чтобы можно было менять каждую часть независимо, либо договариваться, кто что правит, либо слать файл со своими правками, а потом ждать, когда человек пришлёт версию с его внесёнными правками.
А что, если документ содержит сто страниц и его будут править десять человек?
Git
Первая версия Git была создана Линусом Торвальдсом — автором операционной системы Linux. Собственно, с помощью Git она и разрабатывалась.
Первыми с проблемой параллельного редактирования файлов столкнулись программисты, они и разработали решение — Git. Он позволяет хранить файлы в общем хранилище, а также каждому участнику создавать их копию локально. Можно менять файлы, создавать свои версии, откатываться на предыдущие, а потом отправлять финальную версию в хранилище. Гит самостоятельно объединит версии разных людей, либо укажет на конфликт, если, например, оба человека изменили одну и ту же строку. По такому же принципу работает Google Docs и подобные сервисы.
Курсы
Для изучения Git достаточно изучить
- [4h] Githowto — курс на русском, нужно пройти хотя бы первые 38 уроков, чтобы можно было использовать git в реальной жизни.
- [15m] Шпаргалка по gitflow — способ организации веток, чтобы в них не запутаться на средних и больших проектах.
В Githowto сразу же рассказывают, как установить git. Иногда git уже включён в систему по умолчанию, поэтому можно и не устанавливать. Проверить его наличие можно командой в терминале:
$ git --version
git version 2.24.1 (Apple Git-126)
Если ничего не вывелось, значит git не установлен.
Вопросы для самопроверки после курса
- Что такое unstaged, staged и commited состояния у файлов?
- Что такое ветки, как создавать их, переключаться между ними и объединять?
- Как нужно именовать ветки согласно gitflow (master, develop, feature, hotfix, release)?
- В каких случаях git самостоятельно сливает файлы, а в каких создаёт конфликты?
- Как выглядит конфликт и что нужно сделать, чтобы его разрешить?
- Как откатить изменения закоммиченного файла?
- Как откатить изменения закоммиченного и запушенного в удалённый реп файла?
- Что такое git stash и как им пользоваться?
- Что такое репозитории — локальные и удалённые? Как склонировать репозиторий? Как запушить в реп?
- Для каких файлов GIT подходит, а с какими работает плохо: текстовые и бинарные файлы?
- Как исключить файлы из-под контроля Git (.gitignore)?
- Установите алиасы для частых комманд: git ci, git st, git hist, git br, git co.
Дополнительная практика [1h]
Для начала создайте папку проекта с двумя файлами в разметке Markdown. Если не работали с markdown, то считайте их обычными текстовыми файлами.
- README.md
# Знакомство с GIT
Есть отличные курсы:
- http://gitimmersion.com/
- https://githowto.com/ru
А также статья в блоге https://maxkuznetsov.ru/.
- CHANGELOG.md
- Изучен курс GitHowTo
- Ознакомился с Git flow подходом
- Прочитал статью https://maxkuznetsov.ru/all/git-intro и сделал задания
Задачи
- Добавьте поддержку Git в этот проект. Сделайте первый коммит, включающий оба этих файла.
- Создайте от мастера новую feature/md-updates-vasya.
В реальной жизни master используется только для продакшена, а для основной разработки — ветка develop. Новые правки лучше всегда делать в отдельной feature/* ветке, а потом сливать её в develop или master, если вы работаете без develop. - Зарегистрируйтесь в github.com и создайте пустой репозиторий.
- Запушьте локальный репозиторий в созданный удалённый репозиторий.
- Измените первые строки в обоих файлах. Сделайте коммит, включив в него только изменения из CHANGELOG.md.
Случай из жизни: мы сделали кучу изменений в файлах, а потом поняли, что надо бы сохранить последнюю рабочую версию, но без последних лишних измнений. - Откатите (soft) последний коммит и сделайте новый, но уже с изменениями из обоих файлов. Попробуйте также вариант без отката: «git commit —amend».
- Запушьте ветку в удаленный репозиторий и создайте там Pull Request в master.
- Создайте локально новую папку, куда склонируйте ваш удалённый репозиторий. У вас должно быть на компьютере две папки, смотрящие на один и тот же репозиторий. Этим мы имитируем ситуацию, когда два человека с разных компьютеров работают с одним репом. Назовём эти два локальных репозитория: первый — репозиторий Васи, второй — Пети.
- В новом репо Пети создайте ветку feature/md-updates-petya из master.
- Измените первые строки в обоих файлах (иначе, чем в feature/md-updates-vasya), закоммитьте, запушьте и создайте PullRequest на Github.
- В интерфейсе Github примите первый Pull-Request из ветки Васи, а потом убедитесь, что получили конфликт в Пулл-реквесте от Пети.
Так часто бывает в жизни, когда над одним кодом работает больше одного человека. Чем больше команда, тем чаще конфликты. - Разрулите конфликт в локальном репозитории в ветке Пети и обновите Пулл-реквест.
- Примите в github.com обновлённый Пулл-реквест от Пети.
- В репозитории Васи переключитесь в master и сделайте git pull. Убедитесь, что ветка feature/md-updates-vasya удалена.
- Оказалось, что вмёрдженная ветка от Пети содержала баги, поэтому нужно её откатить. Откатите её в репозитории Пети с помощью revert и c полной перезаписью публичной истории. Можно делать без Пулл-реквеста в этот раз.
- Посмотрите, как изменилась история в репозитории Васи до git pull и после git pull.
- В репозитории Васи добавьте в .gitignore файл CHANGELOG.md, чтобы Git перестал его отслеживать. (Подсказка: «git rm» с флагом «—cached».) Запушьте в удалённый реп.
- Зайдите в Github и проверьте, что CHANGELOG.md больше нет в репозитории.
GUI клиенты
В реальной жизни работать с гитом через консоль приходится редко. Есть клиенты Git с визуальным интерфейсом, например:
- встроенные в IDE
- Sourcetree — мой личный выбор
- Git Kraken
- Git Tortoise
Но ими проще пользоваться, когда ты понимаешь, что они делают под капотом.