Кратак одговор
Commit поништавате са `git reset` ако измена још није отишла на удаљени репозиторијум, или са `git revert` ако је већ подељена са другима. Пре било чега проверите `git status` и `git log`, јер `git reset --hard` трајно брише непокомитоване измене у праћеним фајловима.
Како се проблем препознаје
- Направили сте commit са погрешним фајловима или поруком
- Последњи commit је покварио буилд или тестове
- Commit је већ гурнут на удаљени репозиторијум па не знате како да га уклоните
- Случајно сте извршили `git reset --hard` и изгубили измене
- Радно стабло је у чудном стању после неуспешног reset-а
Најчешћи узроци
Погрешан садржај commita
У commit су ушли фајлови који не треба да буду ту, попут `.env` фајла или измена из друге гране.
Commit са грешком у коду
Измена је прошла локално, али руши тестове или апликацију, па је потребно вратити претходну верзију.
Commit је већ подељен
Ако је commit гурнут на `main` грану коју користе и други, преписивање историје прави проблеме сарадницима.
Неразумевање reset опција
`--soft`, `--mixed` и `--hard` различито третирају индекс и радни директоријум, па се лако изгубе измене.
Решење корак по корак
- 1
Проверите тренутно стање репозиторијума
Покрените
git statusда видите да ли има непокомитованих измена иgit log --oneline -5да видите последњих пет commita. Запишите хасх commita на који желите да се вратите, јер ће вам требати у корацима који следе. Ако има непокомитованог рада, прво га сачувајте саgit stash. - 2
Сачувајте резервну копију гране
Пре било каквог reset-а направите грану која показује на тренутно стање:
git branch backup-<ime>. Тако можете да се вратите на старо стање ако нешто пође наопако. Ова грана не смета и можете је обрисати касније саgit branch -D backup-<ime>. - 3
Поништите последњи commit без брисања измена
Ако желите да commit нестане, а измене остану у радном директоријуму, користите
git reset --soft HEAD~1. Фајлови остају измењени и спремни за нови, исправан commit. Ово је најбезбеднија опција за локални рад. - 4
Вратите индекс и радни директоријум на претходни commit
За потпуно враћање на претходно стање користите
git reset --hard HEAD~1. Упозорење: ова команда уклања последњи commit са тренутне гране и трајно брише све непокомитоване измене у праћеним фајловима. Прво проверитеgit statusи направите резервну грану. - 5
Вратите се на конкретан commit по хасх-у
Ако не враћате само последњи commit, наведите хасх:
git reset --hard <hash>. Хасх пронађите уgit log --oneline. За више commita уназад користитеHEAD~3уместо хасх-а. И овде важи упозорење: прво направите резервну грану и проверитеgit status, јер ова команда брише непокомитоване измене у праћеним фајловима. - 6
Поништите commit који је већ гурнут
Ако је commit већ на удаљеном репозиторијуму, немојте користити
resetна дељеној грани. Уместо тога покренитеgit revert <hash>, који прави нови commit са супротним изменама. Затим гурните саgit push. - 7
Вратите изгубљене commit-e из рефлог-а
Ако сте случајно извршили
reset --hardи изгубили commit, покренитеgit reflogи пронађите хасх стања пре reset-а. Затим се вратите саgit reset --hard <hash>, али прво проверитеgit statusјер и ова команда брише непокомитоване измене у праћеним фајловима. Рефлог чува историју показивача HEAD обично 30 до 90 дана, али не може да врати непокомитоване измене. - 8
Проверите резултат и наставите рад
Покрените
git statusиgit log --oneline -3да потврдите да је стање исправно. Ако сте радилиrevert, проверите да ли је нови commit присутан. Тек када сте сигурни, обришите резервну грану.
Када reset није довољан
Ако је погрешан commit већ отишао на дељену грану и други су га повукли, git revert је најбезбеднији пут. Насилно гурање преписане историје са git push --force на дељеној грани може да обрише туђе commite и изазове конфликте код свих сарадника. Ако морате да извршите форце пусх, прво обавестите тим и користите --force-with-lease уместо --force, јер се та команда зауставља ако је неко у међувремену гурнуо измене. За велике фајлове или тајне кључеве који су ушли у историју, reset није довољан: потребно је чишћење историје и ротација кључева.
Како да спречите да се понови
- Commit-ujte често и у малим целинама, са јасном поруком
- Пре `reset --hard` увек проверите `git status` и направите резервну грану
- Користите `git revert` на дељеним гранама, а `reset` само локално
- Редовно гурните рад на удаљени репозиторијум да не зависи само од локалног стања
Када је боље позвати стручњака
Ако је погрешан commit већ на дељеној грани коју користи више људи, или ако нисте сигурни шта ће reset урадити са вашим непокомитованим радом, боље је да се посаветујете са IT подршком пре него што наставите сами.
Развој софтвера и производа · Апликације по мери, SaaS и MVP за 4 до 8 недељаЧеста питања
Која је разлика између git reset и git реверт?
`git reset` помера показивач гране и преписује историју, па је безбедан само локално. `git revert` прави нови commit који поништава претходни и не мења историју, па је сигуран за дељене гране.
Да ли могу да вратим commit који сам случајно обрисао?
Можете, ако га пронађете у `git reflog`. Покрените `git reflog`, пронађите хасх жељеног стања и вратите се са `git reset --hard <hash>`.
Шта значи --софт, --mixed и --хард код git reset?
`--soft` задржава измене у индексу и радном директоријуму, `--mixed` (подразумевано) задржава измене само у радном директоријуму, а `--hard` брише измене у праћеним фајловима и враћа их на стање commita.