└── README.md /README.md: -------------------------------------------------------------------------------- 1 | # Git leiðbeiningar á íslensku 2 | 3 | Þessar leiðbeiningar eru miðaðar fyrir byrjendur sem vilja læra á Git. Ef þið sjáið villur eða viljið bæta einhverju við, endilega sendið PR *(Pull Request)*. 4 | 5 | Ég er búinn að vera að halda utan um Git leiðbeiningar í PDF-formi [hér](http://gaui.is/stuff/Git.pdf) en ákvað að deila þessu og leyfa fólki að bæta við og breyta - og hvað er betra til þess en Git, GitHub og Markdown? 6 | 7 | ## Sækja Git 8 | 9 | Hægt er að sækja Git fyrir öll helstu stýrikerfin á [http://git-scm.com](http://git-scm.com). 10 | 11 | ### Mac OS X 12 | 13 | Þægilegasta leiðin til að setja upp Git á Mac (og halda utan um uppfærslur) er í gegnum [Homebrew](http://brew.sh), en það er tól sem gerir manni kleift að halda utan um pakka/tól fyrir Mac. Eftir að brew hefur verið sett upp þarf einfaldlega að keyra `brew install git`. Til að sækja uppfærslur keyrir maður `brew upgrade git` 14 | 15 | ## Hvað er Git? 16 | 17 | Git er kerfi fyrir dreifða útgáfustjórn *(e. distributed revision control system)*. Ólíkt öðrum kerfum getur Git séð um útgáfustjórn án viðkomu servers. Önnur kerfi eins og SVN, TFS (TFVC), o.s.frv. eru miðstýrð *(e. centralized)* sem þýðir að útgáfustýringin er á miðlægum server. 18 | 19 | Git er hugbúnaður sem búinn til var af Linus Torvalds, höfundi Linux stýrikerfisins. Linus bjó til Git til að sjá um útgáfustjórn fyrir Linux kernelinn, en gaf það svo út á endanum til almennings. Git er í dag vinsælasta kerfið til að sjá um útgáfustjórnun. 20 | 21 | Fyrir þá sem vilja kynna sér Git undir húddinu geta lesið nánar [hér](http://wildlyinaccurate.com/a-hackers-guide-to-git/). 22 | 23 | ## Uppsetning 24 | 25 | Eftir uppsetningu á Git fyrir Windows er opnað *Git Bash*, sem er skel fyrir Git. Ef Git er sett upp fyrir Linux/Mac er ekki þörf á *Git Bash*, þar sem notuð er skelin sem fylgir stýrikerfinu. 26 | 27 | Áður en við byrjum er gott að setja inn nafn og netfang, sem fest verður við allar breytingar sem þú gerir. 28 | 29 | Skipanirnar eru eftirfarandi: 30 | 31 | git config --global user.name "John Doe" 32 | git config --global user.email johndoe@example.com 33 | 34 | 35 | ## Nýtt repository 36 | 37 | Til að byrja útgáfustjórn með Git er búin til svokölluð geymsla *(e. repository)*. Þetta er mappan sem inniheldur t.d. allan kóðann þinn sem þú vilt útgáfustýra. 38 | 39 | Til að búa til nýtt repository ferðu í möppu sem þú vilt útgáfustýra og skrifar inn eftirfarandi skipun: 40 | 41 | git init 42 | 43 | Þá er mappan orðin að Git repository. Flóknara er það ekki. 44 | 45 | ### .gitignore 46 | 47 | Þegar kóði er útgáfustýrður og repository er deilt með öðrum forriturum, vill maður oft sleppa ákveðnum skrám. Dæmi um slíkar skrár eru t.d. binary og auto-generated skrár: 48 | 49 | - IDE config fyrir notandann 50 | - Loggar 51 | - Compiled binary (bin, obj, o.s.frv.) 52 | - o.s.frv. 53 | 54 | Þá kemur `.gitignore` skráin að góðum notum. Git hunsar allar skrár í þessari skrá, nema þeim hafi verið bætt við áður en `.gitignore` skráin var búin til (þar sem Git er byrjað að tracka skránna). En þá er hægt að keyra `git rm --cached ` til að eyða skránni úr Git, en sleppa því að eyða skránni úr Working Directory. 55 | 56 | Best er að búa til `.gitignore` skránna í rótinni á repository'inu (þar sem `.git` mappan er staðsett). 57 | 58 | GitHub heldur úti sér repository fyrir `.gitignore` template sem má finna [hér](https://github.com/github/gitignore). 59 | 60 | ## Git högun 61 | 62 | ### Local vs. Remote 63 | 64 | - Commit eru breytingar sem þú gerir *local* á þinni tölvu 65 | - *"Ég er búinn að committa breytingunum"* 66 | - Push eru *local* breytingarnar þínar, færðar yfir á server/remote 67 | - *"Ég er búinn að pusha breytingunum"* 68 | 69 | ### Flæði 70 | 71 | Flæðið er í stuttu máli eftirfarandi: 72 | 73 | - Working Directory (Untracked) 74 | - Staging Area (Index) 75 | - Local Repository 76 | - Remote Repository (origin) 77 | 78 | ![Git diagram](http://i.imgur.com/QZ8qeoZ.png) 79 | 80 | Til að líkja Git saman við eitthvað í raunveruleikanum þá má líkja því saman við skrif á bók: 81 | 82 | - **Working Directory (Untracked)** 83 | - Þú byrjar að skrifa á fullu og býrð til drög/uppköst sem þú ýmist vistar eða hendir. 84 | - **Staging Area (Index)** - `git add` 85 | - Þú tekur saman það sem þú vilt gefa út og setur í umslag. 86 | - **Local Repository** - `git commit` 87 | - Þú setur umslagið í kassa með einkvæmum merkimiða ásamt lýsingu, dagsetningu og höfundi verksins. 88 | - **Remote Repository** - `git push` 89 | - Þú sendir kassann til ritstjórnar/útgefanda. 90 | 91 | ### SSH 92 | 93 | Þegar átt eru samskipti við server (remote) er oft notað SSH. SSH samskipti eru dulkóðuð og mjög örugg. 94 | 95 | Til þess að geta átt örugg samskipti við servera eins og t.d. GitHub þarf maður að auðkenna sig gagnvart honum. Gengið er í gegnum ferlið einu sinni (fyrir hverja tölvu) og er það eftirfarandi: 96 | 97 | - [Búa til GitHub aðgang](https://github.com/join) 98 | - [Búa til SSH lykla par](https://help.github.com/articles/generating-ssh-keys/#step-2-generate-a-new-ssh-key) 99 | - [Tengja SSH public lykil við GitHub aðganginn þinn](https://help.github.com/articles/generating-ssh-keys/#step-4-add-your-ssh-key-to-your-account) 100 | 101 | ### Commit 102 | 103 | Hvert commit í Git er með upplýsingar um hvernig repository'ið (Working Directory) lítur út á þeim tíma. Í hverju committi eru upplýsingar um höfund þess og dagsetningu. Hvert commit fær einkvæmt SHA1 hash gildi, eins konar kennimerki *(e. identifier)* fyrir committið. 104 | 105 | Commit í Git eru með pointer á committið þar á undan *(parent commit*). Þannig er sagan uppbyggð í Git. Eins og sjá má á neðangreindri mynd. 106 | 107 | ![git commit](http://i.imgur.com/zJoIbzH.png) 108 | 109 | ### Branch 110 | 111 | Brönch í Git eru bendar *(e. pointer)* á tiltekin commit. Git er allt byggt á pointerum. 112 | 113 | ![Pointers](http://i.imgur.com/SG1oyOQ.png) 114 | 115 | Á myndinni hér fyrir ofan má sjá eftirfarandi: 116 | 117 | - HEAD pointerinn bendir á master pointerinn 118 | - master pointerinn bendir svo á C2 committið 119 | - test pointerinn bendir á T1 committið 120 | - C1 er fyrsta committið 121 | - T1 committið var búið til út frá C2 (C2 er parent T1) 122 | - C2 comittið var búið til út frá C1 (C1 er parent C2) 123 | - Þegar þú gerir `checkout master` ertu á C2 committinu 124 | - Þegar þú gerir `checkout test` ertu á T1 committinu 125 | 126 | #### HEAD 127 | 128 | Í Git er bendir *(e. pointer)* sem ber heitið *HEAD*. Þessi pointer færist í hvert skipti sem þú ferð á nýjan stað í repository'inu (notar `git checkout` skipunina). Þetta er því í raun bendir á þann stað sem þú ert staddur á núna. 129 | 130 | #### Detached HEAD 131 | 132 | Þetta er þegar *HEAD* pointerinn bendir ekki á tiltekið branch, heldur á tiltekið commit í Git. 133 | 134 | Segjum að þú farir á committið á undan `master`, þá ertu kominn með detached HEAD. 135 | 136 | ## Skipanir 137 | 138 | Hér fyrir neðan er yfirlit yfir helstu skipanir í Git. 139 | 140 | ### git init 141 | 142 | Þetta býr til nýtt repository og er upphafið á öllu. 143 | 144 | Initialized empty Git repository in c:/Users/gaui/Desktop/test/.git/ 145 | 146 | ### git status 147 | 148 | Þetta er mest notaðasta skipunin í Git. Hún sýnir á hvaða branchi þú ert ásamt öllum breytingum sem hafa verið gerðar frá síðasta committi. Sýnir hvaða skrá eru untracked (ekki verið að fylgjast með), hvaða skrám hefur verið breytt/eytt ásamt því hvaða breytingar hafa verið *staged* (gerðar tilbúnar fyrir commit). 149 | 150 | ![git status](http://i.imgur.com/rWCZZMb.png) 151 | 152 | Á myndinni hér fyrir ofan er: 153 | 154 | - *baz.txt* breytt og sú breyting hefur verið staged (tilbúin fyrir commit). 155 | - *bar.txt* eytt en sú breyting hefur ekki verið staged. 156 | - *foo.txt* breytt sú breyting hefur ekki verið staged. 157 | - *smuu.txt* bætt við, en Git er ekki að fylgjast með henni (untracked). 158 | 159 | ### git checkout 160 | 161 | Í Git er bendir *(e. pointer)* sem ber heitið *HEAD*. Þessi pointer færist í hvert skipti sem þú ferð á nýjan stað í repository'inu - og til þess notaru þessa skipun. 162 | 163 | #### git checkout `` 164 | 165 | Færir þig yfir á branch og færir um leið *HEAD* pointerinn. 166 | 167 | #### git checkout -b `` 168 | 169 | Býr til nýtt branch og færir þig yfir á það. 170 | 171 | ### git add 172 | 173 | Bæta við skrá/möppu í Staging Area (Index) þannig breytingin verði tilbúin fyrir commit. Eins og á myndinni hér fyrir ofan var *baz.txt* bætt við í Staging Area. 174 | 175 | #### git add `` 176 | 177 | Tiltekinni skrá bætt við í Staging Area. 178 | 179 | #### git add `.` 180 | 181 | Öllum skrám/breytingum bætt við í Staging Area. 182 | 183 | #### git add `-u` 184 | 185 | Bæta við öllum eyddum skrám í Staging Area. 186 | 187 | #### git add `-p` 188 | 189 | Leyfir þér að velja hvaða breytingar þú vilt setja í Staging Area. Segjum að þú gerir þrjár breytingar í sömu skránni. Þú getur stage'að tveimur af þessum þremur breytingum í skránni. 190 | 191 | ### git reset 192 | 193 | Þessi skipun skiptist í þrjá parta; mixed, soft og hard. Default er `--mixed` 194 | 195 | #### git reset `--mixed` 196 | 197 | Þessi skipun er defaultið þegar þú skrifar bara `git reset`. Þetta endurstillir Staging Area (Index) og breytir ekki Working Directory. 198 | 199 | Þetta er t.d. gagnlegt þegar þú vilt taka skrár úr Staging Area (Index). 200 | 201 | #### git reset `--soft` 202 | 203 | Þessi skipun endurstillir ekki Staging Area (Index) og breytir ekki Working Directory. 204 | 205 | Þetta er t.d. gagnlegt þegar þú vilt setja mörg local commit í eitt, þar sem þetta hreyfir hvorki við Staging Area (Index) né Working Directory. 206 | 207 | **Dæmi:** 208 | 209 | * da883dc (HEAD, master) Three 210 | * 92d3eb7 Two 211 | * c6e82d3 One 212 | * e1e8042 Start here 213 | 214 | git reset --soft e1e8042 215 | git log --oneline 216 | 217 | * e1e8042 Start here 218 | git commit 219 | 220 | Þarna er öllum breytingunum komið fyrir í `e1e8042` *(Start here)* committinu, og þú getur pushað því sem einu committi og sleppt þessum þremur auka. 221 | 222 | #### git reset `--hard ` 223 | 224 | Þetta breytir Working Directory alveg eins og í committinu sem þú tilgreinir. 225 | 226 | Þetta er notað mest til að bakka með allar breytingar sem þú hefur gert síðan síðasta commit. 227 | 228 | Þetta er hættuleg aðgerð og getur haft alvarlegar afleiðingar í för með sér. 229 | 230 | Ekki nota þetta ef þú ert búinn að pusha á server. 231 | 232 | ### git revert `` 233 | 234 | Þessi skipun er notuð til þess að bakka með breytingar sem búið er að pusha á server. Hún býr til nýtt commit þar sem öllum breytingunum í committinu er snúið við. + verður - og - verður + 235 | 236 | ### git commit 237 | 238 | Býr til nýtt commit í local repository með staged breytingum. 239 | 240 | #### git commit `-m "Commit Message"` 241 | 242 | Býr til nýtt commit í local repository með staged breytingum ásamt skilaboðunum `"Commit Message"`. 243 | 244 | $ git commit -m "Commit Message" 245 | [master f4b8f86] Commit Message 246 | 2 files changed, 2 insertions(+), 2 deletions(-) 247 | 248 | ### git remote 249 | 250 | Remote er vísun í eitthvað repository uppstreymi, til dæmis GitHub. Þetta gæti alveg eins verið vísun í aðra möppu á tölvunni þinni með sama repository. Git er alveg sama, svo framarlega sem það er Git repository. 251 | 252 | #### git remote `add origin git@github.com:user/repo.git` 253 | 254 | Bætir við nýrri remote vísun sem ber heitið `origin` og vísar á repository á GitHub. 255 | 256 | Þetta þarf ekki að heita `origin`, gæti þess vegna verið `github`. `origin` er bara venja í Git og stendur fyrir uppruna repository'sins. 257 | 258 | #### git remote `-v` 259 | 260 | Sýnir öll remote í núverandi repository. 261 | 262 | ### git clone `` 263 | 264 | Klónar Git repository í nýja möppu. 265 | 266 | ![git clone](http://i.imgur.com/TQJ5CHu.png) 267 | 268 | Á myndinni hér fyrir ofan klónaði ég repository undir slóðinni *C:\Users\gaui\Desktop\test* yfir í nýja möppu, sem ber heitið *test_clone*. `ls` skipunin sýnir bara hvaða skrár urðu til. 269 | 270 | Ef *test* repositoryið væri með langa sögu af breytingum, myndi klónaða repository'ið innihalda alla þá sögu. Þannig ef þú klónar repository á GitHub færðu alla breytingasöguna yfir til þín. 271 | 272 | ### git push 273 | 274 | #### git push `origin ` 275 | 276 | Pushar local branchi yfir á `origin` remote repository'ið. 277 | 278 | Eins og í dæminu hér að ofan vísar `origin` á `git@github.com:user/repo.git` þannig við myndum senda allar breytingarnar þangað. 279 | 280 | #### git push `origin :` 281 | 282 | Eyðir branchi á `origin` remote repository'inu. Taktu eftir tvípunktinum á undan branch nafninu. 283 | 284 | ### git pull `origin ` 285 | 286 | Sækir allar breytingar frá `origin` remote repository'inu. 287 | 288 | Eins og í dæminu hér að ofan vísar `origin` á `git@github.com:user/repo.git` þannig við myndum sækja allar nýjustu breytingarnar þaðan. 289 | 290 | ### git log 291 | 292 | Sýnir lista yfir öll commit á núverandi branchi. 293 | 294 | #### git log `` 295 | 296 | Sýnir lista yfir öll commit á ákveðnu branchi. 297 | 298 | #### git log `..` 299 | 300 | Sýnir lista yfir öll commit sem eru í *branch2* en ekki í *branch1*. 301 | 302 | #### git log `...` 303 | 304 | Sýnir lista yfir commit sem eru annað hvort í *branch1* eða *branch2*. 305 | 306 | Hér fyrir neðan má sjá mynd sem útskýrir þetta betur: 307 | 308 | ![git log](http://i.imgur.com/vM7PtCn.png) 309 | 310 | ### git diff 311 | 312 | Sýnir breytingar frá síðasta committi (þær breytingar sem þú ert að vinna í). 313 | 314 | #### git diff `...` 315 | 316 | Sýnir mun/diff á committum á branchi, sem eru ekki á branchinu sem þú ert á núna *(HEAD)*. 317 | 318 | #### git diff `...` 319 | 320 | Sýnir mun/diff á tveimur local brönchum. Sýnir þær breytingar sem eru í *branch2* en ekki *branch1*. 321 | 322 | Sýnir þér mun milli *"merge base"* þessara tveggja brancha og endans á *branch2*. 323 | 324 | Hér fyrir neðan má sjá mynd sem útskýrir þetta betur: 325 | 326 | ![git diff](http://i.imgur.com/1PfbKPU.png) 327 | 328 | #### git diff `--staged` 329 | 330 | Sýnir allar breytingar sem eru í Staging Area (Index). 331 | 332 | ### git branch 333 | 334 | Sýnir lista yfir öll local brönch. 335 | 336 | #### git branch `--remote` 337 | 338 | Sýnir lista yfir öll remote brönch. 339 | 340 | #### git branch `--all` 341 | 342 | Sýnir lista yfir öll brönch (local og remote) 343 | 344 | #### git branch `` 345 | 346 | Býr til nýtt local branch. 347 | 348 | #### git branch `-d ` 349 | 350 | Eyðir local branchi sem hefur verið merge'að inn í master. 351 | 352 | #### git branch `-D ` 353 | 354 | Eyðir local branchi sem hefur *EKKI* verið merge'að inn í master. 355 | 356 | ### git rm 357 | 358 | #### git rm `` 359 | 360 | Eyðir skrá úr Git. Eyðir bæði úr Working Directory og stage'ar breytingunni. Þú þarft svo að committa breytingunni. 361 | 362 | #### git rm `--cached ` 363 | 364 | Eyðir skrá úr Git. Stage'ar breytingunni en eyðir skránni ekki úr Working Directory. 365 | 366 | ### git clean `-f -d` 367 | 368 | Eyðir untracked skrám úr Working Directory. 369 | 370 | `-f` = Force `-d` = Directories 371 | 372 | ### git merge `` 373 | 374 | Merge'ar branch inn í *current branch* sem þú ert á. 375 | 376 | Til að sjá hvaða branch þú ert á skaltu nota `git status` skipunina. 377 | 378 | ### git prune `origin --dry-run` 379 | 380 | Sýnir öll local brönch sem passa ekki við remote brönch. 381 | 382 | `--dry-run` = Bara sýna, ekki breyta neinu. 383 | 384 | ### git tag 385 | 386 | Býr til pointer á tiltekið commit. Þetta er svipað og branch. 387 | 388 | #### git tag v1.0 389 | 390 | Býr til pointerinn `v1.0` á committið sem þú ert staddur á. 391 | 392 | ## Aliases 393 | 394 | Hér fyrir neðan eru gagnlegir aliasar (sérsniðnar skipanir) sem hægt er að nota. 395 | 396 | ### git unpushed 397 | 398 | Sýnir öll commit sem ekki er búið að pusha. 399 | 400 | git config --global alias.unpushed "log --branches --not --remotes" 401 | 402 | ### git lg 403 | 404 | Sýnir öll commit á fallegu formi (með branch grafi). 405 | 406 | git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit" 407 | 408 | ### git tags 409 | 410 | Sýnir öll tög og hvenær þau voru búin til. 411 | 412 | git config --global alias.tags "log --tags --simplify-by-decoration --pretty='format:%ai %d'" 413 | 414 | ### git branches 415 | 416 | Sýnir öll brönch í röð eftir því hvenær var síðast committað á þau. 417 | 418 | git config --global alias.branches "for-each-ref --sort=-committerdate refs/heads/ --format='%(committerdate:short) %(authorname) %(refname:short)'" 419 | 420 | ### git recent 421 | 422 | Sýnir brönch sem nýbúið er að vinna á. 423 | 424 | git config --global alias.recent "for-each-ref --count=10 --sort=-committerdate refs/heads/ --format='%(refname:short) %(committerdate:relative)'" 425 | 426 | ### git stats 427 | 428 | Sýnir yfirlit yfir fjölda committa og nöfn höfunda. 429 | 430 | git config --global alias.stats "shortlog -s -n" 431 | 432 | ### git conflicts 433 | 434 | Sýnir skrár sem eru í *conflicted state*. 435 | 436 | git config --global alias.conflicts "diff --name-only --diff-filter=U" 437 | --------------------------------------------------------------------------------