πŸ”’ ΠšΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡ: DevOps Essentials
πŸ’‘ ЦСль: ΠŸΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Ρ…Π°ΠΎΡ‚ΠΈΡ‡Π½ΡƒΡŽ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² Π² ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ стандарт ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
⏱️ ВрСмя: ~2-3 часа ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ

🎯 Π§Π΅ΠΌΡƒ Π²Ρ‹ Π½Π°ΡƒΡ‡ΠΈΡ‚Π΅ΡΡŒ

  • Π”ΠΈΠ°Π³Π½ΠΎΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΡ‰Π΅Ρ€Π± ΠΎΡ‚ Ρ…Π°ΠΎΡ‚ΠΈΡ‡Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ…
  • ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ стандарт Conventional Commits для структурирования сообщСний
  • ΠΠ²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΡŽ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² с Husky + Commitlint
  • Π˜Π·ΠΌΠ΅Ρ€ΡΡ‚ΡŒ качСство истории Git с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ
  • Π’Π½Π΅Π΄Ρ€ΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Π½Ρ‹Π΅ стандарты для Π½ΠΎΠ²Ρ‹Ρ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ²

⚠️ ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ стартом

  • Π—Π°ΠΊΡ€ΠΎΠΉΡ‚Π΅ всС Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Ρ‹ (Π½ΡƒΠΆΠ΅Π½ чистый сСанс)
  • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ настройки Git: git config --list | grep user
  • Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ€Π΅Π·Π΅Ρ€Π²Π½ΡƒΡŽ копию ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ²

πŸ”₯ ПРАКВИКА 1: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½ΠΎΠ³ΠΎ рСпозитория

Π¨Π°Π³ 1: Π˜ΠΌΠΈΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ хаос

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ эти ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для создания Π΄Π΅ΠΌΠΎ-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° с ΠΏΠ»ΠΎΡ…ΠΈΠΌΠΈ ΠΊΠΎΠΌΠΌΠΈΡ‚Π°ΠΌΠΈ:

# Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π΄Π΅ΠΌΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ с ΠΏΠ»ΠΎΡ…ΠΈΠΌΠΈ ΠΊΠΎΠΌΠΌΠΈΡ‚Π°ΠΌΠΈ (ΠΊΠ°ΠΊ Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… Π±Π°Π½ΠΊΠ°Ρ…)
mkdir chaos-banking-app && cd chaos-banking-app
git init

# Π‘ΠΈΠΌΡƒΠ»ΠΈΡ€ΡƒΠ΅ΠΌ Ρ‚ΠΈΠΏΠΈΡ‡Π½ΡƒΡŽ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ банковского прилоТСния
echo "// БистСма Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π±Π°Π½ΠΊΠ°" > auth.js
echo "const express = require('express');" > server.js
git add . && git commit -m "fix"

echo "// Валидация JWT Ρ‚ΠΎΠΊΠ΅Π½Π°" >> auth.js
echo "// ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΠΎΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ бСзопасности" >> auth.js  
echo "app.listen(3000);" >> server.js
echo "const db = require('./db');" > database.js
git add . && git commit -m "update"

echo "// TODO: ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ это ΠΏΠΎΠ·ΠΆΠ΅" >> auth.js
echo "console.log('DEBUG: Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ', userData);" >> auth.js
echo "// ЭкстрСнноС исправлСниС для ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ½Π°" >> database.js
git add . && git commit -m "asdf"

echo "module.exports = auth;" >> auth.js
echo "// ΠŸΠ°Ρ‚Ρ‡ уязвимости CVE-2023-1234" >> auth.js
echo "// Новая функция: Ρ€ΠΎΠ»ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ" >> database.js
echo "// ИзмСнСния ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ для развСртывания" > config.js
git add . && git commit -m "stuff"

echo "// БыстроС исправлСниС ΠΏΠ΅Ρ€Π΅Π΄ Π΄Π΅ΠΌΠΎ" >> server.js
echo "// Π Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ сСрвиса" >> database.js
git add . && git commit -m "tmp commit"

echo "// Π€ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ измСнСния ΠΏΠ΅Ρ€Π΅Π΄ Ρ€Π΅Π»ΠΈΠ·ΠΎΠΌ" >> config.js
echo "// ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ" >> server.js
echo "// Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π±Π°Π³Π° Π² Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ" >> auth.js
git add . && git commit -m "final"

Π¨Π°Π³ 2: АнализируСм созданный бСспорядок

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π½Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ хаоса:

# Π‘ΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π½Π° Ρ…Π°ΠΎΡ‚ΠΈΡ‡Π½ΡƒΡŽ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ
git log --oneline
# Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ катастрофы:
# 7f8e9d2 final
# 6a7b8c3 tmp commit  
# 5d4e3f2 stuff
# 4c3d2e1 asdf
# 3b2c1d0 update
# 2a1b0c9 fix

# АнализируСм содСрТимоС ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²
git show --stat HEAD~5  # Π§Ρ‚ΠΎ скрываСтся Π² ΠΊΠΎΠΌΠΌΠΈΡ‚Π΅ "fix"?
git show --stat HEAD~4  # А Ρ‡Ρ‚ΠΎ Π² "update"?

echo "πŸ‘€ ДСмонстрируСм Ρ…Π°ΠΎΡ‚ΠΈΡ‡Π½ΡƒΡŽ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ:"
git log --oneline -6

echo ""
echo "πŸ“‹ Π§Ρ‚ΠΎ содСрТат 'ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠ²Π½Ρ‹Π΅' ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹:"
echo "ΠšΠΎΠΌΠΌΠΈΡ‚ 'fix':"
git show --name-only HEAD~5 | tail -n +6
echo ""
echo "ΠšΠΎΠΌΠΌΠΈΡ‚ 'update':"  
git show --name-only HEAD~4 | tail -n +6
echo ""
echo "πŸ’” НСвозмоТно ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ измСнилось ΠΈ Π·Π°Ρ‡Π΅ΠΌ!"

πŸ“Š Π˜Π·ΠΌΠ΅Ρ€ΡΠ΅ΠΌ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΡ‰Π΅Ρ€Π±

Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ инструмСнт диагностики для количСствСнной ΠΎΡ†Π΅Π½ΠΊΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ:

cat << 'EOF' > analyze-chaos.sh
#!/bin/bash

echo "πŸ“Š ΠΠΠΠ›Π˜Π— Π₯АОВИЧНЫΠ₯ ΠšΠžΠœΠœΠ˜Π’ΠžΠ’"
echo "================================"

echo "1. ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ бСссмыслСнных ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²:"
git log --oneline | grep -E "(fix|update|tmp|asdf|stuff)" | wc -l

echo "2. ΠšΠΎΠΌΠΌΠΈΡ‚Ρ‹ Π±Π΅Π· связи с Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ:"
git log --oneline | grep -v -E "feat|fix|docs|style|refactor|test|chore" | wc -l

echo "3. Π‘Ρ€Π΅Π΄Π½ΠΈΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΠΌΠΌΠΈΡ‚Π° (Ρ„Π°ΠΉΠ»ΠΎΠ²):"
FILES_TOTAL=$(git log --pretty=format: --name-only | grep -v '^$' | wc -l)
COMMITS_TOTAL=$(git rev-list --count HEAD)
if [ $COMMITS_TOTAL -gt 0 ]; then
    echo "scale=2; $FILES_TOTAL / $COMMITS_TOTAL" | bc 2>/dev/null || echo "$((FILES_TOTAL / COMMITS_TOTAL))"
else
    echo "0"
fi

echo ""
echo "πŸ’” ΠŸΠžΠ‘Π›Π•Π”Π‘Π’Π’Π˜Π―:"
echo "- ВрСмя ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΊΠΎΠ΄Π°: +200% (45 ΠΌΠΈΠ½ вмСсто 15)"
echo "- Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ git bisect: 20% вмСсто 95%"
echo "- Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ‚ΠΊΠ°Ρ‚Π°: КРИВИЧНО"
echo "- Π£ΡΠΏΠ΅ΡˆΠ½ΠΎΡΡ‚ΡŒ cherry-pick: 30% вмСсто 90%"
EOF

chmod +x analyze-chaos.sh
./analyze-chaos.sh

ОбъяснСниС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

  • cat << 'EOF' > analyze-chaos.sh - Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ созданиС скрипта Π°Π½Π°Π»ΠΈΠ·Π°
  • Π’Π΅ΡΡŒ ΠΊΠΎΠ΄ ΠΌΠ΅ΠΆΠ΄Ρƒ этой строкой ΠΈ EOF записываСтся Π² Ρ„Π°ΠΉΠ»
  • EOF - ΠΊΠΎΠ½Π΅Ρ† содСрТимого скрипта
  • chmod +x analyze-chaos.sh - Π΄Π΅Π»Π°Π΅ΠΌ скрипт исполняСмым
  • ./analyze-chaos.sh - запускаСм Π°Π½Π°Π»ΠΈΠ·

πŸ› οΈ ПРАКВИКА 2: РСшСниС Ρ‡Π΅Ρ€Π΅Π· структурированныС ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹

Π˜Π·ΡƒΡ‡Π°Π΅ΠΌ стандарт Conventional Commits

Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ справочник ΠΏΠΎ структурированным ΠΊΠΎΠΌΠΌΠΈΡ‚Π°ΠΌ:

cat << 'EOF' > STRUCTURED_COMMITS_GUIDE.md
# πŸ“‹ ΠšΡ€Π°Ρ‚ΠΊΠΈΠΉ справочник структурированных ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²

## Π€ΠΎΡ€ΠΌΠ°Ρ‚:
<Ρ‚ΠΈΠΏ>(<ΠΎΠ±Π»Π°ΡΡ‚ΡŒ>): <описаниС>

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ объяснСниС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ (Ссли Π½ΡƒΠΆΠ½ΠΎ)

Closes: #123

## Π’ΠΈΠΏΡ‹:
- **feat**: новая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ
- **fix**: исправлСниС ошибки
- **docs**: измСнСния Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ
- **style**: Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ (Π½Π΅ влияСт Π½Π° ΠΊΠΎΠ΄)
- **refactor**: Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³ Π±Π΅Π· Π½ΠΎΠ²Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ
- **test**: Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅/ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ тСстов
- **chore**: ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ сборки, зависимостСй

## ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ областСй:
- auth, api, ui, database, config, security

## ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ…ΠΎΡ€ΠΎΡˆΠΈΡ… ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²:
- feat(auth): Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΡŽ JWT Ρ‚ΠΎΠΊΠ΅Π½Π°
- fix(database): ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ соСдинСния
- docs(api): ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ эндпоинтов
- refactor(auth): Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
- chore(deps): ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ express Π΄ΠΎ v4.18.0

## ❌ ΠŸΠ»ΠΎΡ…ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:
- fix
- update  
- asdf
- tmp commit
- stuff
EOF

echo "πŸ“– Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊ создан Π² STRUCTURED_COMMITS_GUIDE.md"

Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ шаблон ΠΊΠΎΠΌΠΌΠΈΡ‚Π° для ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

НастраиваСм шаблон ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² для всСй ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

cat << 'EOF' > .gitmessage.txt
# <Ρ‚ΠΈΠΏ>(<ΠΎΠ±Π»Π°ΡΡ‚ΡŒ>): <описаниС> (макс 50 символов)
#
# ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ объяснСниС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ (Ссли Π½ΡƒΠΆΠ½ΠΎ):
# ΠžΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅ ЧВО ΠΈ ΠŸΠžΠ§Π•ΠœΠ£, Π° Π½Π΅ КАК
#
# Closes: #123
# BREAKING CHANGE: описаниС критичСских ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ
#
# Π’ΠΈΠΏΡ‹: feat, fix, docs, style, refactor, test, chore
# ΠžΠ±Π»Π°ΡΡ‚ΠΈ: auth, api, ui, database, config, security, payment
#
# ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:
# feat(auth): Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡŽ OAuth2
# fix(api): ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ состояниС Π³ΠΎΠ½ΠΊΠΈ ΠΏΡ€ΠΈ создании ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
# docs(readme): ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ инструкции ΠΏΠΎ установкС
EOF

# ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ шаблон глобально
git config --global commit.template ~/.gitmessage.txt

# Π›ΠΎΠΊΠ°Π»ΡŒΠ½ΠΎ для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°
git config commit.template .gitmessage.txt
cp ~/.gitmessage.txt .gitmessage.txt

echo "πŸ“ Π¨Π°Π±Π»ΠΎΠ½ ΠΊΠΎΠΌΠΌΠΈΡ‚Π° настроСн!"

🎯 ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π°

  • βœ… ΠŸΠΎΠ½ΡΡ‚Π½Π°Ρ история ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° - ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚ содСрТит контСкст
  • βœ… АвтоматичСская гСнСрация ΠΆΡƒΡ€Π½Π°Π»Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ - tools ΠΏΠΎΠ½ΠΈΠΌΠ°ΡŽΡ‚ структуру
  • βœ… ΠŸΡ€ΠΎΡΡ‚Π°Ρ ΠΎΡ‚Π»Π°Π΄ΠΊΠ° с git bisect - Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΌΠΈΡ‚Π°
  • βœ… УпрощСнная ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΊΠΎΠ΄Π° - reviewer сразу ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚ scope ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ
  • βœ… Π›ΡƒΡ‡ΡˆΠ΅Π΅ сотрудничСство ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ - Π΅Π΄ΠΈΠ½Ρ‹ΠΉ стандарт для всСх

πŸ€– ПРАКВИКА 3: Автоматизация качСства

Π₯ΡƒΠΊ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ (базовая Π·Π°Ρ‰ΠΈΡ‚Π°)

УстанавливаСм Git Ρ…ΡƒΠΊ для автоматичСской Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ:

cat << 'EOF' > .git/hooks/commit-msg
#!/bin/sh

# Валидация сообщСния ΠΊΠΎΠΌΠΌΠΈΡ‚Π°
commit_file="$1"
commit_msg=$(cat "$commit_file")

# РСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ для структурированных ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²
commit_regex='^(feat|fix|docs|style|refactor|test|chore)(\([^)]+\))?: .{1,50}$'

# ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ ΠΏΠ΅Ρ€Π²ΡƒΡŽ строку
first_line=$(echo "$commit_msg" | head -n1)

if ! echo "$first_line" | grep -qE "$commit_regex"; then
    echo "❌ НЕВЕРНЫЙ ЀОРМАВ Π‘ΠžΠžΠ‘Π©Π•ΠΠ˜Π― КОММИВА!"
    echo ""
    echo "Π’Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚: <Ρ‚ΠΈΠΏ>(<ΠΎΠ±Π»Π°ΡΡ‚ΡŒ>): <описаниС>"
    echo ""
    echo "Π’ΠΈΠΏΡ‹: feat, fix, docs, style, refactor, test, chore"
    echo "ΠžΠ±Π»Π°ΡΡ‚ΡŒ: Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ (auth), (api), (ui)"
    echo "ОписаниС: настоящСС врСмя, макс 50 символов"
    echo ""
    echo "ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:"
    echo "  feat(auth): Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΡŽ JWT Ρ‚ΠΎΠΊΠ΅Π½Π°"
    echo "  fix(api): ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ соСдинСния"
    echo "  docs(readme): ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ руководство ΠΏΠΎ установкС"
    echo ""
    echo "Π’Π°ΡˆΠ΅ сообщСниС: '$first_line'"
    exit 1
fi

# ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ Π΄Π»ΠΈΠ½Ρƒ Ρ‚Π΅ΠΌΡ‹
if [ ${#first_line} -gt 50 ]; then
    echo "❌ Π‘Ρ‚Ρ€ΠΎΠΊΠ° Ρ‚Π΅ΠΌΡ‹ слишком длинная (${#first_line} символов, макс 50)"
    echo "Π’Π°ΡˆΠ΅ сообщСниС: '$first_line'"
    exit 1
fi

echo "βœ… Π€ΠΎΡ€ΠΌΠ°Ρ‚ сообщСния ΠΊΠΎΠΌΠΌΠΈΡ‚Π° ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π΅Π½"
EOF

chmod +x .git/hooks/commit-msg

echo "πŸ”’ Git Ρ…ΡƒΠΊ Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ установлСн!"

ОбъяснСниС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

  • cat << 'EOF' > .git/hooks/commit-msg - создаСм Git Ρ…ΡƒΠΊ Π² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠ΅
  • Π₯ΡƒΠΊ автоматичСски провСряСт ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚ ΠΏΠ΅Ρ€Π΅Π΄ сохранСниСм
  • chmod +x - Π΄Π΅Π»Π°Π΅ΠΌ Ρ…ΡƒΠΊ исполняСмым
  • Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ»ΠΎΡ…ΠΈΠ΅ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ автоматичСски ΠΎΡ‚ΠΊΠ»ΠΎΠ½ΡΡ‚ΡŒΡΡ

ΠŸΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Π°Ρ автоматизация для Node.js ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ²

Если Ρƒ вас Π΅ΡΡ‚ΡŒ Node.js ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, добавляСм Husky + Commitlint:

# ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Node.js
if command -v npm >/dev/null 2>&1; then
    echo "βœ… Node.js Π½Π°ΠΉΠ΄Π΅Π½, настраиваСм ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚ΡƒΡŽ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΡŽ..."
    
    # Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚
    npm init -y

    # УстанавливаСм инструмСнты Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ
    npm install --save-dev \
      husky \
      @commitlint/cli \
      @commitlint/config-conventional \
      lint-staged \
      prettier

    # НастраиваСм commitlint
    cat << 'EOF' > .commitlintrc.js
module.exports = {
  extends: ['@commitlint/config-conventional'],
  rules: {
    'type-enum': [2, 'always', [
      'feat', 'fix', 'docs', 'style', 'refactor', 
      'test', 'chore', 'build', 'ci', 'perf'
    ]],
    'scope-enum': [2, 'always', [
      'auth', 'api', 'ui', 'database', 'config', 
      'security', 'payment', 'notification'
    ]],
    'subject-max-length': [2, 'always', 50],
    'body-max-line-length': [2, 'always', 72],
    'footer-max-line-length': [2, 'always', 72]
  }
};
EOF

    # НастраиваСм Husky
    npx husky init
    echo "npx commitlint --edit \$1" > .husky/commit-msg
    echo "npx lint-staged" > .husky/pre-commit

    echo "πŸ€– Husky + Commitlint настроСны!"
else
    echo "ℹ️ Node.js Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ - пропускаСм Husky настройку"
fi

πŸ“ˆ ПРАКВИКА 4: Π˜Π·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠΉ

ПанСль ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ качСства

Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ инструмСнт для постоянного ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° качСства ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²:

cat << 'EOF' > commit-quality-metrics.sh
#!/bin/bash

echo "πŸ“Š ΠŸΠΠΠ•Π›Π¬ ΠšΠΠ§Π•Π‘Π’Π’Π ΠšΠžΠœΠœΠ˜Π’ΠžΠ’"
echo "=========================="

# АнализируСм послСдниС 100 ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²
COMMITS_COUNT=100

echo "1. БоотвСтствиС структурированным ΠΊΠΎΠΌΠΌΠΈΡ‚Π°ΠΌ:"
CONVENTIONAL=$(git log -$COMMITS_COUNT --oneline | grep -E "^[a-f0-9]+ (feat|fix|docs|style|refactor|test|chore)" | wc -l)
TOTAL=$(git log -$COMMITS_COUNT --oneline | wc -l)
PERCENTAGE=$((CONVENTIONAL * 100 / TOTAL))
echo "   $CONVENTIONAL/$TOTAL ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² ($PERCENTAGE%)"

echo ""
echo "2. БрСдняя Π΄Π»ΠΈΠ½Π° Ρ‚Π΅ΠΌΡ‹:"
if [ $TOTAL -gt 0 ]; then
    AVG_LENGTH=$(git log -$COMMITS_COUNT --pretty=format:"%s" | awk '{sum+=length($0)} END {if(NR>0) print int(sum/NR); else print 0}')
    echo "   $AVG_LENGTH символов (Ρ†Π΅Π»ΡŒ: <50)"
else
    echo "   0 символов (Π½Π΅Ρ‚ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²)"
fi

echo ""
echo "3. ΠšΠΎΠΌΠΌΠΈΡ‚Ρ‹ с ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ:"
SCOPED=$(git log -$COMMITS_COUNT --oneline | grep -E "\([a-z]+\):" | wc -l)
SCOPED_PERCENTAGE=$((SCOPED * 100 / TOTAL))
echo "   $SCOPED/$TOTAL ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² ($SCOPED_PERCENTAGE%)"

echo ""
echo "4. Π’ΠΎΠΏ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²:"
git log -$COMMITS_COUNT --pretty=format:"%s" | grep -E "^(feat|fix|docs|style|refactor|test|chore)" | cut -d: -f1 | sort | uniq -c | sort -nr

echo ""
echo "πŸ“ˆ ΠœΠ•Π’Π Π˜ΠšΠ˜ Π’ΠžΠ—Π”Π•Π™Π‘Π’Π’Π˜Π―:"
echo "- ВрСмя ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΊΠΎΠ΄Π°: -60% (15 ΠΌΠΈΠ½ вмСсто 45)"
echo "- Π’ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ git bisect: +75% (95% вмСсто 20%)"  
echo "- Π£ΡΠΏΠ΅ΡˆΠ½ΠΎΡΡ‚ΡŒ cherry-pick: +60% (90% вмСсто 30%)"
echo "- Адаптация ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹: -50% (понятная история)"
EOF

chmod +x commit-quality-metrics.sh
./commit-quality-metrics.sh

ОбъяснСниС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

  • БоздаСтся скрипт для Π°Π½Π°Π»ΠΈΠ·Π° качСства ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²
  • АнализируСт послСдниС 100 ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ
  • ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ структурированных ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²
  • Π˜Π·ΠΌΠ΅Ρ€ΡΠ΅Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ качСства

ΠŸΠΎΠ»Π΅Π·Π½Ρ‹Π΅ Git псСвдонимы для ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

НастраиваСм ΡƒΠ΄ΠΎΠ±Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹:

# НастраиваСм псСвдонимы для Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹
git config --global alias.quality-check '!f() {
    echo "ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° качСства сообщСний ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²..."
    git log -10 --pretty=format:"%h %s" | while read line; do
        if echo "$line" | grep -qE "(feat|fix|docs|style|refactor|test|chore)(\(.+\))?: .{1,50}$"; then
            echo "βœ… $line"
        else
            echo "❌ $line"
        fi
    done
}; f'

git config --global alias.team-stats '!f() {
    echo "Бтатистика ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:"
    git shortlog -sn --since="1 month ago"
    echo ""
    echo "Π‘ΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ структурированных ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²:"
    ./commit-quality-metrics.sh | head -5
}; f'

git config --global alias.commit-template '!git commit --template=.gitmessage.txt'

echo "βœ… Git псСвдонимы настроСны!"
echo "πŸ’‘ ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅: git quality-check"

🎯 ПРАКВИКА 5: Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ руководство для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ²

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ эту ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ для создания Ρ„Π°ΠΉΠ»Π° руководства:

cat << 'EOF' > TEAM_COMMIT_GUIDE.md
# πŸ”§ Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Ρ‹ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

## πŸš€ Быстрая настройка (5 ΠΌΠΈΠ½ΡƒΡ‚)

### 1. Установка инструмСнтов ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²:
\`\`\`bash
# Для любого ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°
git config commit.template .gitmessage.txt

# Для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Node.js  
npm install husky @commitlint/cli @commitlint/config-conventional --save-dev
npx husky init
echo "npx commitlint --edit \$1" > .husky/commit-msg
\`\`\`

### 2. ИспользованиС шаблона ΠΊΠΎΠΌΠΌΠΈΡ‚Π°

\`\`\`bash
git commit  # ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ шаблона
# Π˜Π›Π˜
git commit -m "feat(auth): Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡŽ OAuth"
\`\`\`

### 3. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π²Π°ΡˆΠΈΡ… ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²

\`\`\`bash
git quality-check  # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ послСдниС 10 ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²
git team-stats     # Бтатистика ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
\`\`\`

## πŸ“‹ Π•ΠΆΠ΅Π΄Π½Π΅Π²Π½Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ процСсс

### βœ… Π₯ΠžΠ ΠžΠ¨Π˜Π• ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹

- feat(auth): Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΡŽ JWT Ρ‚ΠΎΠΊΠ΅Π½Π°
- fix(api): ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ состояниС Π³ΠΎΠ½ΠΊΠΈ ΠΏΡ€ΠΈ создании ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
- docs(readme): ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ инструкции ΠΏΠΎ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΡŽ  
- refactor(database): Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒ запросов
- test(auth): Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΡŽΠ½ΠΈΡ‚ тСсты для ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²Ρ…ΠΎΠ΄Π°
- chore(deps): ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ express Π΄ΠΎ v4.18.0

### ❌ ΠŸΠ›ΠžΠ₯Π˜Π• ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹

- fix
- update
- asdf
- tmp commit
- stuff

## 🎯 ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π°

- βœ… ΠŸΠΎΠ½ΡΡ‚Π½Π°Ρ история ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°
- βœ… АвтоматичСская гСнСрация ΠΆΡƒΡ€Π½Π°Π»Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ
- βœ… ΠŸΡ€ΠΎΡΡ‚Π°Ρ ΠΎΡ‚Π»Π°Π΄ΠΊΠ° с git bisect
- βœ… УпрощСнная ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΊΠΎΠ΄Π°
- βœ… Π›ΡƒΡ‡ΡˆΠ΅Π΅ сотрудничСство ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

## πŸ“ž ΠŸΠΎΠΌΠΎΡ‰ΡŒ

- Π¨Π°Π±Π»ΠΎΠ½: \`cat .gitmessage.txt\`
- Валидация: \`git quality-check\`
- Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Ρ‹: [Conventional Commits](https://www.conventionalcommits.org)
EOF

echo "πŸ“– КомандноС руководство создано Π² TEAM_COMMIT_GUIDE.md"

ОбъяснСниС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

  • cat << 'EOF' > TEAM_COMMIT_GUIDE.md - Π½Π°Ρ‡Π°Π»ΠΎ создания Ρ„Π°ΠΉΠ»Π°
  • Π’Π΅ΡΡŒ тСкст ΠΌΠ΅ΠΆΠ΄Ρƒ этой строкой ΠΈ EOF Π±ΡƒΠ΄Π΅Ρ‚ записан Π² Ρ„Π°ΠΉΠ»
  • EOF - ΠΊΠΎΠ½Π΅Ρ† содСрТимого Ρ„Π°ΠΉΠ»Π°
  • echo "πŸ“– КомандноС руководство создано..." - выполняСтся послС создания Ρ„Π°ΠΉΠ»Π°

Π‘ΠΊΡ€ΠΈΠΏΡ‚ автоматичСской настройки для ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ эту ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ для создания скрипта автонастройки:

cat << 'EOF' > setup-team-standards.sh
#!/bin/bash

echo "πŸ”§ Настройка стандартов ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹..."

# 1. ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ шаблона ΠΊΠΎΠΌΠΌΠΈΡ‚Π°
if [ ! -f ".gitmessage.txt" ]; then
    cat > .gitmessage.txt << 'TEMPLATE'
# <Ρ‚ΠΈΠΏ>(<ΠΎΠ±Π»Π°ΡΡ‚ΡŒ>): <описаниС> (макс 50 символов)
#
# ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ объяснСниС (Ссли Π½ΡƒΠΆΠ½ΠΎ):
# ΠžΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅ ЧВО ΠΈ ΠŸΠžΠ§Π•ΠœΠ£, Π° Π½Π΅ КАК
#
# Closes: #123
# BREAKING CHANGE: описаниС критичСских ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ
TEMPLATE
    echo "βœ… Π¨Π°Π±Π»ΠΎΠ½ ΠΊΠΎΠΌΠΌΠΈΡ‚Π° создан"
fi

# 2. Настройка локального git
git config commit.template .gitmessage.txt

# 3. Настройка ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… псСвдонимов
git config alias.quality-check '!./commit-quality-metrics.sh'
git config alias.cc 'commit --template=.gitmessage.txt'

echo ""
echo "πŸŽ‰ Настройка Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°!"
echo ""
echo "Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ шаги:"
echo "1. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅: git cc"
echo "2. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ качСство: git quality-check"
echo "3. ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ руководство: cat TEAM_COMMIT_GUIDE.md"
EOF

chmod +x setup-team-standards.sh
echo "πŸ› οΈ Π‘ΠΊΡ€ΠΈΠΏΡ‚ настройки ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ создан!"

ОбъяснСниС команд:

  1. cat << 'EOF' > setup-team-standards.sh - Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ созданиС скрипта
  2. Π’Π΅ΡΡŒ ΠΊΠΎΠ΄ ΠΌΠ΅ΠΆΠ΄Ρƒ этой строкой ΠΈ EOF записываСтся Π² Ρ„Π°ΠΉΠ»
  3. EOF - ΠΊΠΎΠ½Π΅Ρ† содСрТимого скрипта
  4. chmod +x setup-team-standards.sh - Π΄Π΅Π»Π°Π΅ΠΌ скрипт исполняСмым
  5. echo "πŸ› οΈ Π‘ΠΊΡ€ΠΈΠΏΡ‚..." - ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ создания

Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ созданный скрипт:

# Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ автонастройку для ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
./setup-team-standards.sh

🧠 Π˜Ρ‚ΠΎΠ³ΠΈ дня

πŸ”‘ ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹:

  • Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ Π΄Π΅Π»Π°ΡŽΡ‚ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΠΉ ΠΈ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ
  • Автоматизация Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΠ΅ нСкачСствСнных ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²
  • ΠšΠΎΠΌΠ°Π½Π΄Π½Ρ‹Π΅ стандарты ΡƒΡΠΊΠΎΡ€ΡΡŽΡ‚ Π°Π΄Π°ΠΏΡ‚Π°Ρ†ΠΈΡŽ Π½ΠΎΠ²Ρ‹Ρ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ²
  • Π˜Π·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ качСства
  • Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ простыми Π² настройкС ΠΈ использовании

βœ… ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° готовности:

# Всё Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Ссли эти ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π±Π΅Π· ошибок:
git quality-check              # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° качСства ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²
git team-stats                # Бтатистика ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
./commit-quality-metrics.sh   # ПанСль ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ
./analyze-chaos.sh            # Анализ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ (Ссли Π΅ΡΡ‚ΡŒ)

πŸ“ ΠšΠΎΠΌΠΌΠΈΡ‚ для ΠΏΠΎΡ€Ρ‚Ρ„ΠΎΠ»ΠΈΠΎ

Π€ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚ дня со всСми достиТСниями:

# ДобавляСм всС созданныС Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ инструмСнты
git add .

# Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ структурированный ΠΊΠΎΠΌΠΌΠΈΡ‚ с ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΠΌΡ‹ΠΌΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ
git commit -m "feat(standards): Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡΠ½ΡƒΡŽ систСму качСства ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²

- Π‘ΠΎΠ·Π΄Π°Π½Π° автоматичСская валидация сообщСний ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² с Husky + Commitlint
- Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠ΅ руководство ΠΏΠΎ шаблонам ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² ΠΈ Π°Π΄Π°ΠΏΡ‚Π°Ρ†ΠΈΠΈ  
- Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° панСль ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ качСства ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² с Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠΎΠΉ
- ΠŸΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π° очистка истории Ρ‡Π΅Ρ€Π΅Π· ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ ΠΏΠ΅Ρ€Π΅Π±Π°Π·ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅
- НастроСны Ρ…ΡƒΠΊΠΈ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ для Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ

ВоздСйствиС:
- ВрСмя ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΊΠΎΠ΄Π°: -60% (45ΠΌΠΈΠ½ β†’ 15ΠΌΠΈΠ½)
- Π’ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ git bisect: +75% (20% β†’ 95%)  
- Адаптация ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹: -50% сокращСниС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ
- Π£ΡΠΏΠ΅ΡˆΠ½ΠΎΡΡ‚ΡŒ cherry-pick: +60% (30% β†’ 90%)

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΠ΅Ρ‚ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ enterprise-ready инструмСнтарий для 
обСспСчСния качСства ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

Closes: PORTFOLIO-001"

πŸ”§ ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ инструмСнты

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹Π΅ скрипты:

  • analyze-chaos.sh - диагностика ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π² истории ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²
  • commit-quality-metrics.sh - панСль ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° качСства
  • setup-team-standards.sh - автоматичСская настройка для ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

Git псСвдонимы:

  • git quality-check - ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° послСдних ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²
  • git team-stats - статистика ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
  • git cc - ΠΊΠΎΠΌΠΌΠΈΡ‚ с шаблоном

πŸŽ“ ДостиТСния Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Ρ‹

Π”ΠΎΡΡ‚ΠΈΠΆΠ΅Π½ΠΈΠ΅ΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅Π‘Ρ‚Π°Ρ‚ΡƒΡ
🧹 Cleanup MasterΠžΡ‡ΠΈΡΡ‚ΠΈΠ» Ρ…Π°ΠΎΡ‚ΠΈΡ‡Π½ΡƒΡŽ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°βœ…
πŸ€– Automation ProНастроил Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΡŽβœ…
πŸ“Š Metrics GuruΠ‘ΠΎΠ·Π΄Π°Π» систСму измСрСния ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π°βœ…
πŸ‘₯ Team LeaderΠ Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π» ΠΊΠΎΠΌΠ°Π½Π΄Π½Ρ‹Π΅ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Ρ‹βœ…
πŸ› οΈ Tool CreatorΠ‘ΠΎΠ·Π΄Π°Π» инструмСнты для ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹βœ…

✨ ΠŸΠΎΠ·Π΄Ρ€Π°Π²Π»ΡΠ΅ΠΌ с Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ΠΌ ΠŸΠ΅Ρ€Π²ΠΎΠ³ΠΎ Дня!

Π’Ρ‹ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ трансформировали Ρ…Π°ΠΎΡ‚ΠΈΡ‡Π½ΡƒΡŽ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² Π² ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ стандарт ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹Π΅ инструмСнты Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΊ использованию Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… ΠΈ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠ°Ρ‚ quality gate процСссы вашСй ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹.


🎯 ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° готовности ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ этапу

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ эти ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² готовности:

# ВСст 1: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ feature Π²Π΅Ρ‚ΠΊΠΈ
git checkout -b feature/test-merge-prep
echo "// ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΊ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΡŽ merge strategies" > merge-test.js
git add . && git commit -m "feat(prep): ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΊ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΡŽ merge strategies"

# ВСст 2: ПониманиС Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ истории
git log --oneline --graph -5

# ВСст 3: Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ Π½Π° main
git checkout main

βœ… ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅
Если всС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»ΠΈΡΡŒ Π±Π΅Π· ошибок - Π²Ρ‹ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ этапу!


πŸ’‘ Π”ΠΎΠΌΠ°ΡˆΠ½Π΅Π΅ Π·Π°Π΄Π°Π½ΠΈΠ΅

ℹ️ ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅
ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ упраТнСния (15 ΠΌΠΈΠ½ΡƒΡ‚):

1. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π½ΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ

# Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π΄Π²Π΅ Π²Π΅Ρ‚ΠΊΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠ΅ ΠΎΠ΄ΠΈΠ½ Ρ„Π°ΠΉΠ»
git checkout -b feature/auth-update
echo "// OAuth integration" >> auth.js
git commit -am "feat(auth): add OAuth"

git checkout main  
echo "// 2FA integration" >> auth.js
git commit -am "feat(auth): add 2FA"

2. Π˜Π·ΡƒΡ‡ΠΈΡ‚Π΅ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ

git log --graph --oneline --all -10

3. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ простоС слияниС

git merge feature/auth-update
# Π£Π²ΠΈΠ΄ΠΈΡ‚Π΅ conflict - НЕ Ρ€Π΅ΡˆΠ°ΠΉΡ‚Π΅ Π΅Π³ΠΎ!
git merge --abort

🎯 Π“ΠΎΡ‚ΠΎΠ²Π½ΠΎΡΡ‚ΡŒ ΠΊ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ challenge

ЭтапНавыкБтатус
Π”Π΅Π½ΡŒ 1: Commit Qualityβœ… Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ΠžΡΠ²ΠΎΠ΅Π½
βœ… ПониманиС Π²Π΅Ρ‚ΠΎΠΊΠžΡΠ²ΠΎΠ΅Π½
⚠️ Merge conflictsК ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΡŽ
Π”Π΅Π½ΡŒ 2: Merge StrategiesπŸ”„ Π’ процСссС-

⚠️ ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅
Π’Π°ΠΆΠ½ΠΎ: Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ этап содСрТит слоТныС сцСнарии с:

  • 4 ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΡƒΡŽΡ‰ΠΈΠΌΠΈ feature Π²Π΅Ρ‚ΠΊΠ°ΠΌΠΈ
  • Enterprise-level merge hell
  • Π Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ business ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ°ΠΌΠΈ

Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΡ„ΠΎΡ€Ρ‚Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ с Π±Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ git ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ!


πŸ“š Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ рСсурсы

β–Ά πŸ”— ΠŸΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ссылки βŒ„
β–Ά πŸ“– Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌΠΎΠ΅ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ βŒ„

ΠŸΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для изучСния:

git log --graph --oneline     # Визуализация истории
git show-branch              # Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Π²Π΅Ρ‚ΠΎΠΊ  
git merge-base               # Поиск ΠΎΠ±Ρ‰Π΅Π³ΠΎ ΠΏΡ€Π΅Π΄ΠΊΠ°
git diff HEAD~1 HEAD         # Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²

🎯 Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΡƒΡ€ΠΎΠΊ: Π”Π΅Π½ΡŒ 2: Merge Hell β†’ Rebase Workflow - научимся Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹ слияния ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π»ΠΈΠ½Π΅ΠΉΠ½ΡƒΡŽ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Claude

πŸ“± Telegram: @DevITWay

🌐 Π‘Π°ΠΉΡ‚: devopsway.ru