Что вы теперь умеете
Шпаргалка 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 false | git 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 даже в одиночных проектах. Успехов!