Get the code: LearnGit.txt
Git je distribuovaný systém riadenia revízií a správy zdrojového kódu.
Funguje robením "snímkov" tvojho projektu, s ktorými ďalej pracuje na revíziach a správe zdrojových kódov.
Riadenie revízií je systém, ktorý postupom času zaznamenáva zmeny súboru (súborov).
Skupina súborov, adresárov, minulých záznamov, commitov (konkrétnych revízií) a odkazy na aktuálu vetvu (HEADs). Predstav si ho ako údajovú štruktúru, kde ti každý "prvok" zdrojového kódu poskytne (okrem iného) prístup k minulým revíziam.
Git repozitár sa skladá z .git adresára a pracovného stromu
.git adresár obsahuje všetky konfigurácie, logy, vetvy, odkaz na aktuálnu vetvu (HEAD) a ostatné. Detailný zoznam.
Toto sú adresáre a súbory v tvojom repozitári. Tiež sa tomu hovorí pracovný adresár.
Index je také odpočívadlo Gitu. Je to v podstate vrstva, ktorá oddeľuje pracovný strom od Git repozitára. Toto dáva vývojárom viac možností nad tým, čo do repozitára naozaj pošlú.
Commit je "snímka" zmien, či manipulácií s tvojím Pracovným Stromom. Ak si napríklad pridal 5 súborov a odstránil 2 ďalšie, tieto zmeny budú zachytené v commite. Ten môže (ale nemusí) byť zverejnený (pushed) do iných repozitárov.
Vetva je ukazateľ na posledný vykonaný commit. Po ďalších commitnutiach sa ukazateľ bude automaticky posúvať na ten najnovší.
Tag je označenie špecifického bodu v minulosti. Typicky sa používa na značenie vydaných verzií (v1.0, atď).
HEAD je ukazateľ na aktuálnu vetvu. Repozitár má len 1 aktívny HEAD. head je ukazateľ, ktorý môže ukazovať na akýkoľvek commit. Repozitár môže mať niekoľko headov.
Vytvorí prázdny Git repozitár. Jeho nastavenia, uložené informácie a mnoho iného sú uložené v adresári (zložke) s názvom ".git".
$ git init
Konfiguruj nastavenia. Či už pre repozitár, samotný systém, alebo globálne konfigurácie (súbor pre globálny config je ~/.gitconfig
).
# Zobraz a Nastav Základné Konfiguračné Premenné (Globálne)
$ git config --global user.email "Mô[email protected]"
$ git config --global user.name "Moje Meno "
Prečítaj si viac o git configu.
Máš tiež prístup k extrémne detailnej dokumentácií pre každý príkaz (po anglicky). Hodí sa, ak potrebuješ pripomenúť semantiku.
# Rýchlo zobraz všetky dostupné príkazy
$ git help
# Zobraz všetky dostupné príkazy
$ git help -a
# Zobraz konkrétnu pomoc - použivateľský manuál
# git help <príkaz_tu>
$ git help add
$ git help commit
$ git help init
# alebo git <príkaz_tu> --help
$ git add --help
$ git commit --help
$ git init --help
Zámerne prestaneš sledovať súbor(y) a zložky. Typicky sa používa pre súkromné a dočasné súbory, ktoré by boli inak zdieľané v repozitári.
$ echo "temp/" >> .gitignore
$ echo "private_key" >> .gitignore
Na zobrazenie rozdielov medzi indexovými súbormi (tvoj pracovný repozitár) a aktuálnym HEAD commitom.
# Zobrazí vetvu, nesledované súbory, zmeny a ostatné rozdiely
$ git status
# Zistí iné vychytávky o git statuse
$ git help status
Pripraví súbory na commit pridaním do tzv. staging indexu. Ak ich nepridáš pomocou git add
do staging indexu, nebudú zahrnuté v commitoch!
# pridá súbor z tvojho pracovného adresára
$ git add HelloWorld.java
# pridá súbor z iného adresára
$ git add /cesta/k/súboru/HelloWorld.c
# Môžeš použiť regulárne výrazy!
$ git add ./*.java
Tento príkaz len pridáva súbory do staging indexu, necommituje ich do repozitára.
Spravuj svoje vetvy. Môžeš ich pomocou tohto príkazu zobraziť, meniť, vytvoriť, či zmazať.
# zobraz existujúce vetvy a vzdialené repozitáre
$ git branch -a
# vytvor novú vetvu
$ git branch myNewBranch
# vymaž vetvu
$ git branch -d myBranch
# premenuj vetvu
# git branch -m <starémeno> <novémeno>
$ git branch -m mojaStaraVetva mojaNovaVetva
# zmeň opis vetvy
$ git branch myBranchName --edit-description
Spravuj svoje tagy
# Zobraz tagy
$ git tag
# Vytvor tag so správou
# -m špecifikuje správu, ktorá bude s tagom uložená.
# Ak nešpeficikuješ správu pri tagu so správou,
# Git spustí tvoj editor, aby si ju napísal.
$ git tag -a v2.0 -m 'moja verzia 2.0'
# Ukáž informácie o tagu
# Zobrazí zadané informácie, dátum tagnutia commitu
# a správu pred zobrazením informácií o commite.
$ git show v2.0
# Zverejní (pushne) jediný tag do vzdialeného repozitára
$ git push origin v2.0
# Zverejní viacero tagov do vzdialeného repozitára
$ git push origin --tags
Aktualizuje všetky súbory v pracovnom strome, aby odpovedali verzií v indexe, alebo v inom strome.
# Aktualizuj strom, aby odpovedal (predvolene)
# hlavnej vetve repozitáru (master branch)
$ git checkout
# Aktualizuj strom, aby odpovedal konrkétnej vetve
$ git checkout menoVetvy
# Vytvor novú vetvu & prepni sa na ňu
# ekvivalentný príkaz: "git branch <meno>; git checkout <meno>"
$ git checkout -b nováVetva
"Naklonuje", alebo vytvorí kópiu existujúceho repozitára do nového adresára. Tiež pridá špeciálne ďiaľkovo-monitorujúce vetvy (remote-tracking branches), ktoré ti umožnia zverejňovať do vzdialených vetiev.
# Naklonuj learnxinyminutes-docs
$ git clone https://github.com/adambard/learnxinyminutes-docs.git
# povrchné klonovanie - rýchlejšie, uloží iba najnovšiu snímku
$ git clone --depth 1 https://github.com/adambard/learnxinyminutes-docs.git
# naklonuj iba konkrétnu vetvu
$ git clone -b master-cn https://github.com/adambard/learnxinyminutes-docs.git --single-branch
Uloží aktuálny obsah indexu v novom "commite". Ten obsahuje vytvorené zmeny a s nimi súvisiace správy vytvorené použivateľom.
# commitni so správou
$ git commit -m "Pridal som multiplyNumbers() funkciu do HelloWorld.c"
# automaticky pridaj zmenené a vymazané súbory do staging indexu, potom ich commitni.
$ git commit -a -m "Zmenil som foo.php a vymazal bar.php"
# zmeň posledný commit (toto nahradí predchádzajúci commit novým)
$ git commit --amend -m "Správna správa"
Ukáže rozdiel medzi súborom v pracovnom repozitári, indexe a commitoch.
# Ukáž rozdiel medzi pracovným repozitárom a indexom.
$ git diff
# Ukáž rozdiely medzi indexom a najnovším commitom.
$ git diff --cached
# Ukáž rozdiely medzi pracovným adresárom a najnovším commitom.
$ git diff HEAD
Umožní ti rýchlo prehľadávať repozitár.
Možná konfigurácia:
# Nastav, aby sa vo výsledkoch vyhľadávania zobrazovalo číslo riadku
$ git config --global grep.lineNumber true
# Urob výsledky vyhľadávania čitateľnejšie, vrátane zoskupovania
$ git config --global alias.g "grep --break --heading --line-number"
# Vďaka Travisovi Jefferymu za túto sekciu
# Hľadaj "názovPremennej" vo všetkých java súboroch
$ git grep 'názovPremennej' -- '*.java'
# Hľadaj riadok, ktorý obsahuje "názovPoľa" a "add" alebo "remove"
$ git grep -e 'arrayListName' --and \( -e add -e remove \)
Google je tvoj kamarát; pre viac príkladov skoč na Git Grep Ninja
Zobral commity do repozitára.
# Zobraz všetky commity
$ git log
# Zobraz iba správy a referencie commitov
$ git log --oneline
# Zobraz zlúčené (merged) commity
$ git log --merges
# Zobraz všetky commity vo forme ASCII grafu
$ git log --graph
"Zlúč" zmeny externých commitov do aktuálnej vetvy.
# Zlúč vybranú vetvu do aktuálnej.
$ git merge názovVetvy
# Vždy vytvor zlučovací commit
$ git merge --no-ff názovVetvy
Premenuj, alebo presuň súbor
# Premenuj súbor
$ git mv HelloWorld.c HelloNewWorld.c
# Presuň súbor
$ git mv HelloWorld.c ./nová/cesta/HelloWorld.c
# "Nasilu" premenuj, alebo presuň
# "existujúciSúbor" už v adresári existuje, bude prepísaný
$ git mv -f môjSúbor existujúciSúbor
Uloží obsah repozitára a zlúči ho s inou vetvou.
# Aktualizuje tvoj lokálny repozitár zlúčením nových zmien
# zo vzdialených "origin" a "master" vetiev.
# git pull <alias-vzdialeného-repo> <vetva>
$ git pull origin master
# Predvolene, git pull aktualizuje tvoju aktuálnu vetvu
# zlúčením nových zmien zo vzdialenej vetvy
$ git pull
# Zlúč zmeny zo vzdialenej vetvy a presuň vetvu do nového základného commitu (rebase)
# vetva commitne na tvoj lokálny repozitár, ekvivalentný príkaz: "git pull <alias-vzdialeného-repo> <vrstva>, git rebase <branch>"
$ git pull origin master --rebase
Zverejní a zlúči zmeny z lokálnej do vzdialenej vetvy.
# Zverejni a zlúč zmeny z lokálneho repozitára do
# vzdialených vetiev s názvom "origin" a "master".
# git push <vzdialené> <vetvy>
$ git push origin master
# Predvolene git zverejní a zlúči zmeny z
# aktuálnej vetvy do vzdialenej vetvy s ňou spojenej
$ git push
# Na spojenie lokálnej vetvy so vzdialenou pridaj -u:
$ git push -u origin master
# Kedykoľvek budeš chcieť zverejniť z rovnakej lokálnej vetvy, použi príkaz:
$ git push
Umožní ti opustiť chaotický stav pracovného adresára a uloží ho na zásobník nedokončených zmien, ku ktorým sa môžeš kedykoľvek vrátiť.
Povedzme, že si urobil nejaké zmeny vo svojom git repozitári, ale teraz potrebuješ pullnúť zo vzdialenej repo. Keďže máš necommitnuté zmeny, príkaz git pull
nebude fungovať. Namiesto toho môžeš použiť git stash
a uložiť svoje nedokončené zmeny na zásobník!
$ git stash
Saved working directory and index state \
"WIP on master: 049d078 added the index file"
HEAD is now at 049d078 added the index file
(To restore them type "git stash apply")
Teraz môžeš uložiť vzdialenú vetvu!
$ git pull
Over, či je všetko v poriadku
$ git status
# On branch master
nothing to commit, working directory clean
Môžeš si pozrieť, čo za chaos je na zásobníku cez git stash list
.
Nedokončené zmeny sú uložené ako Last-In-First-Out (Prvý dnu, posledný von) štruktúra, navrchu sa objavia najnovšie zmeny.
$ git stash list
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051 Revert "added file_size"
stash@{2}: WIP on master: 21d80a5 added number to log
Keď so zmenami budeš chcieť pracovať, odstráň ich zo stacku.
$ git stash pop
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
#
# modified: index.html
# modified: lib/simplegit.rb
#
git stash apply
urobí presne to isté
Hotovo, môžeš pokračovať v práci!
Zober všetky zmeny commitnuté do vetvy a aplikuj ich na inú vetvu. Tento príkaz nerob na verejných repozitároch.
# Aplikuj commity z experimentálnej vetvy na master
# git rebase <základnáVetva> <ináVetva>
$ git rebase master experimentBranch
Resetni HEAD (ukazateľ na aktuálnu vetvu) do konrkétneho stavu. To ti umožní vziať späť zlúčenia, zverejnenia, commity, pridania atď. Je to užitočný, no nebezpečný príkaz, pokiaľ nevieš, čo robíš.
# Resetni index (vrstvu medzi pracovným stromom a Git repozitárom), aby odpovedal najnovšiemu commitu (adresár ostane nezmenený)
$ git reset
# Resetni index, aby odpovedal najnovšiemu commitu (adresár sa prepíše)
$ git reset --hard
# Presunie vrchol aktuálnuej vetvy do konkrétneho commitu (adresár ostane nezmenený)
# všetky zmeny sú zachované v adresári.
$ git reset 31f2bb1
# Presunie vrchol aktuálnuej vetvy naopak do konkrétneho commitu
# a zosúladí ju s pracovným adresárom (vymaže nekomitnuté zmeny).
$ git reset --hard 31f2bb1
Vezme naspäť ("od-urobí") commit. Nezamieňaj s resetom, ktorý obnoví stav projektu do predchádzajúceho bodu v čase. Revert pridá nový commit, inverzný tomu, ktorý chceš vymazať, tým ho od-urobí.
# Vezmi späť konkrétny commit
$ git revert <commit>
Opak od git add, rm odstráni súbory z aktuálneho pracovného stromu.
# odstráň HelloWorld.c
$ git rm HelloWorld.c
# Odstráň súbor z vnoreného adresára
$ git rm /pather/to/the/file/HelloWorld.c
Got a suggestion? A correction, perhaps? Open an Issue on the GitHub Repo, or make a pull request yourself!
Originally contributed by Jake Prather, and updated by 2 contributors.