Cze 20 2009

git tutorial - część 1 - wstęp

Kategorie: git Programowanie Techblog Matthew @ 22:08:34

W ramach odstresowania się od sesji, krótki tutorial używania gita. :) Czym jest git można sprawdzić tutaj, dlaczego warto go używać, można poczytać tutaj lub posłuchać tutaj (tak, przesłuchałem to X razy i jakoś wyszło podobnie, sio marudy :P). A dzisiaj kilka podstawowych poleceń jak używać gita (jeżeli następnym razem napiszę o gitcie będzie to porównanie szybkości między gitem, hg, bazarem i svnem, z kolorowymi wykresami! Można obstawiać wyniki, a zwycięzca dostanie nagrodę niespodziankę).

Pierwsze co musimy wiedzieć to format poleceń gita:

git add plik

Czyli czym (gitem), co i na końcu komu. Była jeszcze wersja z łączeniem poleceń myślnikiem:

git-add plik

Ale (przynajmniej u mnie) już ona nie występuje. Druga ważna rzecz, to konfiguracja gita. Git do każdego commita dodaje dane osoby, która go zrobiła, więc należy mu je najpierw podać zanim cokolwiek zaczniemy robić:

git config --global user.name "Mateusz Marek"
git config --global user.email matthew@matthew.org.pl

Myślę, że to nie wymaga tłumaczenia, więc teraz przejdziemy do zabawy. Wchodzi do katalogu, który chcemy objąć kontrolą wersji i wydajemy takie oto polecenia:

git init
git add .
git commit -m "komentarz"

Pierwsze polecenie zakłada nam lokalne repozytorium w naszym katalogu. Drugie dodaje wszystkie pliki z bieżącego katalogu do indeksu, natomiast ostanie bierze nasze pliki z indeksu i włącza je do repozytorium (parametr "m" odpowiada za dodanie komentarza do commitu). Teraz możemy sobie napchać do katalogu kolejne pliki, edytować istniejące i lecimy z gitem:

git add plik.c
git commit -a -m "komentarz"

Dodajemy plik.c oraz commitujemy całość do repozytorium. Brak parametru "a" spowodowałby dodanie do repo tylko pliku plik.c. "a" mówi gitowi o automatycznym dodaniu wszystkich plików które zostały zmodyfikowane lub usunięte (dzięki temu nie musimy ponownie wydawać polecenia add dla każdego z nich). Jeżeli teraz byśmy chcieli umieścić nasz kod gdzieś na zewnątrz wydajemy polecenie (tak będzie wyglądało w przypadku GitHuba):

git push git@github.com:login/projekt.git master

Oczywiście adres nie jest najprzyjemniejszy do zapamiętania, więc możemy go sobie skrócić w ten sposób:

git remote add origin git@github.com:login/projekt.git

Origin jest ogólnie przyjętą nazwą dla głównego zdalnego repozytorium. Tak samo jak master jest ogólnie przyjętą nazwą dla głównej gałęzi w dowolnym repo. Jednak co nam po repozytorium które umieściliśmy na serwerze? Trzeba je jeszcze pobrać, a robi się to tak:

git clone git://github.com/login/projekt.git

I dostajemy katalog z naszą lokalna kopią repozytorium. Warto jednak by go od czasu do czasu aktualizować. Robimy to poprzez polecenie pull:

git pull git://github.com/login/projekt.git

Jednak ono ściąga i łączy repozytorium zdalne z naszą lokalną gałęzią bez pytania. Rozwiązaniem tego problemu jest używanie kombinacji fetch + merge:

git fetch origin/master
git merge origin/master

Pierwszym poleceniem pobieramy główną gałąź zdalnego repozytorium do "zdalnej", głównej gałęzi, a drugim łączymy je z gałęzią w której aktualnie się znajdujemy (czyli w master). Po drodze możemy również sprawdzić różnice między obiema gałęziami:

git diff master origin/master

Na razie to tyle, jeżeli będzie zainteresowanie tym tutorialem to następnym razem opowiem o gałęziach w gitcie. Do zobaczenia, wracam do nauki. :)

Komentarze:

  1. teamon:

    Czekam na "git advanced tutorial" ;]

  2. darkjames:

    Popraw orta: s/bierzącego/bieżącego/
    (sorry że nie prywatnie, skasuj komentarz jak poprawisz :))

  3. Matthew:

    @darkjames: dzięki, już poprawione.
    I nie widzę powodu do kasowania. Zdarzają mi się orty i nie ukrywam tego, gorzej jak ktoś chce na siłę być niemiły. :)

  4. Airborn:

    czuje silną potrzebę przeczytania tego raz jeszcze gdy wytrzeźwieję...

    P.S.
    Już druga seria u Ciebie na którą czekam :)

  5. radmen:

    Matthew: warto wspomnieć o różnicy pomiędzy "pull", a "fetch". AFAIR to jest całkiem spora różnica, bo jak w tym pierwszym się pomyli to można zrobić merge całego brancha :)

  6. Matthew:

    @radmen: masz rację, zaraz o tym napiszę. Jak udało mi sie to pominąć ze względu, że origin tak w zasadzie nie jest gałęzią, więc nie da się jej zmergeować.

  7. Matthew:

    Heh... ale gafę walnąłem. Pominąłem tego fetcha bo mi za pierwszym razem z jakiegoś powodu nie zaskoczył (niby repo ściągał, ale merge twierdził że wszystko jest aktualne i nic nie chciał łączyć)... Oby ta sesja się szybko skończyła, bo już zaczynam pisać takie głupoty że wstyd po prostu. ;)

    Jeżeli ktoś może, to niech przejrzy, czy gdzieś nie walnąłem jakiegoś błędu. Szkoda żeby ludzie to czytający później ten błąd powtarzali.

  8. nital:

    werjsa, repoztorium, każego - literówki (co zabawne, tylko jedna wypatrzona, pozostałe dwie znalezione przez wklejenie tekstu arta w pole komentarza i sprawdzenie, co Firefox podkreśli na czerwono - polecam skorzystać ;) )

    a poradnik przydatny, będę czekał na następne części.

  9. Matthew:

    @nital: dzięki, poprawione. Przeważnie wrzucam to do OO.org (bo mi się w Operze nie chce zrobić sprawdzania pisowni), ale jak mówię, ostatnio takie kwiatki robię... Ehh... szkoda że tylko tydzień wakacji będę miał i już do pracy. ;/

  10. adrian5632:

    Nie powinno się pisać 'giTcie', bo prawidłowo w odmianie nie masz nigdzie 'T' :P

  11. Matthew:

    Z tą odmianą tyle różnych wersji słyszałem, że sam nie wiem jak jest poprawnie. Jest to może w jakimś słowniku spisane? Poprawiłbym to wreszcie, tylko nie wiem na co...

  12. 21p0:

    Przydał by się opis Git - konfiguracja serwera ;)

  13. Radarek:

    Ja bym przyczepił się do używania "origin" (które osobiście używam tylko do określenia zdalnego repo) w git diff i git merge.

    Zamiast:
    git merge origin

    Lepiej:
    git merge origin/master

    Bo co "origin" oznacza w tym pierwszym przypadku? A jeśli będę na gałęzi "foo" (która jest gałęzią publiczną i w repo występuje pod referencją origin/foo) to jak zmerguje zmiany z nią? Ano: git merge origin/foo (git merge origin złączyłoby nam z origin/master).

  14. Matthew:

    @Radarek: dzięki, poprawiłem. :)

  15. Smooth Criminal:

    Wyrażam swe zainteresowanie następną częścią ;)

Dodaj komentarz: