git commit --amend замінює останній коміт новим: з виправленим повідомленням, доданими файлами чи обома змінами.
Виправити повідомлення:
git commit --amend -m "Fix invoice total rounding"
Додати забутий файл:
git add tests/Feature/InvoiceTest.php
git commit --amend --no-edit # зберегти попереднє повідомлення
Змінити автора (наприклад, коміт зроблено з неправильною поштою):
git commit --amend --reset-author --no-edit
Що відбувається насправді: Git не змінює старий коміт - коміти незмінні. Він створює новий коміт з іншим хешем і переставляє на нього гілку. Старий коміт лишається в репозиторії (його видно в git reflog), доки його не прибере збирач сміття.
Коли --amend безпечний: коміт ще не відправлено у спільний репозиторій (git push) або гілка особиста й ніхто на неї не спирається.
Коли не можна: коміт уже в спільній гілці (main, гілка колеги). Після --amend локальна історія розходиться з віддаленою:
! [rejected] main -> main (non-fast-forward)
Щоб відправити, доведеться робити force push - і колеги, що вже отримали старий коміт, матимуть конфлікти й дублікати. У спільній гілці замість --amend - новий коміт з виправленням.
У своїй гілці pull request після --amend використовуйте git push --force-with-lease - він не перезапише чужих змін, якщо вони з'явилися на сервері.
Виправити не останній, а давніший коміт - через git commit --fixup <хеш> і git rebase -i --autosquash, а не --amend.
Якщо --amend зроблено помилково: git reset --soft HEAD@{1} повертає гілку на попередній коміт, а зміни лишаються в індексі.