Git
Chapters ▾ 2nd Edition

2.4 Osnove Gita - Opovrgavanje

Opovrgavanje

U bilo kom trenutku, možda poželite da opovrgnete (undo) nešto što ste uradili. Ovde ćemo baciti pogled na nekoliko osnovnih alata za opovrgavanje promena. Ovo je jedna od retkih oblasti u Gitu gde možete izgubiti neke podatke ako nešto uradite pogrešno.

Česta stvar tokom koje se javlja potreba za opovrgavanjem je situacija kada komitujete prerano i možda zaboravite neke fajlove, ili napravite grešku u komit poruci. Ako želite da ponovo probate taj komit, možete da izvršite komit sa opcijom --amend:

$ git commit --amend

Ova komanda uzima vaš stejdž i koristi ga za komit. Ako niste napravili nikakve izmene od poslednjeg komita (na primer, pokrenete ovu komandu odmah nakon poslednjeg komita), onda će snimak izgledati potpuno isto, i sve što ćete promeniti je komit poruka.

Isti editor za komit poruku se pojavljuje, ali se u njemu već nalazi ukucana poruka iz prethodnog komita. Možete editovati poruku kao i uvek, ali time brišete prethodni komit.

Kao primer, ako komitujete i onda shvatite da ste zaboravili da stejdžujete promene u fajlu koji ste želeli da dodate ovom komitu, možete da uradite nešto ovako:

$ git commit -m 'initial commit'
$ git add <zaboravljeni-fajl>
$ git commit --amend

Na ovaj način na kraju dobijate samo jedan komit — drugi komit preklapa rezultat prvog.

Uklanjanje fajla sa stejdža

Sledeća dva odeljka demonstriraju kako da prepletete stejdž sa promenama u radnom direktorijumu. Dobar deo je to što vas komanda koju koristite da bi odredili stanje ove dve oblasti takođe podseća i na način za opovrgavanje promena koje napravite. Na primer, recimo da ste promenili dva fajla i da želite da ih komitujete kroz dve posebne promene, ali ste slučajno ukucali git add * i time ih oba dodali na stejdž. Kako da jedan od njih sklonite sa stejdža? Komanda git status vas podseća na to:

$ git add *
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    renamed:    README.md -> README
    modified:   CONTRIBUTING.md

Odmah ispod dela "Changes to be committed" piše da treba da koristite git reset HEAD <file>... da biste fajl skinuli sa stejdža. Taj savet ćemo iskoristiti da uradimo upravo to:

$ git reset HEAD CONTRIBUTING.md
Unstaged changes after reset:
M	CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    renamed:    README.md -> README

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   CONTRIBUTING.md

Ova komanda je pomalo čudna, ali obavlja posao. Fajl CONTRIBUTING.md je modifikovan ali više nije na stejdžu.

Note

Mada git reset može da bude opasan ako ga pozovete sa --hard, u ovom slučaju se fajl u radnom direktorijumu ne dira. Zvanje git reset bez ikakve opcije nikad nije opasno — radi samo nad stejdžom.

Zasad je ova čarobna reč sve što je potrebno da znate o git reset komandi. Mnogo detaljnije ćemo ispitati šta tačno radi reset u Reset Demystified kada ćemo i pogledati kako da je iskoristimo da bismo uradili neke veoma zanimljive stvari.

Razmodifikovanje modifikovanog fajla

Šta ako shvatite da ne želite da zadržite izmene u fajlu CONTRIBUTING.md? Kako da ga jednostavno razmodifikujete — da ga vratite na stanje u kakvom je bio kada ste poslednji put načinili komit (ili inicijalno klonirali, ili kako god ga dovukli u radni direktorijum)? Srećom, git status vam govori kako i to da uradite. U prošlom primeru izlaza, fajlovi koji nisu bili na stejdžu bili su predstavljeni ovako:

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   CONTRIBUTING.md

Kaže vam kako eksplicitno da odbacite promene koje ste napravili. Hajde da uradimo šta nam savetuje.

$ git checkout -- CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    renamed:    README.md -> README

Možete da proverite da su se promene vratile na staro.

Important

Važno je da razumete da je git checkout -- [fajl] opasna komanda. Svaka promena koju ste napravili u tom fajlu je nestala — Git je upravo prekopirao drugi fajl preko njega. Nikada nemojte da koristite ovu komandu osim ako niste stoprocentno sigurni da vam promene koje ste napravili više ne trebaju.

Ako biste želeli da zadržite promene koje ste napravili u fajlu ali i ipak želite da se trenutno vratite na staro, saznaćete kako da uradite to pomoću skrivanja (stash) i grananja (branching) u Grananje u Gitu; to su obično bolji načini za rad.

Upamtite, sve što je komitovano u Gitu se skoro uvek može povratiti. Čak i komitovi koji su bili na granama koje su obrisane ili komitovi koji su prepisani koristeći --amend komit mogu da se povrate (vidite Data Recovery za obnovu podataka). Ipak, sve što izgubite a nikad nije bilo komitovano verovatno više nikad nećete videti.