Commit
Практична порада: окремий refactoring commit — це подарунок reviewer-у й майбутньому debugging-у.; * завершена логічна частина роботи;
- tests проходять;
- зміна має сенс окремо;
- потрібно зберегти прогрес;
- зміна готова для review;
- завершено bug fix;
- додано documentation;
- зроблено refactoring;
- оновлено config;
- створено migration.; Commit каже: “ось зміна забезпечується через Саме з цієї причини Git більше схожий не на кнопку “Save”, а на машину часу; додатково реалізовано ось хто її зробив, ось коли, ось повідомлення, ось її місце в історії”.; * Commit history має змогу бути технічною документацією, якщо її писали уважно.;== Commit і Remote Repository ==
Головна думка: commit — це не без ускладнень “зберегти код”.; refactor: extract invoice calculator </syntaxhighlight> Команда для перегляду: feat: add user profile route
Поширені типи:
</syntaxhighlight> </syntaxhighlight>
Приклад:
Приклад хорошого atomic commit:
</syntaxhighlight> Практична роль: repository — це місце, де живе вся commit history проєкту.;== Revert Commit ==
Commit і CI/CD
переважні аспекти revert:
Commit у Open Source
Небезпека: поганий commit має змогу не тільки зламати код, а й ускладнити розуміння історії на роки вперед.; Практична роль: tests у commit показують, що зміна не тільки написана, а й перевірена.;</syntaxhighlight>
git log Add email validation to signup form
Практична роль: parent commits дозволяють Git будувати історію й розуміти, як зміни пов’язані між собою.; a1b2c3d4e5f678901234567890abcdef12345678
Tag часто ставлять на commit, який відповідає release.;</syntaxhighlight>
{{SEO
Створити: Краще: Git binary-searches history
Підказка: якщо commit message без зайвих зусиль перетворити на пункт changelog або пояснення в PR, він зазвичай написаний добре.; Git commit — об’єкт Git, який фіксує snapshot проєкту й metadata.; Commit history має змогу використовуватися для створення changelog.;Практична роль: commit стає не лише записом в історії, а й тригером автоматичної перевірки якості.; Це простий спосіб помітити випадкові debug logs, secrets або непотрібні зміни.;== Amend Commit ==
Parent Commit
git status
Ідея:
Pull отримує changes з remote repository і інтегрує їх у локальний branch.; До secrets належать:
Commit у Documentation Projects
Commit містить:
git rebase -i HEAD~3
Hotfix
істотно: перед commit варто подивитися diff.; Команди: </syntaxhighlight> У Git commit зберігає стан файлів на певний момент, автора, дату, повідомлення, посилання на попередній commit і унікальний ідентифікатор — commit hash.; Приклад:
істотно: squash зручний, але не треба зливати в один commit unrelated changes.; У Добрий commit часто передбачено tests для зміни.;== git bisect ==
'''Перевага:''' commits дозволяють не без ускладнень бачити фінальний код, а розуміти шлях, яким команда до нього прийшла.;== Ризики Commit ==
'''Atomic commit''' — commit, який містить одну логічну зміну.; * Merge commit має змогу мати більше одного parent.; git tag v1.4.0 a1b2c3d
'''Практична роль:''' cherry-pick надає можливість взяти одну “вишеньку” з історії й перенести її в інше місце.; '''Repository''' зберігає commits, branches, tags і metadata.; * linting;
* tests;
* build;
* security scan;
* type checking;
* preview deployment;
* artifact creation;
* Docker image build;
* deployment to staging;
* release automation.;<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
fix: correct invoice rounding
У conventional commits breaking change часто позначають так:
== Breaking Change у Commit ==
У monorepo один commit має змогу торкатися кількох packages або applications.;<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
* зміни в одному файлі;
* зміни в багатьох файлах;
* додавання файлу;
* видалення файлу;
* перейменування;
* refactoring;
* bug fix;
* feature;
* test update;
* documentation update;
* configuration change;
* migration script.;</div>
== Commit і Pull Request ==
Commits можуть створювати проблеми, якщо їх робити недбало.;<syntaxhighlight lang="text">
'''істотно:''' перед створенням нового branch або commit у спільному branch корисно підтягнути актуальні зміни.; '''Практична роль:''' documentation commit фіксує зміни знань так само, як code commit фіксує зміни поведінки.; * Revert не видаляє commit із history, а створює новий commit зі зворотною зміною.;<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
Pull request зазвичай складається з одного або кількох commits.; Commit має змогу містити:
- знати, який код у production;
- debug-ити bug;
- робити rollback;
- відтворити build;
- провести audit;
- знайти diff між releases.;
Commit History
Краще:
Корисні інструменти:
- secrets у history;
- великі незрозумілі commits;
- погані commit messages;
- unrelated changes в одному commit;
- переписана shared history;
- force push без узгодження;
- commits без tests;
- broken main;
- noisy history;
- autogenerated files без потреби;
- binary files у Git;
- merge conflicts;
- lost local commits без push;
- неправильний author.;
Короткий варіант:
Large commit — commit із великою кількістю різних змін.;* `git diff` показує unstaged changes;
* `git diff --staged` показує зміни, які вже потраплять у commit.; * знайти, коли з’явилась зміна;
* зрозуміти еволюція feature;
* відстежити bug;
* знайти автора;
* підготувати release notes;
* зробити revert;
* провести audit.; Коли доречний
Приклад слабкого повідомлення:
Файли можуть бути:
'''Практична роль:''' `.gitignore` зменшує шанс випадково закомітити сміття, secrets або локальні файли.; git commit --amend
'''істотно:''' release має бути traceable до конкретного commit або tag.; Потім Git пропонує commits для перевірки, поки не знайде перший bad commit.; Приклад:
<syntaxhighlight lang="bash">
== Коли краще не робити Commit ==
Поганий приклад:
fix: handle empty cart during checkout
Приклад:
Working Tree
Розробник виносить розрахунок ціни в окремий class без зміни поведінки:
fix
git commit -m "Add profile update validation"
git diff переглянуто?;Приклад:
!; Можна:
Звичайний commit має одного parent:
== Commit Message ==
Release process має змогу включати:
'''Помилка:''' commit message типу `stuff`, `update`, `fix2` або `final` майже нічого не каже майбутній команді.; '''Signed commit''' — commit із cryptographic signature, яка підтверджує автора або джерело commit.;<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
== Staging Area ==
== Commit і Branch ==
<div style="background:#fdecea; border-left:6px solid #e74c3c; padding:12px; margin:12px 0;">
<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">
Tokens were accepted for 48 hours because the expiration check used </syntaxhighlight>
`git bisect` сприяє знайти commit, у якому з’явився bug.; D - Add form Commit message — текстове пояснення, що змінив commit і навіщо.; Приклад: .env
Commit history — послідовність commits у repository.; git add file.txt
Conventional Commits
Commit і Formatting
Commit і Tags
</syntaxhighlight> Приклад:
істотно: commit message має пояснювати не лише “що”, а іноді й “чому”.;- втрачається детальна commit history branch;
- складніше побачити проміжні кроки;
- погано, якщо commits були логічно різними.; Fix password reset token expiration
як ілюстрація:
<syntaxhighlight lang="text">
застосовується для:
* перевіряє поточний стан;
* переглядає зміни;
* додає потрібний файл;
* перевіряє staged diff;
* створює commit;
* відправляє commit у remote.;Commit і Debugging
git diff
feat!: change authentication token format
Приклад:
Cherry-Pick Commit
Висновок
- легше review;
- легше revert;
- зрозуміліша історичний розвиток;
- простіше debug;
- краще для bisect;
- менше ризику змішаних змін.;== Приклади сценаріїв використання ==
git push git push
Цікаві факти про Commit
Amend надає можливість змінити останній commit.;</syntaxhighlight>
git reset --mixed HEAD~1
Проста різниця: commit — це точка в історії, tag — це важлива мітка на цій точці.;git bisect bad
This adds a guard for empty carts and returns the user to the cart page.;{| class="wikitable"
</div>
* короткий summary;
* пояснено причину;
* пояснено fix;
* згадано test;
* майбутній читач зрозуміє контекст.; * Commit hash часто потрапляє в build metadata, logs і release notes.;</div>
<syntaxhighlight lang="text">
A---B---C
!;<syntaxhighlight lang="text">
'''Merge commit''' створюється, коли Git об’єднує дві гілки й фіксує це як окремий commit.; * Поганий commit message має змогу здаватися дрібницею сьогодні, але дуже дратувати через пів року.;== Commit у Infrastructure as Code ==
== Commit і Secrets ==
Initial Commit
- Terraform changes;
- Kubernetes manifests;
- CI/CD config;
- cloud IAM policies;
- network rules;
- monitoring alerts;
- deployment scripts.;
git commit -m "Add user profile page"
Головна перевага: commit робить зміну коду конкретною, поясненою й відстежуваною.;Цей workflow: Tests додані або оновлені, якщо потрібно?; Staging area надає можливість:
refactor: simplify payment calculation Найлюдяніший факт: commit — це спосіб не покладатися на пам’ять.;</syntaxhighlight>
Рекомендовано:
- історичний розвиток змін;
- traceability;
- можливість rollback;
- командна робота;
- code review;
- CI/CD integration;
- debugging;
- release management;
- audit;
- documentation of intent;
- супровід branches;
- порівняння versions;
- пошук regression;
- прив’язка build до source code.; Release зазвичай складається з одного або кількох commits, які потрапили в стабільну версію.; * Зміна commit message через amend змінює commit hash.; docs: remove outdated deployment command
</syntaxhighlight> git push -u origin feature/login refactor: extract invoice calculator |- | Revert | Створює новий commit, який скасовує зміну | Shared branches, main, production history |- | Reset | Переміщує branch pointer і має змогу прибрати commits | Локальна історичний розвиток, cleanup перед push |}
Longer explanation if needed.;A---B---C------M main
</div>
F - Update tests
Initial commit
Refactoring commits краще відокремлювати від behavior changes.; test: add checkout tests Empty commit — commit без змін у файлах.; created_at instead of expires_at.; * README updates;
- API docs;
- changelog;
- architecture notes;
- tutorials;
- configuration guide;
- migration guide;
- comments;
- examples.;
Приклад:
</div>
fix: correct invoice total rounding
feat: add profile edit form
* одна логічна зміна;
* зрозуміле message;
* немає випадкових файлів;
* tests поруч зі зміною;
* refactoring окремо від behavior change;
* formatting окремо від logic.; Часто використовують коротку форму:
== Коли варто робити Commit ==
After squash:
<div style="background:#fdecea; border-left:6px solid #e74c3c; padding:12px; margin:12px 0;">
</div>
'''Небезпека:''' найпростіша помилка — зробити commit не в з цієї причини branch.; * поточний branch;
* staged changes;
* unstaged changes;
* untracked files;
* чи branch випереджає remote;
* чи є собою conflicts;
* підказки щодо наступних команд.;<syntaxhighlight lang="bash">
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
git cherry-pick a1b2c3d
Різниця:
</div>
Локальні tests проходять?; Тут commits `D` і `E` знаходяться на branch `feature/login`.; fetch + merge
</div>
У Git commits утворюють graph, а не без ускладнень лінійний список.; це зафіксований знімок змін у системі контролю версій виступає ключовою рисою '''Commit''' або '''коміт'''.;</div>
git diff --staged
git status
* `feat`;
* `fix`;
* `docs`;
* `style`;
* `refactor`;
* `test`;
* `build`;
* `ci`;
* `chore`;
* `perf`.; Команда має знати:
against expires_at and adds a regression test.;</div>
test: add profile update tests
<syntaxhighlight lang="text">
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
історичний розвиток сприяє:
'''Критично:''' infrastructure commit має змогу створити, змінити або видалити реальні ресурси.; * показує факт об’єднання branches;
* зберігає topology історії;
* групує changes feature branch;
* сприяє зрозуміти, коли feature потрапила в main.; * unmodified;
* modified;
* staged;
* untracked;
* deleted;
* renamed.;== Commit і Refactoring ==
== Commit у Data і ML-проєктах ==
- new features;
- bug fixes;
- breaking changes;
- performance improvements;
- security fixes;
- dependency updates;
- migration notes.; * зрозуміти історію;
- швидше review-ити код;
- debug-ити regression;
- писати changelog;
- пояснювати рішення для бізнесу;
- підтримувати проєкт через місяці або роки.; Практична порада: перед commit майже завжди корисно запустити `git status`, щоб не зафіксувати зайве.; Проста аналогія: Git commit — це фотографія проєкту плюс підпис, хто її зробив і чому.; git blame src/payment.ts
</syntaxhighlight>
- tree — стан файлів;
- parent commit або кілька parents;
- author;
- committer;
- timestamp;
- commit message;
- commit hash.; Якщо він уже був у history, його могли скопіювати.;</syntaxhighlight>
- переглянути commits;
- обговорити diff;
- запустити CI;
- перевірити tests;
- провести code review;
- об’єднати changes у main;
- squash або merge commits.; Або для нового branch:
Merge commit корисний, бо:
== Atomic Commit ==
Commit hash надає можливість:
*.log
build: 3481
Проблеми:
'''Основна ідея:''' commit — це контрольна точка в історії коду, яка зберігає конкретні зміни разом із поясненням.; Після commit і push можуть запускатися:
Documentation commits можуть містити:
коду.; Перед роботою й перед commit корисно запускати `git status`.; '''істотно:''' amend безпечний для локальних commits, але з shared commits потрібно бути обережним, бо змінюється history.; \ \
Після commit потрібно зробити push?;
Недоліки:
Commit часто запускає CI/CD pipeline.;== Revert vs Reset ==
Після цього Git створює нову точку в історії repository.;git add forgotten-file.ts
refactor: simplify payment service
'''Cherry-pick''' переносить конкретний commit в іншу гілку.;<syntaxhighlight lang="bash">
'''Практична роль:''' хороший message зменшує потребу шукати автора й питати: “А чому це змінили?”
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
* запуску CI/CD;
* позначення події;
* тестування pipeline;
* створення marker commit;
* ручного deployment trigger.; A → B → C
<syntaxhighlight lang="bash">
D---M
</div>
'''Parent commit''' — commit, на якому базується поточний commit.; Його не варто review-ити поверхнево.; D---E-- feature
</div>
Push надає можливість:
Приклади:
<div style="background:#f0eaff; border-left:6px solid #8e44ad; padding:12px; margin:12px 0;">
== Commit і Deployment ==
* чистіша main history;
* один commit на feature;
* простіший revert;
* менше шуму.; |-
| `--soft`
| прибирає commit, але залишає зміни staged
|-
| `--mixed`
| прибирає commit і залишає зміни unstaged
|-
| `--hard`
| прибирає commit і зміни з working tree
|}
'''Практична роль:''' working tree — це місце, де ви реально редагуєте файли перед тим, як зафіксувати зміни.;<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
<syntaxhighlight lang="text">
Якщо secret потрапив у commit:
'''Практична роль:''' commit — одиниця історії, а pull request — одиниця обговорення й інтеграції змін.; Commits дозволяють відстежувати еволюція коду, працювати в branches, робити pull requests, запускати CI/CD, створювати releases і debug-ити production.; '''істотно:''' production без інформації про commit — це blind spot.;
Основні переважні аспекти commits: git reset --hard HEAD~1
docs: add API authentication examples
переважні аспекти atomic commits:
<syntaxhighlight lang="bash">
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
У staged changes немає зайвих файлів?;</div>
<syntaxhighlight lang="text">
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
* API keys;
* passwords;
* private keys;
* database credentials;
* tokens;
* cloud credentials;
* signing keys;
* OAuth secrets;
* `.env` файли з паролями.;</div>
<syntaxhighlight lang="bash">
== Commit і Build ==
<div style="background:#fef2f2; border-left:6px solid #ef4444; padding:12px; margin:12px 0;">
Я в правильному branch?; Підхід
</div>
* видалено public API;
* змінено формат response;
* змінено database schema;
* змінено required config;
* видалено підтримку старої версії;
* змінено behavior function.;== Тематичні мітки ==
Short summary
* який commit deployed;
* коли deployed;
* ким або яким pipeline;
* які commits увійшли в release;
* який commit був попереднім;
* як зробити rollback;
* які migrations пов’язані з commit.; Add email validation, rewrite navbar, update database schema, fix typo
Commit Hash
Команда `git diff` показує різницю між версіями файлів.; Working tree → Staging area → Commit
істотно: commit не дорівнює backup у remote.;<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
Приклад:
D---E feature/login
</div>
known bad commit
Команди:
Типовий flow:
<div style="background:#f0eaff; border-left:6px solid #8e44ad; padding:12px; margin:12px 0;">
Refactor payment logic and reformat 80 files
Джерела
<syntaxhighlight lang="text">
</div>
<syntaxhighlight lang="bash">
<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">
Secrets не можна додавати в commit.; '''Conventional Commits''' — формат commit messages, який сприяє автоматизувати changelog і versioning.;<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
'''Проста думка:''' commit history — це щоденник проєкту, написаний кодом і повідомленнями commits.;<syntaxhighlight lang="text">
* У Git commit — це object із hash, metadata і посиланням на tree.;
== Squash Commit ==
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
- перевірити identity;
- зменшити ризик підроблених commits;
- підвищити supply chain security;
- виконати compliance-вимоги;
- захистити важливі branches.; * Atomic commits дуже допомагають `git bisect`.; Приклад:
E - Fix typo
- Author — людина, яка написала зміни.; Добрий open source commit:
git add .; Large commit не завжди поганий.; dist/
Практична роль: commit hash — це адреса конкретної точки в історії коду.; Через branches і merges історичний розвиток має змогу мати розгалуження.; Він зберігає рішення для бізнесу тоді, коли люди вже забули деталі.; !; Проблеми:
fix: correct tax rounding in invoice calculator
Commit і Changelog
</syntaxhighlight>
Commit варто робити, коли:
- код переставлено без зміни поведінки;
- поведінку справді змінено;
- bug fix має конкретний ефект.; * важко review-ити;
- важко revert-ити;
- важко зрозуміти intent;
- має змогу змішувати unrelated changes;
- складніше debug;
- більше шансів приховати bug;
- гірше функціонує з git bisect.;
<syntaxhighlight lang="text">
Приклади:
</div>
* відстежувати зміни інструкцій;
* знаходити застарілі поради;
* перевіряти review;
* прив’язувати docs до release;
* пояснювати policy changes.;== Git Commit ==
Build artifact часто прив’язують до commit hash.;<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
Documentation update
Pull
Code review часто відбувається на рівні commits або pull request.; Commit надає можливість розробникам бачити історію проєкту, повертатися до попередніх версій, порівнювати зміни, працювати в branches, робити code review і точно розуміти, коли, ким і навіщо була внесена зміна.; Перед ним потрібно дуже чітко розуміти наслідки.;== переважні аспекти Commit ==
`M` — merge commit.;</syntaxhighlight>
!; Практична роль: у open source commit message — це частина публічної історії проєкту.; Найкраща commit history — це не без ускладнень список змін, а корисна технічна історичний розвиток проєкту, яку можна читати, аналізувати й використовувати для рішень.; commit: a1b2c3d
</syntaxhighlight>
version: 1.4.2
Практична роль: документація теж має історію, і commits роблять її контрольованою.; Кожен commit знає свого parent commit, з цієї причини Git має змогу побудувати повну історію розвитку проєкту.;git commit -m "Update file"
== Commit і Release ==
Formatting changes краще робити окремим commit.; Погано, коли “wip fix stuff maybe” без контексту потрапляє в main.; '''Практична роль:''' signed commit додає до історії не лише “хто написаний як автор”, а й криптографічне підтвердження.; a1b2c3d
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
git commit --allow-empty -m "Trigger deployment"
BREAKING CHANGE: clients must send tokens in the Authorization header.; як ілюстрація, automated formatting або mass rename має змогу бути великим, але логічно єдиним.; Команда `git status` показує стан repository.; Для цього використовують artifact storage, dataset versioning або model registry.; git revert a1b2c3d
fetch + rebase
== Interactive Rebase ==
Приклади:
<syntaxhighlight lang="text">
Поширена структура:
'''Головне правило:''' commit має бути маленьким настільки, щоб його без зайвих зусиль зрозуміти, і повним настільки, щоб він мав самостійний сенс.;<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
== Commit і Code Review ==
`commit` зберігає зміни локально.; Хороше commit message сприяє:
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
* вибір commit або tag;
* build artifact;
* tests;
* security scan;
* changelog;
* release notes;
* deployment;
* rollback plan;
* monitoring.; git log --oneline
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
git diff
\
- перенесення hotfix;
- backport у release branch;
- вибіркового сфера застосування зміни;
- відновлення окремого commit;
- перенесення fix без усієї feature branch.;== Структура Commit Message ==
git add .; Що робить
Приклад checklist для Commit
Практична роль: merge commit показує не тільки зміни, а й момент інтеграції гілок.; Найлюдяніший факт: commit — це записка майбутньому розробнику: “Я змінив це ось чому”.; Типовий flow: Такі commits потребують особливо уважного review, бо можуть вплинути на production.; * не переписує історію;
- безпечний для shared branches;
- зрозуміло видно, що зміна була скасована;
- добре підходить для main і production branches.; Explain why the change was made, not just what changed.;</syntaxhighlight>
В open source commits мають бути зрозумілими для людей, які не були в приватному контексті команди.; git diff --staged
Technical writer оновлює інструкцію deployment:
Добрі commits полегшують review:
</syntaxhighlight>
- робити atomic commits;
- писати зрозумілі commit messages;
- перевіряти `git status`;
- переглядати `git diff --staged`;
- не комітити secrets;
- не змішувати formatting і logic;
- додавати tests для bug fixes;
- робити push важливої роботи;
- не переписувати shared history без узгодження;
- використовувати conventional commits, якщо команда їх прийняла;
- прив’язувати commits до issues або PR;
- тримати main green;
- не комітити generated files без потреби;
- використовувати `.gitignore`;
- робити revert замість reset у shared branches.;
Squash commit об’єднує кілька commits в один.; * вибрати, які зміни увійдуть у commit;
- розділити різні зміни на окремі commits;
- перевірити staged changes;
- не комітити випадкові файли;
- створювати atomic commits.;
Large Commit
- зміни випадкові;
- код не компілюється;
- tests явно падають через вашу зміну;
- у diff є собою secrets;
- у commit змішано багато unrelated changes;
- message довелося б писати як “stuff”;
- у staged changes є собою debug logs;
- ви не перевірили `git status`;
- зміна ще настільки хаотична, що її краще розділити.;</syntaxhighlight>
Критично: breaking change має бути явно позначений, бо він впливає на users, clients, deployments і migration.; Практична роль: такий порядок зменшує шанс випадково закомітити не ті файли.;== .gitignore і Commit ==
- має ясне message;
- пов’язаний із issue або PR;
- містить tests;
- не містить secrets;
- не ламає public API без пояснення;
- відповідає contributing guide;
- без зайвих зусиль review-иться.; Команда оперативно виправляє production issue:
істотно: для shared history частіше безпечніший revert, бо він не переписує минуле.;
Це надає можливість:
- змінити порядок commits;
- squash commits;
- змінити commit message;
- видалити commit;
- розділити commit;
- виправити попередній commit.; істотно: interactive rebase корисний для прибирання локальної історії перед PR, але небезпечний для commits, які вже використовує команда.; git status
Push надсилає local commits у remote repository.; git reset --soft HEAD~1
Staging area або index — проміжна зона Git, куди додають зміни перед commit.; Що робить
- позначити release;
- знайти source code версії;
- створити changelog;
- зробити rollback;
- порівняти releases;
- публікувати artifacts.;
Empty Commit
Working tree — поточний стан файлів у вашій робочій папці.; Commit краще відкласти, якщо:
як ілюстрація: Це сприяє reviewer-у відрізнити: Revert створює новий commit, який скасовує зміни попереднього commit.;</syntaxhighlight>
Приклад хорошого commit message
</syntaxhighlight>
Практична роль: conventional commits роблять історію більш машинозчитуваною й корисною для release automation.; Він не повинен містити secrets, випадкові файли або unrelated changes.; У більшості звичайних commits це одна й та сама людина.; Приклад додавання забутого файлу:
Проста думка: revert не стирає минуле, а додає нову зміну, яка нейтралізує стару.;
завдяки наявності Практична роль: короткий summary зручний у `git log`, а довший характеристика користувачі можуть зрозуміти контекст.; Приклад:
</syntaxhighlight>
</syntaxhighlight>
У Git commit має author і committer.; Reset переміщує branch pointer на інший commit.;== Див.; додатково ==
* affected projects;
* dependency graph;
* CI scope;
* ownership;
* code review;
* changelog generation;
* versioning;
* atomicity.;</div>
`push` відправляє commits у remote repository.; * `git log`;
* `git blame`;
* `git bisect`;
* `git show`;
* `git diff`;
* release tags;
* commit hash у logs;
* build metadata.;</div>
Приклад створення commit:
Message зрозуміле?; У Git commit містить snapshot файлів, metadata, автора, повідомлення, parent commits і унікальний hash.;=== Нова функція ===
=== Refactoring ===
== Приклад слабкого commit message ==
<syntaxhighlight lang="text">
</div>
Можливі ризики:
== git diff ==
У commit немає secrets?;<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
Приклад:
або в налаштованих workflow:
Amend переписує останній commit і змінює його hash.;== Типові помилки початківців ==
</syntaxhighlight>
</div>
Commit застосовується в:
'''Commit hash''' — унікальний ідентифікатор commit.; Звичайне збереження файлу каже: “ось поточний стан”.;<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
</div>
'''істотно:''' commit добре версіонує код, але погано підходить для великих binary artifacts або datasets.; .DS_Store
Зазвичай `git pull` означає:
Generated files додані тільки якщо потрібно?; Це сприяє:
<syntaxhighlight lang="text">
* training code;
* feature engineering;
* notebooks;
* pipeline config;
* evaluation scripts;
* model serving code;
* data schema changes;
* experiment tracking config.;
</syntaxhighlight>
Цікавий момент: initial commit — це народження історії repository.;<syntaxhighlight lang="bash">
* не пояснює, що змінилося;
* не пояснює причину;
* не сприяє review;
* не сприяє debugging;
* не підходить для changelog.;</div>
'''Практична роль:''' author і committer допомагають точніше зрозуміти походження зміни.; Якщо ви не зробили push, commit має змогу бути тільки на вашому комп’ютері.;
- вважайте його скомпрометованим;
- rotate secret;
- перевірте remote repository;
- перевірте CI logs;
- видаліть secret із history за потреби;
- повідомте відповідальних за security.; style: format codebase
* знайти контекст;
* побачити commit;
* знайти author;
* перейти до pull request;
* зрозуміти історію рядка.; * Матеріали щодо conventional commits, semantic versioning, changelog generation і release automation.;</div>
Розробник знаходить помилку в розрахунку invoice total, виправляє logic, додає regression test і створює commit:
Приклади:
<syntaxhighlight lang="text">
Fix invoice total rounding
істотно: `git blame` має бути інструментом пошуку контексту, а не пошуку винного.;=== Bug fix === A---B---C main
Цікавий факт
Formatting не змішаний із logic без потреби?;== Хороші практики Commit ==
git blame
Цікавий факт: atomic commits роблять `git bisect` набагато кориснішим, бо легше зрозуміти конкретну причину regression.; * Практики CI/CD, DevOps, build metadata, signed commits, software supply chain security і secure development.; Команда додає сторінку профілю користувача кількома atomic commits:
Commit і Repository
Commit завжди належить до історії repository, а branch вказує на один із commits.;== Commit і Tests ==
істотно: якщо formatting і logic змішані, review стає набагато складнішим.; Це зафіксувати осмислену зміну так, щоб команда й майбутні розробники могли їй довіряти.;У Infrastructure as Code commits можуть змінювати реальну інфраструктуру.; git bisect good v1.2.0
Після локального commit зміни ще не обов’язково є собою на remote server.; Проблема — коли в одному commit змішано багато різних задач.; Типовий flow:
Зазвичай містить:
- поділитися changes;
- відкрити pull request;
- запустити CI;
- зберегти роботу на remote;
- синхронізуватися з командою.;
Before:
Merge commit має змогу мати кілька parents:
Приклад: </syntaxhighlight> </syntaxhighlight>
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
Merge Commit
Commits допомагають debug-ити проблеми.; This changes the validation to compare
git pull Branch рухається вперед, коли в ньому створюються нові commits.; Поширені помилки: Fix checkout crash on empty cart
Практична порада: робіть commit тоді, коли можете чесно написати зрозуміле message про одну зміну.;S - Add signup form Критично: видалити secret у наступному commit недостатньо.; Tag сприяє:
Commit у Monorepo
Author і Committer
docs: add deployment troubleshooting guide
git commit --amend -m "Fix invoice rounding"
- писати commit message `fix`;
- комітити все через `git add .` без перевірки;
- забувати push;
- комітити secrets;
- комітити build artifacts без потреби;
- змішувати кілька задач в одному commit;
- боятися робити часті commits;
- робити commit у неправильному branch;
- використовувати `reset --hard` без розуміння;
- force push у shared branch;
- не перевіряти diff;
- не додавати tests;
- думати, що commit автономно означає backup у remote;
- не знати різницю між commit, push і merge.;
Приклади:
Загальний характеристика
Але для локальної експериментальної роботи іноді тимчасові commits нормальні, якщо потім history буде cleaned up перед merge.; * точно знайти commit;
* посилатися на зміни;
* робити checkout;
* створювати tags;
* debug-ити production;
* пов’язувати build із source code;
* робити revert;
* аналізувати історію.; Приклади:
'''Commit''' — це зафіксована одиниця історії змін у системі контролю версій.; Команда
<syntaxhighlight lang="text">
У data science і ML commits часто містять:
Потрібно уважно стежити за:
git add src/profile.ts
Fix cart total calculation for discounted items
* build artifacts;
* logs;
* local config;
* secrets;
* dependencies у частині екосистем;
* temporary files;
* OS metadata;
* editor files;
* cache folders.; Squash корисний, якщо feature branch має багато дрібних або “робочих” commits.; Зазвичай ігнорують:
<syntaxhighlight lang="bash">
Приклад зміни повідомлення:
'''Практична порада:''' у monorepo особливо істотно не змішувати unrelated changes в одному commit.; \ /
git commit -m "Add profile settings"
'''Практична роль:''' хороші commits допомагають не згадувати перед релізом, що саме змінилося.; '''Проста аналогія:''' commit — це точка на дорозі, branch — це назва дороги, яка веде до поточної точки.; '''істотно:''' тимчасовий локальний commit — нормально.; Changelog має змогу включати:
== Reset Commit ==
Приклад:
</div>
Вона показує:
'''істотно:''' empty commit корисний іноді, але якщо команда часто ним запускає процеси, можливо, pipeline потребує кращого manual trigger.;<syntaxhighlight lang="text">
Приклад:
Commit → Push → CI checks → Pull Request → Merge → Deploy
feat: add password reset flow
changes
== Приклад базового commit workflow ==
The checkout page assumed that cart.items always existed.; Складно debug-ити систему, якщо невідомо, який код функціонує.; '''Критично:''' `git reset --hard` має змогу знищити незбережені зміни.; '''Проста аналогія:''' staging area — це кошик перед касою: ви вирішуєте, що саме піде в наступний commit.;
git push origin feature/profile-settings
docs: update staging deployment guide
- project structure;
- README;
- license;
- basic configuration;
- source code skeleton;
- `.gitignore`;
- package manifest;
- initial tests.; Практична роль: commits дозволяють знайти не тільки де проблема, а й коли вона з’явилася.; * Матеріали щодо atomic commits, debugging, git bisect, git blame і clean commit history.; У documentation projects commit має змогу бути так само важливим, як у code repository.; Приклад:
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
<syntaxhighlight lang="text">
</div>
node_modules/
`git blame` показує, який commit останнім змінив кожен рядок файлу.; * Signed commits допомагають підтвердити походження змін.; Якщо commit messages структуровані, changelog легше генерувати автономно.; Це частина ланцюга історії.; * Git;
- Mercurial;
- Subversion у близьких за змістом операціях;
- software development;
- documentation projects;
- DevOps;
- data engineering;
- infrastructure as code;
- open source;
- CI/CD;
- code review;
- release management.;
Documentation commits допомагають:
git bisect start Хороший commit має бути логічним, зрозумілим, перевіреним і безпечним.; Але вони можуть відрізнятися, як ілюстрація, при applying patches або rebasing.; known good commit Приклад хорошого повідомлення:
PR надає можливість:
Push
chore: update dependencies
</syntaxhighlight>
Commit і Documentation
docs: clarify backup restore steps
Практична роль: checklist сприяє зробити commit чистим, безпечним і корисним для історії проєкту.; Інакше складно відтворити версію.;== git status == застосовується для:
Signed Commit
переважні аспекти:
docs: update API guide
Переглянути історію:
<syntaxhighlight lang="text">
Чому це добре:
Commit має одну логічну зміну?; Погано:
Signed commits допомагають:
- Git
- Version Control
- Source Control
- Repository
- Branch
- Pull Request
- Merge
- Rebase
- Commit Hash
- Commit Message
- Staging Area
- Git Log
- Git Blame
- Git Bisect
- Revert
- Reset
- Cherry-pick
- Conventional Commits
- Code Review
- CI/CD
- Build
- Deployment
- Release
- Tag
- DevOps
- Software Development
- Документація