Pirmasis mūsų pakeitimas
(šis puslapis - viena iš LithuanianTutorial įvado dalių. Ankstesnė dalis - LithuanianTutorialHistory, kita dalis - LithuanianTutorialShareChange)
Esame savo sukurtoje mano-hello saugykloje.
Viena iš nerašytų efektyvaus darbo su Mercurial taisyklių - tai izoliuoti susijusius pakeitimus, juos perkeliant į atskirą saugyklą (Repository). Taip nesusijęs kodas neįsimaišo tarp mums rūpimų pakeitimų, todėl yra daug lengviau po vieną testuoti individualias atlikto darbo dalis. Taigi pradėkite laikydamiesi šio darbo su Mercurial modelio.
Mūsų labai paprastas tikslas yra pakeisti programą "hello-world", kad ji išvestų papildomą eilutę. Visų pirma, sukuriame naują saugyklą, pavadintą mano-hello-nauja-eilute, šiam mažam projektui tiesiog klonuodami (clone) mūsų dabartinę saugyklą mano-hello (Mercurial 1.0).
$ hg clone mano-hello mano-hello-nauja-eilute updating working directory 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
Atkreipkite dėmesį, kad savo naujai saugyklai mes suteikėme pavadinimą, apibūdinantį jos paskirtį. Kadangi saugyklų klonavimas Mercurial sistemoje yra pigus kompiuterio resursų prasme, pas mus greitai atsiras daug šiek tiek tarpusavyje besiskiriančių saugyklų. Jeigu šios naujos saugykloms nesuteiktume jų turinį aprašančių vardų, tai greitai pasimestume jų gausoje ir negalėtume atskirti vienos nuo kitos.
Dabar naujoje saugykloje atliksime pirmąjį pakeitimą. Pereikime į saugyklos darbinį katalogą (WorkingDirectory) - tai paprasčiausiai tas katalogas, kuriame yra visi failai - ir modifikuokime programos kodą su tekstiniu redaktoriumi. Visą tai galime atlikti tame pačiame konsolės lange, naudodami edit Windows sistemoje arba vi Unix šeimos sistemose. Be abejo, saugyklos katalogą galime pasiekti ir grafinės sąsajos pagalba (pvz.: Windows Explorer), o programos failą atsidaryti su mums įprastu tekstiniu redaktoriumi (pvz.: Notepad) arba specialiu tos programavimo kalbos redaktoriumi:
$ cd mano-hello-nauja-eilute $ edit hello.c
hello.c failo turinys iš pradžių atrodo taip:
/*
* hello.c
*
* Placed in the public domain by Bryan O'Sullivan
*
* This program is not covered by patents in the United States or other
* countries.
*/
#include <stdio.h>
int main(int argc, char **argv)
{
printf("hello, world!\n");
return 0;
}
Pakeiskime funkciją main, kad ji spausdintų vieną papildomą eilutę:
(...)
int main(int argc, char **argv)
{
printf("hello, world!\n");
printf("Man patinka naudotis Mercurial!\n");
return 0;
}
Atlikę ir išsaugoję pakietimus, tiesiog uždarome naudotą tekstinį redaktorių. Štai ir viskas. Dabar jau esame pasiruošę sukurti savo pakeitimų rinkinį (ChangeSet).
O jeigu mums kas nors sutrukdė ir mes pamiršome, kokie pakeitimai sudarys pakeitimų rinkinį, kai jį sukursime? Tokiu atveju naudojame status komandą.
$ hg status M hello.c
Išvesta informacija nėra vaizdi, tačiau raidė M paprasčiausiai rodo, kad failas hello.c buvo modifikuotas ir bus įtrauktas į pakeitimų rinkinį.
Vietoj hg status mes galime parašyti tiesiog hg st, nes Mercurial leidžia trumpinti komandų pavadinimus, jeigu įvesta simbolių seka netampa dviprasmiška.
$ hg st M hello.c
Taip pat galime pamatyti konkrečius programos faile padarytus pakeitimus, naudodami diff komandą:
$ hg diff diff -r 82e55d328c8c hello.c --- a/hello.c Fri Aug 26 01:21:28 2005 -0700 +++ b/hello.c Mon May 05 00:27:56 2008 +0200 @@ -12,5 +12,6 @@ int main(int argc, char **argv) { printf("hello, world!\n"); + printf("Man patinka naudotis Mercurial!\n"); return 0; }
Jeigu norime panaikinti padarytus pakeitimus ir pradėti iš naujo, galime naudoti revert komandą, kuri hello.c failą atstatytų į pradinę, nemodifikuotą būseną (papildomas --all parametras į pradinę būseną grąžintų visus failus). Prieš naudodami šią komandą, tiesiog įsitikinkite, kad būtent tai ir norite padaryti.
$ hg revert hello.c
revert modifikuotą failą hello.c pervadina į hello.c.orig ir atkuria pradinį nemodifikuotą hello.c.
status dabar rodo, jog hello.c.orig failas nėra stebimas (tai žymima "?" simboliu).
$ hg st ? hello.c.orig
Jeigu vėl persigalvojame ir norime pakartoti pašalintą pakeitimą, tiesiog ištriname nemodifikuotą hello.c failą ir modifikuotą hello.c.orig pervadiname atgal į hello.c.
$ rm hello.c $ mv hello.c.orig hello.c $ hg st M hello.c
Pakeitimų rinkinio sukūrimas vadinamas jo patvirtinimu. Mes atliekame patvirtinimą, naudodami commit komandą. commit turi gražų trumpą sinonimą ci, kurį taip pat galime naudoti:
$ hg ci
Ši komanda atidarys teksto redaktoriaus langą, kuriame jau bus įrašytos kelios eilutės.
Svarbu: Numatytasis teksto redaktorius Windows sistmoje yra Notepad, o Unix šeimos sistemose - vi (tai galima pakeisti naudojant EDITOR arba HGEDITOR aplinkos kintamuosius).
HG: Enter commit message. Lines beginning with 'HG:' are removed. HG: -- HG: user: mpm@selenic.com HG: branch 'default' HG: changed hello.c
Pirma eilutė yra tuščia, o tolimesnės eilutės aprašo naudotoją, šakos pavadinimą ir failus, kurie bus įtraukti į pakeitimų rinkinį.
Numatytasis šakos pavadinimas yra "default" (žr. NamedBranches). Numatytoji "user" (naudotojo) reikšmė paimama iš ~/.hgrc konfiguracijos failo "ui" skilties, "username" eilutės (žr. hgrc(5)) . Kitą naudotojo vardą taip pat galima įrašyti ir naudojant parametrą -u po komandų commit bei ci.
Norėdami patvirtinti pakeitimų rinkinį, turime nurodyti jo paskirtį (žr. ChangeSetComments). Taigi parašykime ką nors tokio:
Mokausi naudotis Mercurial ir man gerai sekasi HG: Enter commit message. Lines beginning with 'HG:' are removed. HG: -- HG: user: mpm@selenic.com HG: branch 'default' HG: changed hello.c
Dabar išsaugome tekstą ir uždarome redaktorių. Jeigu viskas pavyko, tuomet commit komanda baigs darbą ir neišves jokio pranešimo.
Jeigu uždarysite radaktorių, neišsaugoję naujo teksto, arba nieko jame neįrašysite, tada commit atšauks šią operaciją - taigi prieš patvirtindami pakeitimų rinkinį dar galite persigalvoti.
Pažiūrėkime, ką dabar mums parodys status komanda:
$ hg st
Ogi nieko! Mūsų padarytas pakeitimas buvo įtrauktas į pakeitimų rinkinį, todėl šiuo metu daugiau nebėra modifikuotų failų, kuriuos reikėtų įtraukti į rinkinį. Mūsų saugyklos viršūnė dabar sutampa su darbinio katalogo turiniu.
parents komanda mums parodo, kad saugyklos darbinis katalogas dabar yra sinchronizuotas su naujai patvirtintu pakeitimų rinkiniu (čia turime tik vieną pakeitimų rinkinio tėvą, nes kątik buvo patvirtintas naujas pakeitimų rinkinys. Du tėvai atsiranda po pakeitimų rinkinių suliejimo - TutorialMerge):
$ hg parents changeset: 2:86794f718fb1 tag: tip user: mpm@selenic.com date: Mon May 05 01:20:46 2008 +0200 summary: Mokausi naudotis Mercurial ir man gerai sekasi
Na va, mes patvirtinome naują pakeitimų rinkinį.
Dabar galime panagrinėti savo darbo pakeitimų istoriją:
$ hg log changeset: 2:86794f718fb1 tag: tip user: mpm@selenic.com date: Mon May 05 01:20:46 2008 +0200 summary: Mokausi naudotis Mercurial ir man gerai sekasi (...)
Svarbu: Jūsų įvestas naudotojas, data ir pakeitimų rinkinio ID (ChangeSetID) aišku bus kitokie.
Kaip jau išsiaiškinome anksčiau (LithuanianTutorialClone), naujas pakeitimų rinkinys egzistuoja tik šioje saugykloje. Tai labai svarbus Mercurial sistemos veikimo principas.
Toliau mokysimės, kaip pakeitimus iš vienos saugyklos galima pervesti į kitą - LithuanianTutorialShareChange.