Git
Chapters ▾ 2nd Edition

2.4 Osnove Git - Razveljavljanje stvari

Razveljavljanje stvari

V katerikoli fazi boste morda želeli nekaj razveljaviti. Tu bomo pregledali nekaj osnovnih orodij za razveljavljanje sprememb, ki ste jih naredili. Bodite previdni, ker ne morete vedno razveljaviti nekaterih od teh razveljavitev. To je eno izmed področij v Git-u, kjer lahko izgubite nekaj dela, če to naredite nepravilno.

Ena izmed pogostih razveljavitev se zgodi, ko prezgodaj pošljete in možno pozabite dodati nekaj datotek ali naredite zmedo z vašimi sporočili pošiljanja. Če želite ponovno preizkusiti to pošiljanje, lahko poženete ukaz z opcijo --amend:

$ git commit --amend

Ta ukaz vzame vašo področje vmesne faze in ga uporabi za pošiljanje. Če niste naredili sprememb od vašega zadnjega pošiljanja (na primer ste pognali ta ukaz takoj za prejšnjim pošiljanjem), potem bo vaš posnetek izgledal točno enako in vse, kar boste spremenili je vaše sporočilo pošiljanja.

Zažene se isti urejevalnik pošiljanja sporočila, vendar že vsebuje sporočilo vašega prejšnjega pošiljanja. Sporočilo lahko uredite enako kot vedno, vendar prepiše vaše prejšnje pošiljanje.

Kot primer, če pošljete in nato ugotovite, da ste pozabili dati spremembe v vmesno fazo v datoteki, katero želite dodati temu pošiljanju, lahko naredite nekaj takega:

$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend

Končate z enim ukazom - drugo pošiljanje zamenja rezultate prvega.

Povrnitev datoteke iz vmesne faze

Naslednji sekciji demonstrirata, kako prerekati vaše področje vmesne faze in spremembe delovneg direktorija. Lep del je, da ukazi, ki ste jih uporabili za določanje stanja teh dveh področij vas tudi spominjajo, kako razveljaviti spremembe na njih. Na primer, recimo, da ste spremenili dve datoteki in jih želite poslati kot dve ločeni spremembi, vendar po nesreči vpišete git add * in date obe v vmesno fazo. Kako lahko povrnete eno izmed dveh iz vmesne faze? Ukaz git status vas opomni:

$ 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

Točno pod tekstom “Changes to be committed”, pove, da uporabite git reset HEAD <file>... za povrnitev iz vmesne faze. Torej uporabimo ta nasvet za povrnitev datoteke CONTRIBuTING.md iz vmesne faze:

$ 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

Ukaz je nekoliko čuden, vendar deluje. Datoteka CONTRIBUTING.md je spremenjena vendar ponovno ni v vmesni fazi.

Note

Medtem ko git reset je lahko nevaren ukaz, če ga pokličete z --hard v tem primeru datoteka v vašem delovnem direktoriju ni dotaknjena. Klicanje git reset brez opcije ni nevarno - se samo dotakne vašega področja vmesne faze.

Za sedaj ta čarobna molitev je vse, kar potrebujete vedeti o ukazu git reset. Šli bomo v veliko večje podrobnosti o tem kaj reset naredi in kako ga osvojiti, da dela res zanimive stvari v Reset Demystified.

Povrnitev sprememb spremenjene datoteke

Kaj če ugotovite, da ne želite obdržati sprememb v datoteki CONTRIBUTING.md? Kako jo lahko enostavno razveljavite - povrnete nazaj v stanje, kako je izgledala, ko ste zadnjič poslali (ali začetno klonirali ali kakorkoli ste jo dobili v vaš delovni direktorij)? Na srečo vam prav tako git status pove, kako to narediti. V izpisu zadnjega primera področje pred vmesno fazo izgleda takole:

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

Pove vam precej jasno, kako zavreči spremembe, ki ste jih naredili. Naredimo, kar pravi:

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

    renamed:    README.md -> README

Vidite lahko, da so bile spremembe povrnjene.

Important

Pomembno je razumeti, da je git checkout -- [file] nevaren ukaz. Katerekoli spremembe, ki jih naredite tej datoteki izginejo – samo kopirali ste drugo datoteko preko nje. Nikoli ne uporabite tega ukaza, razen če absolutno veste, da ne želite datoteke.

Če radi sledite spremembam, ki ste jih naredili na tej datoteki, vendar jo morate še vedno spraviti iz poti za sedaj, bomo šli skozi skrito shranjevanje in razvejanje v Veje Git; to so splošno res boljši načini za to.

Pomnite, da karkoli je poslano v Git je lahko skoraj vedno povrnjeno. Celo pošiljanja, ki so bila na vejah, ki so bile izbrisane ali pošiljanja, ki so bila prepisana z opcijo pošiljanja --amend, so lahko povrnjena (glejte Data Recovery za povrnitev podatkov). Vendar karkoli, kar izgubite in ni bilo nikoli poslano, verjetno nikoli ne boste več videli.