📖 Командная работа в Git

К оглавлению урока

⚡ Суть занятия

  • Командный workflow: issue → назначить → ветка → PR → обсуждение → merge → rebase
  • Скрипт 1: копирование файлов по расширению (read -p + find + cp)
  • Скрипт 2: авто-коммит ([ ! -d .git ] + git add . + git diff-index + git commit)

Концепция командной работы в Git

Командная работа в Git — воспроизводится процесс совместной разработки. Назначая индивидуальные задания по отдельным issue или работая в малых группах, можно получить навыки и практический опыт совместной работы в команде над одним проектом.

Командный workflow

  1. Issue — формулирование задачи в системе отслеживания (GitHub/GitLab). Каждый участник или группа получает свою задачу.
  2. Ветка — для каждой задачи создаётся отдельная ветка: git checkout -b feature/issue-N
  3. Реализация — работа над задачей в своей ветке, коммиты
  4. Pull Request (PR) — предложение изменений для обсуждения: git push origin feature/issue-N → открыть PR
  5. Code Review — обсуждение PR командой, правки
  6. Merge — после одобрения слияние в основную ветку
  7. Rebase — обеспечение актуальности других веток после слияния: git rebase main

Репозиторий для практики: https://github.com/it-career-hub/git_team_work.git

Скрипт 1: копирование файлов по расширению

Скрипт запрашивает у пользователя исходную директорию, целевую директорию и расширение файлов для копирования. Затем находит и копирует подходящие файлы.

Структура скрипта (план из issue)

  1. Запросить исходную и целевую директории у пользователя
  2. Запросить расширение файлов для копирования
  3. Проверить существование исходной директории
  4. Проверить существование целевой директории
  5. Найти файлы с указанным расширением в исходной директории
  6. Скопировать файлы в целевую директорию

Ключевые конструкции

read -p — ввод с подсказкой

read -p "Введите исходную директорию: " source_directory
read -p "Введите целевую директорию: " target_directory
read -p "Введите расширение файлов для копирования (без точки): " file_extension

read -p "Подсказка: " ПЕРЕМЕННАЯ — bash built-in. Выводит подсказку без перевода строки, затем ждёт ввода.

[ ! -d ] — проверка существования директории

if [ ! -d "$source_directory" ]; then
  echo "Директория '$source_directory' не существует или недоступна."
  exit 1
fi

-d — проверяет, является ли путь директорией. ! инвертирует условие.

find -maxdepth 1 — поиск файлов по расширению

matching_files=$(find "$source_directory" -maxdepth 1 -type f -name "*.$file_extension")
  • -maxdepth 1 — искать только в указанной директории (не рекурсивно)
  • -type f — только обычные файлы (не директории)
  • -name "*.$file_extension" — шаблон имени файла

cp — копирование найденных файлов

for file in $matching_files; do
  cp "$file" "$target_directory"
  echo "Скопирован файл: $file"
done

Скрипт 2: автоматический коммит

Скрипт проверяет, находится ли текущая директория в Git-репозитории. Если да — добавляет все изменения и делает коммит с временной меткой.

Структура скрипта (план из issue)

  1. Проверить текущую директорию на наличие репозитория Git
  2. Добавить изменения в индекс
  3. Проверить наличие изменений для коммита
  4. Создать коммит с датой и временем
  5. Вывести результат выполнения

Ключевые конструкции

[ ! -d ".git" ] — проверка наличия репозитория

if [ ! -d ".git" ]; then
  echo "Текущая директория не является репозиторием Git."
  exit 1
fi

Простая проверка: если директория .git отсутствует — это не Git-репозиторий.

git add . — добавить все изменения

git add .
Предупреждение: git add . добавляет ВСЕ изменённые и новые файлы в текущей директории и поддиректориях. В скрипте автоматического коммита это может включить нежелательные файлы (временные файлы, конфигурации с паролями, логи). Перед автоматизацией убедитесь, что настроен .gitignore.

git diff-index --quiet HEAD — проверка наличия изменений

if git diff-index --quiet HEAD --; then
  echo "Нет изменений для фиксации."
  exit 0
fi

git diff-index --quiet HEAD -- — нестандартная команда для проверки: сравнивает рабочий индекс с HEAD. Если изменений нет — выходит с кодом 0 (успех), что в условии if означает «истина» → нет изменений. Если есть изменения — выходит с кодом 1 → блок if пропускается и выполняется коммит.

git commit с датой и временем

git commit -m "Автоматический коммит $(date +'%Y-%m-%d %H:%M:%S')"

Подстановка $(date +'%Y-%m-%d %H:%M:%S') добавляет временну́ю метку в сообщение коммита.