Комитване — действие по фиксиране на промени в системата за контрол на версиите Git, създаващо точка на запис в историята на проекта. Всеки комит включва хеш, автор, дата и описание на промените. Според данните на GitHub Octoverse 2024 ежедневно в света се създават над 50 милиона комита. Commit — основна единица за работа с версиониране, без която е немислима съвременната разработка на софтуер.
Основни неща
Комит в Git е обект, който съхранява състоянието на файловете на проекта в определен момент от време. Всеки комит съдържа моментна снимка на всички проследявани файлове, препратка към родителския комит и метаданни. За разлика от други системи за контрол на версиите, Git използва content-addressable storage — всеки обект се идентифицира чрез SHA-1 хеш на съдържанието си.
Когато разработчикът комитва промени, Git създава commit обект, който съхранява: tree обект (файлова структура), хеш на родителския комит, автор, комитър, дата и съобщение. Този обект е неизменяем — след създаване комитът не може да бъде модифициран без промяна на неговия хеш. Именно неизменяемостта гарантира цялостта на историята на проекта.
# Подготви промените и комитвай
git add index.html style.css
git commit -m "Fix responsive layout on mobile devices"
# Преглед на детайлите на комита
git log --oneline -3
git show HEAD
# Подготви всички промени и комитвай в една стъпка
git commit -a -m "Update dependencies to latest versions"
Комитите формират насочен ацикличен граф (DAG), където всеки нов комит препраща към предишния. Това позволява придвижване в историята, отмяна на промени и анализ на еволюцията на кодовата база. Разбирането на структурата на Git DAG — основа за напреднала работа с комити.
Процесът на комит в Git се състои от два етапа: добавяне на промени в staging area (индекс) и създаване на комит. Staging area позволява на разработчика да избере кои промени да влязат в комита, дори ако в работната директория са променени много файлове.
Правилото за атомарност — ключов принцип за добър комит. Всеки комит трябва да съдържа една логическа промяна. Ако разработчикът поправя бъг и рефакторира кода — това са два различни комита. Атомарните комити опростяват код-ревюто, отмяната на промени и анализа на историята.
Преди да комитваш, си струва да провериш: дали в кода не са останали debug изходи, коментирани блокове или случайни промени. За това се използва командата git diff --cached, която показва какво точно ще влезе в комита. Допълнителна проверка чрез git status показва списъка на файловете в staging area.
Съобщението за комит е документация на промяната за бъдещи разработчици. Доброто съобщение отговаря на въпросите: какво е променено и защо. Конвенцията Conventional Commits (екип на Angular, 2016) се превърна в стандарт за много проекти и определя формата: тип(област): описание.
| Тип | Предназначение | Пример |
|---|---|---|
| feat | нова функционалност | feat(api): add user registration endpoint |
| fix | поправка на бъг | fix(auth): resolve token refresh issue |
| refactor | рефакториране без промяна на поведението | refactor(core): extract payment validator |
| docs | документация | docs(readme): update installation guide |
| test | добавяне на тестове | test(cart): add unit tests for checkout |
Доброто съобщение за комит се състои от заглавие (до 50 знака) и тяло (по избор, до 72 знака на ред). Заглавието се пише в повелително наклонение: „Add” а не „Added” или „Adds”. Главна буква и точка в края на заглавието не се използват — това е международното споразумение на Git.
Лошо съобщение: „fix things” или „update” — не носи информация. След месец разработчикът няма да може да разбере какво точно е променено и защо. Добро съобщение: „fix(payment): handle timeout in stripe callback” — веднага е ясно къде и какво е поправено.
Разработчиците, особено начинаещите, често правят типични грешки при комити. Най-разпространената — твърде голям комит, в който са смесени десетки промени. Такъв комит не може да бъде частично отменен, а код-ревюто се превръща в мъчение.
Втората по честота грешка — лошо съобщение за комит. Съобщения от типа „fix”, „update”, „changes” или „wip” не дават контекст на бъдещите разработчици. След половин година никой няма да помни какво точно е поправено. Правилото е просто: представи си, че след една година гледаш историята и се опитваш да намериш конкретна промяна.
Трета грешка — комит некомпилиран или неработещ код. След комит кодът трябва поне да се компилира. Несчупен билд — основно изискване за всеки комит в общ клон. За това преди комит се пускат компилация и тестове.
Четвърта грешка — комит с поверителни данни. API ключове, пароли и токени не трябва да попадат в Git историята. Ако тайна вече е комитвана, не е достатъчно просто да се изтрие в нов комит — трябва да се изтрие от цялата история чрез git filter-branch или BFG Repo-Cleaner.
Git предоставя инструменти за управление на историята на комитите. Един от най-полезните е git commit --amend, който позволява допълване на последния комит с нови промени или поправка на съобщението. Това е удобно, ако разработчикът е забравил да включи файл или е сгрешил в съобщението.
# Поправи последното съобщение за комит
git commit --amend -m "fix(auth): correct token validation logic"
# Добави пропуснатия файл към последния комит
git add missed-file.txt
git commit --amend --no-edit
# Интерактивен rebase за последните 3 комита
git rebase -i HEAD~3
Interactive rebase — мощен инструмент за презаписване на историята. Позволява сливане на комити (squash), промяна на съобщения (reword), промяна на реда (reorder) и изтриване на комити (drop). Въпреки това rebase променя историята, затова се прилага само към локални комити, които все още не са изпратени в отдалеченото хранилище.
За отмяна на комити съществуват два подхода. git revert създава нов комит, който отменя промените на предишния — безопасен начин, запазващ историята. git reset изтрива комити от историята — опасен, ако комитите вече са изпратени. В екипната разработка се използва само git revert за отмяна на публикувани комити.
Често задавани въпроси
Да комитваш означава да създадеш точка на запис на промени в Git. Комитът фиксира текущото състояние на файловете в историята на проекта с описание на това какво и защо е променено. Всеки комит има уникален идентификатор (SHA-1 хеш) и е част от неразривна верига от промени.
Препоръчва се да се правят комити след всяка логически завършена промяна, дори и малка. Оптималната честота — 1 комит на задача или поправка. Не си струва да комитваш на всеки 5 минути, но също така не трябва да трупаш промени няколко дни без нито един комит.
Атомарният комит съдържа една логическа промяна — една задача, една поправка на бъг или една нова функционалност. Той не смесва различни промени в един комит. Предимства на атомарните комити: простота на отмяна, ясна история и лесно код-ревю.
За отмяна на публикуван комит използвай git revert
Да, преди изпращане в отдалеченото хранилище. Използвай git commit --amend за промяна на последния комит или git rebase -i за промяна на няколко комита. След push промяната на историята не се препоръчва — може да причини проблеми на други разработчици, ако те вече са изпратили своите промени.
Обобщение
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също