Git Reset, Revert i Checkout

Git toolbox nudi više jedinstvenih alata za ispravljanje grešaka tokom razvoja. Komande poput git reset, git checkout i git revert omogućavaju vam poništavanje pogrešnih promena u vašem repozitorijumu.

Budući da izvode slične operacije, vrlo je lako ih pomešati. Postoji nekoliko smernica i pravila za to kada se svaka komanda treba, a koja ne sme koristiti. Hajde da pogledamo!

Budite oprezni! Ne možete uvek ponoviti postupak nakon poništavanja. Ovo je jedno od retkih područja u Gitu gde možete izgubiti neki posao ako ga pogrešno uradite.

Poništavanje sa Git komandama

Za početak ćemo razjasniti glavne razlike između ove tri komande.

Checkout:

  • Koristite ovo za premeštanje pokazivača HEAD na određen commit ili prebacivanje između grana.
  • Vraća sve promene sadržaja u promene određenog urezivanja.
  • Ovo neće uneti promene u istoriju commit-ova.
  • Ima potencijal za prepisivanje datoteka u radni direktorijum.

Revert:

  • Koristite ovo da vratite celo radno stablo u poslednje commit-ovano stanje. Ovo će odbaciti commit-ove u privatnoj grani ili odbaciti ne-commit-ovane promene!
  • Trenutno se ukazuju na promene koje su commitčovane na HEAD granu. Menja postojeću istoriju commit-ova.
  • Može se koristiti za uklanjanje fajlova.

Svaka naredba vam omogućava da poništite neku vrstu promene u vašem repozitorijumu, samo se checkout i reset mogu koristiti za manipulaciju commit-ovima ili pojedinačnim datotekama.

Korištenje komandi

Postoji mnogo različitih načina na koje možete opozvati promene, sve zavisi od trenutnog scenarija. Izbor odgovarajuće metode zavisi od toga da li ste promenu uneli greškom ili ne, i da li ste je izvršili, da li ste je delili ili ne.

Poništavanje Public Promena

Scenario: Sliku koja je gurnuta sa git push u grani hitnih ispravki za commit-ove još ne želite da napravite.

Rešenje: Najsigurniji način da se ovo popravi je vraćanje promena jer ne prepisuje istoriju commit-ova.

git checkout hotfix
git revert HEAD~1

Rezultat: Uspešno ste opozvali commit-ovane promene! Sve što je promenjeno u starom commit-u biće vraćeno ovim novim commit-om. Git vas primorava da uradite commit ili stash na sve promene u radnom direktorijumu koje će biti izgubljene tokom checkout-a.

git revert možete smatrati alatom za poništavanje commit-ovanih promena, dok je git reset HEAD namenjen poništavanju ne-commit-ovanih promena.

Poništavanje Lokalnih Promena

Scenario: Počeli ste da radite na nekoj funkciji, ali vam se nije svideo krajnji rezultat. Ove promene nisu podeljene ni sa kim drugim.

Rešenje: Želite da opozovete sve u tim datotekama u prethodno stanje, baš onako kako je izgledalo u poslednjem commit-u.

git checkout file_name.rb

Rezultat: Datoteka file_name.rb je vraćena u stanje ranije poznato Git-u. Imajte na umu da ovo uklanja sve naredne promene datoteke!

Možete koristiti git checkout branch_name da biste se prebacivali između grana. Git vas primorava na commit ili stash na promene u radnom direktorijumu koje će biti izgubljene tokom postupka checkout-a.

Poništavanje Private Promena

Scenario: Lokalno ste izvršili promene u grani hitnih ispravki, ali sve je strašno! Želite da uklonite poslednja dva commita iz trenutne grane.

Rešenje: Reset grane hitne ispravke unazad za dva urezivanja kao da se te promene nikada nisu dogodile.

git checkout hotfix
git reset HEAD~2

Rezultat: Naš git repozitorijum je premotan unazad sve do navedenog commit-a. Ti izostavljeni commit-ovi su sada bez roditelja i biće uklonjeni sledeći put kada Git izvrši sakupljanje smeća. Za sada je njihov sadržaj još uvek na disku.

Možete reći Git-u šta da radi sa svojim indeksom (skupom datoteka koje će postati sledeći commit-ovi) i radnim direktorijumom prilikom izvođenja [git reset](https://kolosek.com/git-commands-tutorial-part2/) pomoću jednog od parametara:

  • --soft: Kaže Gitu da resetuje HEAD na drugi commit, tako da indeks i radni direktorijum neće biti promenjeni na bilo koji način. Sve datoteke promenjene između originalnog HEAD i commit-a biće inscenirane.
  • --mixed: Baš kao i soft, ovo će resetovati HEAD na drugi commit. Takođe će resetovati indeks tako da mu odgovara, dok radni direktorijum neće biti dodirnut. Sve promene ostaće u radnom direktorijumu i izgledaće izmenjene, ali ne i inscenirane.

Glavna razlika između *--mixed* i *--soft* je u tome da li je vaš indeks takođe izmenjen ili ne. Proverite više na git-reset-guide.

  • --hard: Ovo resetuje sve - vraća HEAD na drugi commit, resetuje indeks da bi se podudarao i resetuje radni direktorijum da bi se i on podudarao.

Saveti i trikovi

Obradićemo dve dodatne stvari koje vam mogu dobro doći tokom vaših Git avantura.

Prepravka Poruke Prethodnog Commit-a

Scenario: Svi prave greške pri kucanju prilikom pisanja commit-ova i ovo je potpuno u redu! To se lako može popraviti pre nego što napravite git push.

Rešenje: Samo pokrenite git commit --amend ili git commit --amend -m 'Nova poruka'. Ovo će ažurirati i zameniti najnoviji commit novim.

Redo Posle Undo

Scenario: Napravili ste git reset --hard za neke neželjene promene, ali onda ste shvatili da su vam zapravo potrebne.

Rešenje: git reflog vam dolazi u pomoć! To je neverovatna komanda za oporavak istorije projekta i može da oporavi skoro sve.

Nadam se da će vam ova tri alata pomoći kad god želite da opozovete nedavne promene.

Pretplatite se i pratite predstojeće članke!