История о том как одна бага изменила все

git flow

  • develop нестабильный

  • фичи ветки очень большие и долгие

  • запутанная история

Все круто но

Как то раз я искал одну багу

Смотрю историю

  • fix 3,4 after test
  • fix offset and import sort
  • fix after merge
  • Merge branch 'develop' into CM-5435
  • sdfsdfsf
  • dfgdfg
  • refactor new version
  • ... over 50 commits ...
  • new version
  • create base model, files, other

Как-то так

Обратил внимание

  • Никак не помогает

  • История некрасивая

  • Она отражает то как мы разрабатывали

  • После завершения разработки эта информация никому не интересна

Я не хочу знать

  • Как человек пришел к решению
  • Как он обновлял ветку
  • Какие он правки делал что бы его код заработал

Я хочу

  • Видеть только рабочий код
  • Понимать зачем было это изменение

Она может быть красивой

Почему история не красивая?

  • не следим
  • нет удобного инструментария
  • наша история отражает процесс разработки

А что если

CM-5435 [front] Валидации компании: добавление шага проверки документов компании

Выводы

  • Мы подумали что это для нас не несет логического смысла и это все можно соединять

  • скорее важна сама задачи

  • тогда будет понятно кто что сделал

Гипотиза

  • каждая задача была атомарной

  • одна задача один коми

  • stateless релизы

  • то в целом ничего нам не мешает иметь прямую историю

Git rebase workfow

🚦convention

  • ❌ merge commit

  • ❌ Development process history

  • ❌ commit without task

  • 1️⃣ task - 1️⃣ commit

  • 1️⃣ branch - 1️⃣ developer

  • 1️⃣ main branch

  • ✅ rebase

  • stateless release

  • ✅ rebase only task branches

  • atomic tasks

✅ rebase

  • Направленный ациклический граф
  • нет веток
  • git merge fast forward
  • git pull

❌ merge commit

  • имеет > 1 родителя
  • содержит полезную нагрузку

❌ commit without task

  • коммиты в develop

1️⃣ task - 1️⃣ commit

  • боимся ребейза
  • в задаче много изменений
  • рефакторинг
  • декомпозиция

1️⃣ main branch

  • Нельзя из за мержевых коммитов
  • Удаление develop
  • Удаление feature branch

🚩 feature flags

✅ stateless release

  • Правки в релизах

  • Конфликты
  • Выкидываем задачи

🛠 Tools

  • 🏗 decomposition

  • 🚩 feature flags

  • 🔍 testable changes

  • 🔗 backward compatibility

В итоге

  • ~ 2 релиза в день
  • ~ 2h на задачу
  • Весь код всегда в мастере

Bonus

  • git reflog
  • git cherry -v
  • git cherry-pick
  • git merge --squash
  • git checkout -- file
  • git commit --fixup <Hash>
  • git rebase -i --autosquash
  • git filter-branch --tree-filter 'rm -f passwords.txt' HEAD
  • git push --force-with-lease
  • git pull vs git fetch
  • git push -o ci.skip
  • detached HEAD

Git rebase flow

By Sergey Andreev

Git rebase flow

  • 143
Loading comments...

More from Sergey Andreev