Прескочи на садржај
EVI Solutions

Како поништити git commit и вратити претходно стање

Средње 10 мин Ažurirano:

Кратак одговор

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. 1

    Проверите тренутно стање репозиторијума

    Покрените git status да видите да ли има непокомитованих измена и git log --oneline -5 да видите последњих пет commita. Запишите хасх commita на који желите да се вратите, јер ће вам требати у корацима који следе. Ако има непокомитованог рада, прво га сачувајте са git stash.

  2. 2

    Сачувајте резервну копију гране

    Пре било каквог reset-а направите грану која показује на тренутно стање: git branch backup-<ime>. Тако можете да се вратите на старо стање ако нешто пође наопако. Ова грана не смета и можете је обрисати касније са git branch -D backup-<ime>.

  3. 3

    Поништите последњи commit без брисања измена

    Ако желите да commit нестане, а измене остану у радном директоријуму, користите git reset --soft HEAD~1. Фајлови остају измењени и спремни за нови, исправан commit. Ово је најбезбеднија опција за локални рад.

  4. 4

    Вратите индекс и радни директоријум на претходни commit

    За потпуно враћање на претходно стање користите git reset --hard HEAD~1. Упозорење: ова команда уклања последњи commit са тренутне гране и трајно брише све непокомитоване измене у праћеним фајловима. Прво проверите git status и направите резервну грану.

  5. 5

    Вратите се на конкретан commit по хасх-у

    Ако не враћате само последњи commit, наведите хасх: git reset --hard <hash>. Хасх пронађите у git log --oneline. За више commita уназад користите HEAD~3 уместо хасх-а. И овде важи упозорење: прво направите резервну грану и проверите git status, јер ова команда брише непокомитоване измене у праћеним фајловима.

  6. 6

    Поништите commit који је већ гурнут

    Ако је commit већ на удаљеном репозиторијуму, немојте користити reset на дељеној грани. Уместо тога покрените git revert <hash>, који прави нови commit са супротним изменама. Затим гурните са git push.

  7. 7

    Вратите изгубљене commit-e из рефлог-а

    Ако сте случајно извршили reset --hard и изгубили commit, покрените git reflog и пронађите хасх стања пре reset-а. Затим се вратите са git reset --hard <hash>, али прво проверите git status јер и ова команда брише непокомитоване измене у праћеним фајловима. Рефлог чува историју показивача HEAD обично 30 до 90 дана, али не може да врати непокомитоване измене.

  8. 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.

Подели
Нисте нашли решење?AI IT асистент је доступан 24/7. Опишите проблем или пошаљите screenshot грешке и добићете упутство за ваш случај.Питајте AI IT асистента