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 razveljavitev sprememb, ki ste jih naredili. Bodite previdni, ker nekaterih od teh razveljavitev ne morete vedno povrniti. To je eno izmed redkih področij v Gitu, kjer lahko izgubite nekaj dela, če tega ne naredite pravilno.

Ena izmed pogostih razveljavitev se zgodi, ko prezgodaj potrdite in mogoče pozabite dodati nekaj datotek, ali pa naredite zmedo s svojimi sporočili potrditev. Če želite ponovno narediti določeno potrditev, naredite dodatne spremembe, ki ste jih pozabili, nato jih dajte v področje priprave in jih ponovno potrdite z možnostjo --amend:

$ git commit --amend

Ta ukaz sprejme vaše področje priprave in ga uporabi za potrditev. Če niste naredili sprememb od svojega zadnjega potrjevanja (na primer, ta ukaz ste pognali takoj za prejšnjo potrditvijo), potem bo vaš posnetek videti popolnoma enako in vse, kar boste spremenili, je vaše sporočilo potrditve.

Zažene se isti urejevalnik sporočila potrditve, vendar pa že vsebuje sporočilo vaše prejšnje potrditve. Sporočilo lahko uredite enako kot vedno, vendar bo prepisalo vašo prejšnjo potrditev.

Kot primer, če naredite potrditev in nato ugotovite, da ste v področje priprave pozabili dati spremembe datoteke, ki jo želite dodati tej potrditvi, lahko naredite nekaj takega:

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

Dobili boste eno potrditev — druga potrditev zamenja rezultate prve.

Opomba

Pomembno je razumeti, da ko spreminjate zadnjo potrditev, je ne popravljate, ampak jo popolnoma zamenjate z novo in izboljšano potrditvijo, ki staro potisne iz poti in postavi novo potrditev na njeno mesto. Praktično, kot da se prejšnja potrditev nikoli ni zgodila in ne bo se prikazala v zgodovini vašega repozitorija.

Očitna korist spreminjanja potrditev je, da lahko naredite manjše izboljšave zadnje potrditve, ne da bi vaša zgodovina repozitorija postala razmetana s sporočili potrditev v obliki »Ups, pozabil sem dodati datoteko« ali »Zaboga, popravljam tipkarsko napako v zadnji potrditvi«.

Opomba

Spreminjajte samo potrditve, ki so še vedno lokalne in še niso bile nikamor potisnjene. Spreminjanje že prej potisnjenih potrditev in prisilno potiskanje veje bo povzročilo težave za vaše sodelavce. Če želite izvedeti več o tem, kaj se zgodi, ko to storite, in kako lahko to popravite, če ste na sprejemni strani, preberite Nevarnosti ponovnega baziranja.

Povrnitev datoteke iz področja priprave

Naslednja razdelka demonstrirata, kako delati s spremembami vašega področja priprave in delovnega direktorija. Dober del je, da vas ukaz, ki ste ga uporabili za določanje stanja teh dveh področij, tudi opominja, kako razveljaviti spremembe na njih. Na primer, recimo, da ste spremenili dve datoteki in jih želite potrditi kot dve ločeni spremembi, vendar po nesreči vpišete git add * in daste obe v pripravo. Kako lahko povrnete eno izmed dveh iz področja priprave? 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

Ravno pod besedilom »Changes to be committed«, pravi, da uporabite git reset HEAD <file>…​ za povrnitev iz področja priprave. Torej uporabimo ta nasvet za povrnitev datoteke CONTRIBUTING.md iz priprave:

$ 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 izven področja priprave.

Opomba

Velja, da je ukaz git reset lahko nevaren, posebej, če ga pokličete z značko --hard. Vendar v primeru, opisanem zgoraj, je datoteka v vašem delovnem direktoriju nedotaknjena, torej je relativno varen.

Za sedaj je ta čarobni priklic vse, kar morate vedeti o ukazu git reset. V večje podrobnosti, o tem kaj reset naredi in kako ga osvojiti, da dela res zanimive stvari, bomo šli v razdelku Demistifikacija ponastavitve.

Povrnitev spremenjene datoteke

Kaj če ugotovite, da ne želite obdržati sprememb v datoteki CONTRIBUTING.md? Kako jo lahko enostavno razveljavite — povrnete nazaj v stanje, kakor je bila videti, ko ste zadnjič naredili potrditev (ali prvotno klonirali, ali kakorkoli ste jo dobili v svoj delovni direktorij)? Na srečo vam git status prav tako pove, kako to narediti. V izpisu zadnjega primera je področje izven priprave videti 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

Precej jasno vam pove, 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.

Pomembno

Pomembno je razumeti, da je git checkout -- <file> nevaren ukaz. Katerekoli spremembe, ki jih naredite na tej datoteki, izginejo — Git je ravnokar zamenjal to datoteko z zadnjo različico v pripravi ali tisto, ki je bila potrjena. Nikoli ne uporabite tega ukaza, razen če točno veste, da ne želite tistih neshranjenih lokalnih sprememb.

Če bi radi ohranili spremembe, ki ste jih naredili na tej datoteki, vendar se je morate za zdaj še vedno znebiti, bomo šli skozi shranjevanje na varno in razvejanje v Veje Git; to so v splošnem boljši načini za to.

Pomnite, da karkoli je potrjeno v Git, je moč skoraj vedno povrniti. Celo potrditve, ki so bile na vejah, ki so bile izbrisane, ali potrditve, ki so bile prepisane s potrjevanjem --amend, se lahko povrne (glejte razdelek Obnovitev podatkov za povrnitev podatkov). Vendar česarkoli, kar izgubite in kar ni bilo nikoli potrjeno, verjetno nikoli ne boste več videli.

Razveljavljanje stvari z git restore

Git različica 2.23.0 je predstavila nov ukaz: git restore. To je v bistvu alternativa za git reset, ki smo ga ravnokar predelali. Od različice Git 2.23.0 naprej bo Git uporabljal git restore namesto git reset za številne operacije razveljavitev.

Ponovimo svoje korake in razveljavimo stvari z git restore namesto git reset.

Preklic datoteke v pripravi z ukazom git restore

Naslednja razdelka prikazujeta, kako delati s spremembami v vašem področju priprave in delovnem direktoriju z git restore. Dober del je, da vas ukaz, ki ga uporabljate za določanje stanja teh dveh področij, hkrati tudi opominja, kako razveljaviti spremembe. Na primer, recimo, da ste spremenili dve datoteki in ju želite potrditi kot dve ločeni spremembi, vendar napačno vnesete git add * in obe daste v področje priprave. Kako lahko razveljavite eno od teh dveh datotek? Ukaz git status vas opomni:

$ git add *
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	modified:   CONTRIBUTING.md
	renamed:    README.md -> README

Takoj pod besedilom »Changes to be committed« piše, da uporabite git restore --staged <file>…​ za razveljavitev področja priprave. Zato uporabimo ta nasvet, da razveljavimo datoteko CONTRIBUTING.md:

$ git restore --staged CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	renamed:    README.md -> README

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

Datoteka CONTRIBUTING.md je spremenjena, vendar zopet izven področja priprave.

Razveljavljanje spremenjene datoteke z ukazom git restore

Kaj pa, če ugotovite, da ne želite obdržati sprememb na datoteki CONTRIBUTING.md? Kako lahko to enostavno razveljavite — vrnete nazaj, kakor je bilo nazadnje potrjeno (ali sprva klonirano ali na kakšen drug način pridobljeno v delovni direktorij)? Na srečo vam git status prav tako pove, kako to storiti. V izpisu zadnjega primera je področje izven priprave videti takole:

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

Jasno vam pove, kako zavreči spremembe, ki ste jih naredili. Naredimo to, kar pravi:

$ git restore CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	renamed:    README.md -> README
Pomembno

Pomembno je razumeti, da je git restore <file> nevaren ukaz. Vse lokalne spremembe na tej datoteki so izbrisane — Git je preprosto nadomestil to datoteko z zadnjo različico, ki je bila v pripravi ali potrjena. Tega ukaza nikoli ne uporabljajte, razen če povsem veste, da ne želite teh neshranjenih lokalnih sprememb.

scroll-to-top