$ sudo teach IT
Модуль 8 · Финал · Урок 8.2

Куда дальше

Подведём итоги курса, соберём все команды Git в одну шпаргалку и наметим, что учить дальше.

Обзор~15 минутНовичокшпаргалкаследующие шаги

Что вы теперь умеете

Шпаргалка Git — это одна таблица со всеми командами курса, к которой удобно возвращаться, пока команды не стали привычкой; она ждёт вас ниже, вместе с планом, что учить дальше. Вы только что провели страницу «Заметки» от issue до релиза v1.1.0 и оформили профиль GitHub, а значит, прошли весь путь курса:

  • Знакомство. Объясняете, чем Git отличается от GitHub, ставите Git и настраиваете имя, почту и редактор.
  • Первые коммиты. Ведёте проект по циклу «правка, status, diff, add, commit, log».
  • Отмена и .gitignore. Откатываете правки, исправляете последний коммит, делаете revert и reset, находите потерянное в reflog, не пускаете мусор в репозиторий.
  • Ветки. Создаёте ветки, сливаете их, решаете конфликты, прячете правки в stash.
  • GitHub. Публикуете проект, входите без пароля, работаете с двух мест через clone, fetch и pull, выкладываете сайт на Pages.
  • Команда. Открываете pull request, проводите ревью, ведёте задачи в issues, делаете fork.
  • Чистая история. Перебазируете ветки, причёсываете коммиты, ищете виновника поломки через log, blame и bisect, выпускаете версии с тегами.
  • Всё вместе. Проводите изменение по полному циклу и оформляете профиль GitHub.

Шпаргалка Git

Единая таблица всех команд курса, по группам. Угловые скобки обозначают то, что вы подставляете сами, квадратные — необязательное. Сохраните страницу в закладки: пока команды не стали привычкой, подсматривать — нормально.

КомандаЧто делает
Настройка
git config --global user.name "Имя"
git config --global user.email "почта"
Кто вы для Git: имя и почта в каждом коммите
git config --global init.defaultBranch mainПервая ветка нового репозитория называется main
git config --global pull.rebase falsegit pull объединяет ветки слиянием
git config --global core.editor "code --wait"Редактор для сообщений коммитов и плана rebase
git --versionКакая версия Git установлена
git config --list --show-originВсе настройки и файл, откуда каждая взята
Начало работы
git initПревращает папку в репозиторий
git clone <адрес> [папка]Скачивает репозиторий целиком вместе с историей
git statusСостояние файлов и подсказки, что делать дальше
Рабочий цикл
git add <файл>, git add .Кладёт изменения в индекс (точка добавляет всё, смотрите status)
git commit -m "Сообщение"Делает снимок из индекса
git commit -am "Сообщение"Добавить в индекс все изменённые отслеживаемые файлы и сразу закоммитить
git mv <старое имя> <новое>Переименовать файл так, чтобы Git это записал
git diff, git diff --stagedЧто изменено и не в индексе; что в индексе и войдёт в коммит
git log --onelineИстория: один коммит на строку
git log --oneline --graph --allИстория всех веток со схемой
git show <хеш>Что было в конкретном коммите
Отмена и восстановление
git restore <файл>Возвращает файл как в последнем коммите (правки пропадут)
git restore --staged <файл>Убирает файл из индекса, правки остаются
git restore --source <хеш> <файл>Берёт файл из старого коммита
git commit --amendПравит последний коммит: сообщение или забытый файл
git revert <хеш>Отменяет коммит новым коммитом, историю не трогает
git reset --soft|--mixed|--hard <хеш>Двигает ветку назад; --hard ещё стирает незакоммиченные правки
git reflogЖурнал перемещений HEAD: помогает найти потерянный коммит
git switch --detach <хеш>Посмотреть старый коммит, не меняя ветку
.gitignore
git rm --cached <файл>Перестаёт отслеживать уже добавленный файл, сам файл остаётся
git check-ignore -v <файл>Какое правило игнорирует файл
Ветки
git branchСписок веток, звёздочка у текущей
git switch <ветка>, git switch -c <ветка>Перейти в ветку; создать ветку и перейти в неё
git merge <ветка>Влить ветку в текущую
git merge --abortОтменить слияние с конфликтом
git branch -d <ветка>, -DУдалить слитую ветку; удалить принудительно
git stash push -m "…", git stash listСпрятать незакоммиченные правки; показать тайник
git stash pop, git stash applyВернуть правки с удалением из тайника; вернуть и оставить
git stash drop, git stash push -uУдалить запись из тайника; спрятать вместе с новыми файлами
GitHub
git remote add origin <адрес>, git remote -vПривязать удалённый репозиторий; показать привязки
git push -u origin <ветка>, git pushОтправить ветку и запомнить связь; дальше просто push
git fetch, git pullСкачать новое, не трогая файлы; скачать и влить
git remote set-url origin <адрес>Заменить адрес (например, HTTPS на SSH)
git fetch --pruneУбрать пометки о ветках, удалённых на GitHub
gh auth loginВойти в GitHub через GitHub CLI (вход для HTTPS)
git remote add upstream <адрес>Подключить оригинал при работе через fork
ssh-keygen -t ed25519 -C "почта", ssh -T git@github.comСоздать SSH-ключ; проверить вход по SSH
Pull request и issues (в браузере)
Compare & pull requestОткрыть PR из свежеотправленной ветки
Closes #N в описании PRЗакрыть issue при слиянии PR в основную ветку
Merge pull request, Squash and mergeСлить PR с merge-коммитом; слить одним коммитом
Чистая история
git rebase <ветка>, --continue, --abortПеренести коммиты на свежий конец ветки; продолжить после конфликта; отменить
git rebase -i HEAD~NПричесать последние N коммитов: pick, reword, squash, fixup, drop
git push --force-with-leaseПерезаписать свою ветку на GitHub после rebase, не затирая чужое
git cherry-pick <хеш>Скопировать один коммит в текущую ветку
git commit --fixup <хеш>, git rebase -i --autosquash mainИсправление к старому коммиту ветки, которое само встанет на место
git pull --rebaseЗабрать новое и поставить свои коммиты поверх, без merge-коммита
git log --author|--since|--grep|-S "текст"Найти коммиты по автору, дате, сообщению, изменённой строке
git blame <файл>Кто и в каком коммите менял каждую строку
git bisect start|good|bad|resetДвоичный поиск коммита, где что-то сломалось
git tag -a v1.0.0 -m "…", git push origin v1.0.0Поставить аннотированный тег; отправить его на GitHub
git tag, git show v1.0.0, git tag -d v1.0.0Список тегов; что в теге; удалить неотправленный тег

Три команды, после которых нет «отменить»

git restore <файл> и git reset --hard стирают незакоммиченные правки без корзины. git push --force перезаписывает чужую историю на GitHub; вместо него используйте --force-with-lease. Перед каждой из них спросите себя: что я потеряю?

Графические клиенты

Графический клиент Git — программа с кнопками вместо команд: она показывает изменения, коммиты и ветки в окне. Терминал остаётся основой, потому что одинаков везде и на нём построены ответы в интернете, но два клиента стоит знать.

VS Code. В нём уже есть вкладка Source Control (открывается по Ctrl+Shift+G). Там видны изменённые файлы, можно сравнить версии, выбрать, что положить в индекс, написать сообщение и сделать коммит, отправить и забрать изменения, переключить ветку и даже решить конфликт. Git при этом должен быть установлен на компьютере: VS Code пользуется вашим Git. Вы его поставили в самом начале.

GitHub Desktop. Бесплатное приложение с открытым кодом для Windows и macOS. Умеет создавать и клонировать репозитории, делать ветки и коммиты, отправлять изменения на GitHub и открывать pull request. Удобно, когда нужно быстро посмотреть изменения или нет желания набирать команды.

Любой клиент делает то же, что вы делали руками: коммит, ветка, push. Раз вы понимаете, что за кнопкой стоит, в любом клиенте разберётесь за минуту. А когда что-то пошло не так — конфликт, потерянный коммит, незнакомая ошибка — выручит терминал.

Следующие шаги

Git можно изучать вглубь годами, но на практике вам пригодятся несколько направлений.

  • GitHub Actions — автоматизация на GitHub: при каждом push запускать тесты, собирать проект и выкладывать сайт. Это отдельная большая тема, отдельный курс школы по ней готовится.
  • Docker — упаковка приложения со всем окружением в контейнер, чтобы оно одинаково запускалось у вас и на сервере.
  • Книга Pro Git — бесплатная и самая подробная: git-scm.com/book/ru/v2. Читайте по главам, когда встретите незнакомую тему.
  • Документация команд — git-scm.com/docs, справка по каждой команде, а на GitHub — docs.github.com.
  • Open source — возьмите задачу с меткой good first issue в чужом проекте и повторите цикл fork, ветка, pull request.

Есть и редкие инструменты, о которых полезно знать, когда они попадутся: хуки (скрипты, которые Git запускает сам перед коммитом или push), git worktree (несколько веток в разных папках одновременно), submodules (репозиторий внутри репозитория) и Git LFS (хранение больших файлов). Для начала они не нужны.

GitLab и Bitbucket — такие же хостинги, как GitHub. Команды те же, отличается только веб-интерфейс.

Курсы школы

Git нужен везде, где есть код, поэтому лучший способ закрепить его — вести в нём учебные проекты других курсов. Заведите репозиторий на каждый курс, делайте коммит после каждого решённого задания, а готовые проекты выкладывайте на GitHub: так вырастет и портфолио, и привычка.

  • Курс по Python — скрипты и программы, которые удобно вести по одному репозиторию на тему.
  • Курс по JavaScript — интерактивные страницы, которые можно выкладывать на Pages, как вашу визитку.
  • Курс по HTML и CSS — вёрстка: развивайте сайт-визитку, а Git сохранит каждый шаг.

Вопросы на собеседовании

На собеседованиях по Git спрашивают одно и то же. Если вы можете ответить на эти шесть вопросов своими словами, базовый уровень у вас есть. Короткие ответы ниже — сначала попробуйте сформулировать свой.

Чем merge отличается от rebase?

merge соединяет две ветки новым коммитом слияния, история остаётся как была, но становится ветвистой. rebase переносит коммиты вашей ветки на свежий конец другой, получается прямая линия, но коммиты создаются заново с новыми хешами. Правило: не перебазируйте ветки, которыми уже поделились с другими.

Чем revert отличается от reset?

revert отменяет коммит, добавляя новый коммит с обратными изменениями; история сохраняется, поэтому он безопасен для уже опубликованного. reset двигает ветку на другой коммит, как будто последующих не было; для опубликованного его применять нельзя, а --hard ещё и стирает незакоммиченные правки.

Что такое HEAD?

Это указатель на то место, где вы сейчас находитесь. Обычно он указывает на текущую ветку, а ветка — на её последний коммит. Если HEAD указывает прямо на коммит, говорят про «detached HEAD»: вы смотрите старую версию, и новые коммиты нужно сохранять в ветке.

Чем fetch отличается от pull?

git fetch только скачивает новые коммиты с удалённого репозитория и не меняет ваши файлы и ветку. git pull — это fetch плюс слияние (или rebase, если так настроено) с вашей веткой.

Что делать при конфликте слияния?

Открыть файлы из git status, найти маркеры <<<<<<<, =======, >>>>>>>, оставить нужный вариант (или объединить) и удалить маркеры, затем git add и git commit. Если передумали — git merge --abort. При rebase вместо commit — git rebase --continue.

Файл уже в Git, но его надо игнорировать. Что делать?

Добавить правило в .gitignore недостаточно: оно не действует на уже отслеживаемые файлы. Выполните git rm --cached <файл>, чтобы Git перестал его отслеживать, и закоммитьте. Сам файл на диске останется.

Напоследок

Вы начали курс с вопроса «что такое Git», а закончили выпущенным релизом и оформленным профилем. Дальше всё упирается в практику: заводите репозитории, коммитьте понемногу и часто, делайте pull request даже в одиночных проектах. Успехов!