Skip to content
IRC-CodingIRC-Coding
GitВерсионированиеBranchesMerge ConflictsWorkflowsDevOpsСотрудничествоРазработка ПО

Git версионирование: основы, ветки и конфликты

Git версионирование: основы, ветки, разрешение конфликтов и рабочие процессы для командной разработки.

S

schutzgeist

9 min read
Git версионирование: основы, ветки и конфликты

Git Версионирование: основы, ветки, разрешение конфликтов и рабочие процессы

Git — это ведущая распределённая система управления версиями для разработки программного обеспечения. Она обеспечивает эффективную совместную работу, отслеживание изменений и безопасное управление кодом.

Основы Git

Что такое Git?

Git — это распределённая система управления версиями (Distributed Version Control System, DVCS), разработанная для упрощения совместной работы над программными проектами.

Базовые концепции

# Инициализация Git репозитория
git init

# Клонирование репозитория
git clone https://github.com/user/repository.git

# Просмотр статуса
git status

# Добавление изменений
git add datei.txt
git add .

# Фиксация изменений
git commit -m "Описание изменения"

# Отправка изменений
git push origin main

# Получение изменений
git pull origin main

Архитектура Git

# Рабочие области в Git
# Working Directory → Staging Area → Local Repository → Remote Repository

# Рабочий каталог
echo "Новое содержимое" > datei.txt

# Область индекса
git add datei.txt

# Локальный репозиторий
git commit -m "Зафиксировать изменение"

# Удалённый репозиторий
git push origin main

Конфигурация Git

Начальная настройка

# Настройка имени пользователя и email
git config --global user.name "Max Mustermann"
git config --global user.email "max@example.com"

# Установка редактора по умолчанию
git config --global core.editor "vim"

# Название главной ветки по умолчанию (main вместо master)
git config --global init.defaultBranch main

# Просмотр конфигурации
git config --list

# Специальная конфигурация для отдельного репозитория
git config user.email "work@example.com"

Git алиасы

# Создание полезных алиасов
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.unstage 'reset HEAD --'
git config --global alias.last 'log -1 HEAD'
git config --global alias.visual '!gitk'

# Использование алиасов
git st        # git status
git co main   # git checkout main
git br        # git branch
git ci -m "Сообщение"  # git commit -m "Сообщение"

Ветки в Git

Основы веток

Ветки позволяют вести параллельную разработку отдельных функций без влияния на основной код.

# Создание новой ветки
git branch feature-login

# Переключение на ветку
git checkout feature-login

# Создание и переключение на ветку (в одной команде)
git checkout -b feature-login

# Просмотр всех веток
git branch
git branch -a  # включая удалённые ветки

# Удаление ветки
git branch -d feature-login  # только если объединена
git branch -D feature-login  # принудительное удаление

# Удаление удалённой ветки
git push origin --delete feature-login

Стратегии использования веток

# Рабочий процесс Feature Branch
# 1. Создание новой ветки функции от main
git checkout main
git pull origin main
git checkout -b feature-user-authentication

# 2. Работа над функцией
git add .
git commit -m "Implement user authentication"
git push origin feature-user-authentication

# 3. Создание Pull Request и объединение
# 4. Удаление ветки после объединения
git checkout main
git pull origin main
git branch -d feature-user-authentication

Управление ветками

# Сравнение веток
git diff main feature-branch
git log main..feature-branch

# Объединение ветки (merge)
git checkout main
git merge feature-branch

# Объединение с переписыванием истории (rebase)
git checkout feature-branch
git rebase main

# Cherry-pick (выбор конкретных коммитов)
git checkout main
git cherry-pick <commit-hash>

# Сохранение временных изменений (stash)
git stash
git stash list
git stash pop
git stash apply
git stash drop

Конфликты при слиянии

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

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

Типичные ситуации конфликтов

# Пример: два разработчика изменяют одну и ту же строку

# Разработчик A (ветка feature-a)
echo "console.log('Hello from Feature A');" > app.js
git add app.js
git commit -m "Add feature A logging"

# Разработчик B (ветка main)
echo "console.log('Hello from Main');" > app.js
git add app.js
git commit -m "Add main logging"

# Попытка слияния
git checkout main
git merge feature-a

# CONFLICT: Merge conflict in app.js

Разрешение конфликтов

# 1. Просмотр конфликтов
git status

# 2. Открытие файла для редактирования
# Git отмечает конфликты символами <<<<<<<, =======, >>>>>>>

# app.js с конфликтом:
# <<<<<<< HEAD
# console.log('Hello from Main');
# =======
# console.log('Hello from Feature A');
# >>>>>>> feature-a

# 3. Ручное разрешение
# console.log('Hello from Main and Feature A');

# 4. Сохранение файла и отметка как разрешённого
git add app.js
git commit -m "Resolve merge conflict in app.js"

# Альтернатива: отмена слияния
git merge --abort

Продвинутое разрешение конфликтов

# Использование инструментов для слияния
git mergetool

# Установка стратегии разрешения конфликтов
git merge -X theirs feature-branch  # предпочитать их версию
git merge -X ours feature-branch     # предпочитать нашу версию

# Octopus Merge (объединение нескольких веток одновременно)
git merge branch1 branch2 branch3

# Subtree Merge (подключение внешнего проекта)
git subtree add --prefix=external-repo https://github.com/user/repo.git main

Рабочие процессы Git

1. Централизованный рабочий процесс

# Простейший рабочий процесс
# Все работают непосредственно с main

# 1. Локальные изменения
git add .
git commit -m "Add new feature"

# 2. Отправка изменений
git push origin main

# 3. Разрешение конфликтов, если они есть
git pull origin main
# Разрешить конфликты
git push origin main

2. Рабочий процесс Feature Branch

# Каждая функция получает собственную ветку

# 1. Создание ветки функции
git checkout main
git pull origin main
git checkout -b feature-user-profile

# 2. Работа над функцией
git add .
git commit -m "Add user profile page"
git push origin feature-user-profile

# 3. Создание Pull Request
# Через интерфейс GitHub/GitLab или CLI

# 4. Проверка и слияние
# Рецензия кода членами команды
# Слияние в main после одобрения

# 5. Очистка ветки
git checkout main
git pull origin main
git branch -d feature-user-profile

3. Gitflow рабочий процесс

# Gitflow с ветками main, develop, feature, release, hotfix

# 1. Инициализация ветки develop
git checkout main
git checkout -b develop
git push origin develop

# 2. Ветка функции от develop
git checkout develop
git checkout -b feature-shopping-cart

# 3. Слияние функции в develop
git checkout develop
git merge feature-shopping-cart
git push origin develop

# 4. Создание ветки релиза
git checkout develop
git checkout -b release/v1.0.0

# 5. Слияние релиза в main и develop
git checkout main
git merge release/v1.0.0
git tag -a v1.0.0 -m "Release version 1.0.0"
git push origin main --tags

git checkout develop
git merge release/v1.0.0
git push origin develop

# 6. Hotfix от main
git checkout main
git checkout -b hotfix/critical-bug
# Исправление ошибки
git checkout main
git merge hotfix/critical-bug
git checkout develop
git merge hotfix/critical-bug

4. Forking Workflow

# Для open source проектов или внешних вкладов

# 1. Сделать fork репозитория (через GitHub/GitLab UI)
# 2. Клонировать свой репозиторий
git clone https://github.com/yourusername/project.git
cd project

# 3. Добавить upstream remote
git remote add upstream https://github.com/original/project.git

# 4. Создать feature-branch
git checkout -b feature-new-functionality

# 5. Закоммитить изменения
git add .
git commit -m "Add new functionality"

# 6. Отправить в свой репозиторий
git push origin feature-new-functionality

# 7. Создать Pull Request в исходный репозиторий

# 8. Регулярно обновлять upstream
git fetch upstream
git checkout main
git merge upstream/main

Продвинутые техники Git

Rebase и Interactive Rebase

# Простой rebase
git checkout feature-branch
git rebase main

# Interactive rebase (переупорядочение/редактирование коммитов)
git rebase -i HEAD~3

# Опции interactive rebase:
# pick: Взять коммит без изменений
# reword: Изменить сообщение коммита
# edit: Отредактировать коммит
# squash: Объединить с предыдущим коммитом
# fixup: Объединить с предыдущим коммитом (без сообщения)
# drop: Удалить коммит

# Пример interactive rebase
# pick 1234567 Add feature A
# squash 2345678 Add feature B
# reword 3456789 Fix typo

# Форсировать rebase (осторожно!)
git push --force-with-lease origin feature-branch

Git Hooks

# Hooks находятся в .git/hooks/
# Pre-commit hook (перед каждым коммитом)
#!/bin/sh
# .git/hooks/pre-commit
echo "Running pre-commit checks..."
npm run lint
npm run test

# Pre-push hook (перед каждым push)
#!/bin/sh
# .git/hooks/pre-push
echo "Running pre-push tests..."
npm run test:coverage

# Активировать hooks
chmod +x .git/hooks/pre-commit
chmod +x .git/hooks/pre-push

# Настроить hooks глобально
git config --global init.templatedir '~/.git-templates'

Git Submodules

# Добавить submodule
git submodule add https://github.com/user/library.git libs/library

# Инициализировать submodule
git submodule init
git submodule update

# Клонировать проект с --recurse-submodules
git clone --recurse-submodules https://github.com/user/project.git

# Обновить submodule
git submodule update --remote

# Удалить submodule
git rm --cached libs/library
rm -rf libs/library
git commit -m "Remove submodule"

Лучшие практики

Сообщения коммитов

# Хорошие сообщения коммитов
feat: Add user authentication system
fix: Resolve memory leak in data processing
docs: Update API documentation
style: Format code according to style guide
refactor: Simplify database connection logic
test: Add unit tests for user service
chore: Update dependencies

# Структура: <type>(<scope>): <description>
# Типы: feat, fix, docs, style, refactor, test, chore

# Детальное сообщение коммита
feat(auth): Add OAuth2 integration

- Add Google OAuth provider
- Implement token refresh mechanism
- Add user profile synchronization

Closes #123

Соглашения об именовании веток

# Хорошие имена веток
feature/user-authentication
bugfix/memory-leak-fix
hotfix/critical-security-patch
release/v1.2.0
docs/update-api-documentation
refactor/database-connection-pool
test/add-unit-tests

# Плохие имена веток
fix-stuff
new-feature
branch-1
temp

Структура репозитория

# .gitignore
# Скомпилированные файлы
*.class
*.jar
*.war
*.ear

# Файлы IDE
.idea/
.vscode/
*.swp
*.swo

# Зависимости
node_modules/
target/
build/

# Логи
*.log
logs/

# Файлы окружения
.env
.env.local

# .gitattributes
# Текстовые файлы
*.txt text
*.md text
*.js text
*.java text

# Бинарные файлы
*.jpg binary
*.png binary
*.pdf binary

# Переводы строк
* text=auto eol=lf

Отладка и решение проблем

Частые проблемы

# 1. Коммит попал в неправильную ветку
git checkout correct-branch
git cherry-pick <wrong-commit-hash>
git checkout wrong-branch
git reset --hard HEAD~1

# 2. Восстановить потерянные коммиты
git reflog
git checkout -b recovery <commit-hash>

# 3. Отменить нежелательные изменения
git reset --hard HEAD
git reset --hard HEAD~1  # Удалить последний коммит
git clean -fd            # Удалить неслеживаемые файлы

# 4. Проблемы с remote-репозиторием
git remote -v
git remote set-url origin https://github.com/user/new-repo.git

# 5. Восстановиться после force-push
git reflog
git reset --hard HEAD@{1}
git push --force-with-lease origin main

Оптимизация производительности

# Оптимизировать репозиторий
git gc --prune=now

# Найти большие файлы
git rev-list --objects --all | git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | sed -n 's/^blob //p' | sort --numeric-sort --key=2 | tail -10

# Git LFS для больших файлов
git lfs install
git lfs track "*.psd"
git lfs track "*.zip"
git add .gitattributes
git commit -m "Track large files with Git LFS"

Git на практике

Интеграция с CI/CD

# .github/workflows/ci.yml
name: CI Pipeline

on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main ]

jobs:
  test:
    runs-on: ubuntu-latest
    
    steps:
    - uses: actions/checkout@v2
    
    - name: Setup Node.js
      uses: actions/setup-node@v2
      with:
        node-version: '16'
        
    - name: Install dependencies
      run: npm ci
      
    - name: Run tests
      run: npm test
      
    - name: Run linting
      run: npm run lint
      
    - name: Build project
      run: npm run build

Git для командной работы

# Командные рекомендации
# 1. Использовать feature-branches
# 2. Pull Requests для code review
# 3. Автоматические тесты при каждом push
# 4. Protected branches для main и develop
# 5. Регулярный rebase вместо merge

# Пример настройки protected branch
# Через GitHub/GitLab:
# - Require pull request reviews before merging
# - Require status checks to pass before merging
# - Require branches to be up to date before merging
# - Include administrators as reviewers

Концепции для экзамена

Важные команды Git

КомандаОписаниеИспользование
git initИнициализировать репозиторийНачать новый проект
git cloneКлонировать репозиторийСкопировать существующий проект
git addДобавить изменения в stagingПодготовить изменения
git commitЗакоммитить измененияСохранить локальные изменения
git pushОтправить измененияСинхронизировать с remote
git pullПолучить измененияПрименить изменения с remote
git branchУправлять веткамиСоздать линии разработки
git mergeОбъединить веткиИнтегрировать изменения
git rebaseПереместить веткуСоздать линейную историю

Типичные экзаменационные задачи

  1. Объяснить Git-workflows
  2. Разрешить Merge Conflicts
  3. Внедрить branch-стратегии
  4. Использовать продвинутые команды Git
  5. Настроить CI/CD с Git

Итого

Git необходим для современной разработки:

  • Распределённая система: у каждого разработчика полная копия
  • Ветки: параллельная разработка без конфликтов
  • Merge: интеллектуальное объединение изменений
  • Workflows: структурированная командная работа

Рекомендуемая книга

Расширьте свои знания Git с помощью этого полного руководства для разработчиков и DevOps-команд. Книга охватывает не только основы, но и продвинутые техники, а также содержит практический справочник Git-команд для ежедневной работы.

Git: Projektverwaltung für Entwickler und DevOps-Teams. Inkl. Praxistipps und Git-Kommandoreferenz

Эта книга подходит для:

  • Начинающих разработчиков, которые хотят изучить Git с нуля
  • Опытных программистов, стремящихся углубить свои знания
  • DevOps-команд, которые внедряют эффективные рабочие процессы
  • Всех, кому нужен полный справочник по Git
  • CI/CD: Автоматизация сборки и развёртывания

Качественное управление Git требует дисциплины, ясных правил и регулярного обслуживания репозитория.

Назад к блогу
Share:

Похожие статьи