Модуль 08 — Командная работа

Запросы на слияние, игнорируемые файлы, отложенная работа и безопасная отмена

Прогресс курса Модуль 8 из 9

Что вы освоите в этом модуле

01

Цикл задачи

В большинстве команд работа идёт по одной схеме (её называют GitHub Flow или просто «ветка под задачу»): в main напрямую не коммитят, каждая задача — своя ветка, в main она попадает только после проверки.

# 1. свежий main
$ git switch main
$ git pull

# 2. ветка под задачу
$ git switch -c feature/contacts-form

# 3. работа: коммиты маленькими шагами
$ git add contacts.html
$ git commit -m "Добавить форму обратной связи"

# 4. ветка на сервер
$ git push -u origin feature/contacts-form

# 5. на GitFlic — запрос на слияние в main, проверка, слияние

# 6. забрать результат, удалить ветку
$ git switch main
$ git pull
$ git branch -d feature/contacts-form
02

Запрос на слияние

Запрос на слияние (merge request, на других платформах — pull request) — предложение влить ветку в другую, чаще всего в main. Это не команда Git, а функция git-хостинга: страница, на которой видны все изменения ветки, идёт обсуждение и принимается решение.

Как создать на GitFlic

  • Отправьте ветку на сервер (git push -u origin …).
  • В проекте откройте раздел запросов на слияние и создайте новый: исходная ветка — ваша, целевая — main.
  • Название — как хорошее сообщение коммита. В описании: что сделано, как проверить, что осталось.
  • Назначьте проверяющего, если он есть.

Пример описания:

Добавить форму обратной связи

Что сделано:
- форма с полями «имя», «почта», «сообщение» в contacts.html
- проверка заполнения полей в браузере

Как проверить:
открыть contacts.html, отправить пустую форму — появится подсказка

Не сделано:
отправка на почту — отдельной задачей

Проверяющий читает изменения, оставляет комментарии к строкам. Исправления делаются в той же ветке обычными коммитами и git push — запрос обновляется сам. Когда замечаний нет, запрос сливают кнопкой в интерфейсе; ветку после этого можно удалить на сервере.

Хороший запрос на слияние — небольшой: его можно проверить за 15–20 минут. Запрос на 2000 строк проверяют поверхностно, и ошибки проходят в main.
03

.gitignore

В рабочем каталоге всегда есть файлы, которым не место в репозитории: служебные файлы редактора и ОС, зависимости, результаты сборки, логи и — главное — файлы с паролями. Файл .gitignore в корне проекта перечисляет шаблоны, которые Git не показывает в git status и не добавляет через git add ..

# служебные файлы ОС и редакторов
.DS_Store
Thumbs.db
.vscode/
.idea/

# зависимости и сборка
node_modules/
dist/
__pycache__/
*.pyc

# логи и временные файлы
*.log
*.tmp

# секреты: пароли, ключи, токены
.env
*.key

# исключение из правила: пример настроек — в репозиторий
!.env.example

Шаблоны

  • *.log — все файлы с расширением .log в любой папке.
  • dist/ — папка целиком.
  • /todo.txt — только в корне проекта.
  • !шаблон — отменить исключение для этого шаблона.
  • # — комментарий.
.gitignore действует только на неотслеживаемые файлы. Если .env уже в репозитории, добавить его в .gitignore мало — нужно ещё git rm --cached .env. Попавший в историю пароль уже скомпрометирован: смените его.

Проверить, какое правило скрывает файл: git check-ignore -v app.log.

04

git stash — отложить работу

Вы на середине задачи, а нужно срочно переключиться на другую ветку. Коммитить недоделанное не хочется. git stash убирает несохранённые изменения в отдельное хранилище и очищает рабочий каталог:

$ git stash push -m "форма: половина полей"
Saved working directory and index state On feature/contacts-form: форма: половина полей

$ git switch main           # срочная работа ...
$ git switch feature/contacts-form

$ git stash list
stash@{0}: On feature/contacts-form: форма: половина полей

$ git stash pop              # вернуть изменения и удалить из хранилища

Новые неотслеживаемые файлы по умолчанию в stash не попадают — добавьте флаг -u. Stash — временное место на час, не на неделю: через неделю никто не вспомнит, что там лежит.

05

Отмена коммитов: revert и reset

Главный вопрос перед отменой: отправлен ли коммит на сервер.

git revert — для общей истории. Создаёт новый коммит, обратный указанному. История не переписывается, у коллег ничего не ломается:

$ git revert b82e4d1
[main 6f0e1a3] Revert "Перенести контакты в подвал страницы"
 1 file changed, 3 insertions(+), 3 deletions(-)
$ git push

git reset — для своих, ещё не отправленных коммитов. Передвигает текущую ветку назад, как будто последних коммитов не было:

КомандаКоммитыИзменения из них
git reset --soft HEAD~1Убраны из историиОстаются в индексе
git reset HEAD~1Убраны из историиОстаются в рабочем каталоге
git reset --hard HEAD~1Убраны из историиУдалены, вместе с несохранёнными правками
reset отправленного коммита приведёт к отклонённому push, а принудительная отправка — к потере работы коллег. Правило: отправлено — revert; только у вас — можно reset.
Ошиблись с reset --hard? Коммиты не удаляются сразу. git reflog показывает, где был HEAD последние недели; git reset --hard HEAD@{1} возвращает состояние до ошибки. Несохранённые правки, которых не было ни в одном коммите, reflog не вернёт.
06

Теги версий

Тег — постоянная метка на коммите, обычно номер версии. В отличие от ветки, тег не сдвигается.

$ git tag -a v1.0 -m "Первая публичная версия портфолио"
$ git tag
v1.0
$ git show v1.0 --stat
$ git push origin v1.0          # теги отправляются отдельно

Номера версий обычно пишут по схеме MAJOR.MINOR.PATCH: v1.0.0v1.0.1 (исправление) → v1.1.0 (новая возможность) → v2.0.0 (несовместимые изменения).

07

Rebase — обзор

git rebase main переносит коммиты текущей ветки так, будто она была создана от последнего коммита main. История получается прямой, без коммитов слияния. Команда переписывает коммиты — у них меняются хеши.

До:        A ◀── B ◀── C            main
                  ▲
                  └── D ◀── E        feature

git rebase main (на ветке feature)

После:     A ◀── B ◀── C            main
                        ▲
                        └── D' ◀── E'    feature

Когда встретится

  • В командах, где принята прямая история вместо коммитов слияния.
  • git pull --rebase — забрать изменения, переставив свои коммиты поверх.
  • git rebase -i — навести порядок в своих коммитах перед запросом на слияние: объединить, переименовать, переставить.
Золотое правило: не делайте rebase коммитов, которые уже забрали другие. На этом курсе используйте merge; rebase — тема для следующего шага.
08

Правила работы в команде

Коротко

  • main всегда в рабочем состоянии; в него — только через запрос на слияние.
  • Одна задача — одна ветка — один запрос на слияние.
  • Перед началом работы — git pull, перед отправкой — git status и git diff --staged.
  • Никаких паролей, ключей и токенов в репозитории — даже в закрытом.
  • Никакого --force в общих ветках.
  • Графические клиенты (встроенный в VS Code, GitFlic в браузере) удобны для просмотра истории и конфликтов, но под ними те же команды — знать их надо.

Ключевые выводы модуля

Запомните главное

  • Задача: ветка → коммиты → push → запрос на слияние → проверка → слияние → удалить ветку
  • .gitignore — до первого коммита; секреты в репозиторий не попадают никогда
  • git stash — отложить работу на время, git stash pop — вернуть
  • Отправлено — git revert; только у вас — git reset
  • Тег отмечает версию и отправляется отдельно: git push origin v1.0
Практические задания — на учебном портале. Задания, критерии оценивания, сдача работ и оценки преподавателя — в курсе на portal.nevabit.ru. Учётную запись выдаёт преподаватель.
Модуль 07: GitFlic Все модули Итоговый проект