Git
Chapters ▾ 2nd Edition

6.2 GitHub - Kako doprineti projektu

Kako doprineti projektu

Sada kada vam je nalog podešen, hajde da prođemo kroz neke detalje koji bi mogli da vam pomognu da doprinesete postojećem projektu.

Forkovanje projekata

Ako želite da doprinesete postojećem projektu za koji nemate dozvolu za guranje promena, možete da "forkujete" (račvanje) projekat. Ovo znači da će GitHub napraviti kopiju projekta koja je potpuno vaša; projekat sada živi u korisnikovom nejmspejsu i možete da gurate na njega.

Note

Istorijski, termin "forkovanje" ima pomalo negativnu konotaciju jer je ranije opisivao situaciju kada neko uzme projekat sa otvorenim kodom i pokrene ga u drugom pravcu, i tako neretko stvori suparnički projekat i podeli kontributore na tabore. U GitHub-u, "fork" je jednostavno isti projekat u sopstvenom nejmspejsu, što vam dozvoljava da pravite promene za projekat javno i to jednostavno predstavlja otvorenu kontribuciju.

Zbog ovoga projekti ne moraju da brinu o dodavanju korisnika za kolaboratore da bi im dali dozvolu za guranje promena. Ljudi mogu da forkuju projekat, guraju na njega, i doprinesu svoje promene nazad originalnom repozitorijumu tako što će kreirati nešto što se zove zahtev za povlačenjem (Pull Request), što ćemo pokriti kasnije. Ovo otvara temu za diskusiju sa pregledom koda, i vlasnik ili kontributor može da komunicira o promeni dok vlasnik ne bude zadovoljan; nakon toga vlasnik može da napravi spoj.

Da biste forkovali projekat, posetite stranicu projekta i kliknite na Fork dugme u gornjem desnom uglu stranice.

_Fork_ dugme.
Figure 89. Fork dugme.

Za nekoliko sekundi, bićete odvedeni na stranicu svog novog projekta, sa svojom sopstvenom kopijom koda po kojoj možete da pišete.

Tok u GitHub-u

GitHub je dizajniran imajući u vidu jedan određeni tok rada za kolaboraciju, koji je centralizovan oko zahteva za povlačenjem. Ovaj način rada funkcioniše bilo da sarađujete sa malim timom prijatleja koji imaju samo jedan deljivi repozitorijum, ili sa globalno distrbuiranom kompanijom ili mrežom stranaca koji doprinose projektu preko brojnih forkova. Bazira se na toku rada Tematske grane koji smo pokrili u Grananje u Gitu.

Evo kako radi u opštem slučaju:

  1. Napravite tematsku granu iz master.

  2. Napravite neke komitove da poboljšate projekat.

  3. Gurnite ovu granu na svoj GitHub projekat.

  4. Otvorite zahtev za povlačenjem na GitHub-u.

  5. Diskutujte, i opciono nastavite da komitujete.

  6. Vlasnik projekta obradi zahtev za povlačenjem i zatvori ga.

U osnovi, ovo je tok rada sa rukovodiocem integracija koji smo pokrili u Tok rada sa rukovodiocem integracija, ali umesto da koristi mejlove za komunikaciju i pregled promena, tim koristi GitHub-ove alate.

Hajde da prođemo kroz primer predlaganja promena projektu otvorenog koda koji je hostovan na GitHub-u koristeći ovaj tok rada.

Kako napraviti zahtev za povlačenjem

Toni traži kôd da pokrene na svom programabilnom mikrokontroleru Arduino i našao je odličan program na GitHub-u na https://github.com/schacon/blink.

Projekat kome želimo da doprinesemo.
Figure 90. Projekat kome želimo da doprinesemo.

Jedini problem je što je brzina treptanja prebrza, mislimo da bi bilo mnogo bolje da se čekaju tri sekunde imesto jedne za svaku promenu stanja. Zato hajde da popravimo program i da ga pošaljemo nazad na projekat kao predloženu promenu.

Prvo, kliknemo na dugme Fork koje smo ranije pomenuli i dobijamo svoju ličnu kopiju projekta. Naše korisničko ime ovde je tonychacon tako da je naša kopija ovog projekta na adresi https://github.com/tonychacon/blink i tu možemo da je editujemo. Kloniraćemo projekat lokalno, napraviti tematsku granu, promeniti kôd i konačno gurnuti te promene nazad na GitHub.

$ git clone https://github.com/tonychacon/blink (1)
Cloning into 'blink'...

$ cd blink
$ git checkout -b slow-blink (2)
Switched to a new branch 'slow-blink'

$ sed -i '' 's/1000/3000/' blink.ino (3)

$ git diff --word-diff (4)
diff --git a/blink.ino b/blink.ino
index 15b9911..a6cc5a5 100644
--- a/blink.ino
+++ b/blink.ino
@@ -18,7 +18,7 @@ void setup() {
// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  [-delay(1000);-]{+delay(3000);+}               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  [-delay(1000);-]{+delay(3000);+}               // wait for a second
}

$ git commit -a -m 'three seconds is better' (5)
[slow-blink 5ca509d] three seconds is better
 1 file changed, 2 insertions(+), 2 deletions(-)

$ git push origin slow-blink (6)
Username for 'https://github.com': tonychacon
Password for 'https://tonychacon@github.com':
Counting objects: 5, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 340 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To https://github.com/tonychacon/blink
 * [new branch]      slow-blink -> slow-blink
  1. Kloniramo naš fork projekta lokalno

  2. Napravimo deskriptivnu tematsku granu

  3. Izmenimo kôd

  4. Proverimo da li je promena dobra

  5. Komitujemo proemnu na tematsku granu

  6. Gurnemo novu tematsku granu nazad na naš GitHub fork

Ako se sada vratimo na naš fork na GitHub-u, videćemo da je GitHub primetio da smo gurnuli novu tematsku granu i predstavlja nam veliko zeleno dugme da pogledamo promene i otvorimo zahtev za povlačenjem ka prvobitnom projektu.

Alternativno, možete da odete na stranicu Branches na https://github.com/<korisnik>/<projekat>/branches da locirate svoju granu i otvorite nov zahtev za povlačenjem odatle.

Dugme _Pull Request_.
Figure 91. Dugme Pull Request

Ako kliknemo na to zeleno dugme, videćemo ekran gde nas pita da damo naslov i opis našem zahtevu za povlačenjem. Skoro uvek vredi potruditi se malo za ovo, pošto dobar opis pomaže vlasniku prvobitnog projekta da shvati šta želite da uradite, da li su vaše predložene promene ispravne, i da li će prihvatanje promena poboljšati prvobitni projekat.

Vidimo i listu komitova ka našoj tematskoj grani koji su "ispred" master grane (u ovom slučaju, samo jedan) i ujedinjenu razliku svih promena koje će biti napravljene ako vlasnik projekta odluči da spoji ovu granu.

Stranica za pravljenje zahteva za povlačenjem
Figure 92. Stranica za pravljenje zahteva za povlačenjem

Kada kliknete na dugme Create pull request na ovom ekranu, vlasnik projekta od koga ste forkovali će dobiti notifikaciju da neko predlaže promenu i dobiće link do stranice koja ima sve informacije u vezi s tim.

Note

Mada se zahtevi za povlačenjem najčešće koriste za projekte kao ovaj, kada kontributor ima kompletnu promenu koju je spreman da napravi, koriste se često i kod internih projekta na početku ciklusa razvića. Pošto možete da nastavite da gurate tematske grane čak i nakon što se otvori zahtev za povlačenjem, često se otvara rano i koristi se kao način za iteraciju nad radom kao tim u kontekstu, umesto da se otvori na samom kraju procesa.

Iteracija nad zahtevom za povlačenjem

Sada vlasnik projekta može da pogleda predloženu promenu i da napravi spoj, da je odbije ili da komentariše. Recimo da mu se dopada ideja, ali bi volelo da svetlo bude ugašeno malo duže nego što je upaljeno.

Ovakav razgovor bi se obavio mejlovima u tokovima rada koji su predstavljeni u Distribuirani Git, ali na GitHub-u se ovo dešava onlajn. Vlasnik projekta može da pregleda ujedinjenu razliku i ostavi komentar klikom na bilo koju liniju.

Komentarisanje specifične linije koda u zahtevu za povlačenjem.
Figure 93. Komentarisanje specifične linije koda u zahtevu za povlačenjem.

Kada održavalac napravi ovaj komentar, osoba koja je otvorila zahtev za povlačenjem (zapravo, svako ko prati repozitorijum) dobiće obaveštenje. Kasnije ćemo pogledati kako promeniti ova podešavanja, ali ako su mu mejl obaveštenja uključena, Toni će dobiti ovakav mejl:

Komentari poslati kao mejl notifikacije.
Figure 94. Komentari poslati kao mejl notifikacije.

Svako može da ostavi opšte komentare na zahtevu za povlačenjem. U Stranica za diskusiju zahteva za povlačenjem. vidimo primer gde vlasnik projekta kometariše na liniju koda a onda ostavlja opšti komentar u odeljku za diskusiju. Možete da vidite da se komentari o kodu dovlače i u ovaj razgovor.

Stranica za diskusiju zahteva za povlačenjem.
Figure 95. Stranica za diskusiju zahteva za povlačenjem.

Sada kontributor može da vidi šta treba da uradi da bi mu se promena prihvatila. Srećom, ovo je veoma jednostavno. Dok biste preko mejlova morali da opet odmotate seriju zakrpi i ponovo pošaljete sve spisku adresa, sa GitHub-om možete samo da komitujete na tematskoj grani opet i da gurnete promene, koje će automatski ažurirati zahtev za povlačenjem. U Konačni zahtev za povlačenjem možete da vidite i to da je stari komentar na kôdu sakriven u ažuriranom zahtevu za povlačenjem, pošto je napravljena promena na toj liniji.

Dodavanje komitova na postojeći zahtev za povlačenjem ne okida notifikaciju, tako da nakon što Toni gurne svoje ispravke, odlučuje da ostavi komentar kako bi obavestio vlasnika projekta da je napravio zahtevanu promenu.

Konačni zahtev za povlačenjem
Figure 96. Konačni zahtev za povlačenjem

Zanimljiva stvar koju možete da primetite je da ako kliknete na tab Files Changed na ovom zahtevu za povlačenjem, dobićete "ujedinjenu" razliku — drugim rečima, ukupnu nagomilanu razliku koja bi bila uvedena u vašu glavnu granu ako bi se ova tematska grana spojila sa njom. U poređenju sa git diff, to je u suštini ono što vam automatski pokaže git diff master...<grana> za granu na kojoj je zahtev za povlačenjem baziran. Pogledajte Kako utvrditi šta je uvedeno za više o ovoj vrsti razlike.

Druga stvar koju ćete primetiti je to da GitHub proverava da li se zahtev za povlačenjem glatko spaja i nudi dugme koje radi spoj na serveru. Ovo dugme se pojavljuje samo ako imate pristup pisanju u repozitorijum i ako je trivijalni spoj moguć. Ako kliknete na njega, GitHub će uraditi "ne motaj napred" spoj, što znači da čak i ako bi spoj mogao da bude premotan unapred, ipak će se napraviti novi spojni komit.

Možete i jednostavno da povučete granu i obavite spoj lokalno, ako vam se tako više sviđa. Ako spojite ovu granu u master granu i gurnete to na GitHub, zahtev za povlačenjem će se automatski zatvoriti.

Ovo je osnovni tok rada koji koristi većina GitHub projekata. Prave se tematske grane, otvaraju se zahtevi za povlačenjem, vode se razgovori, eventualno se radi još malo na grani i na kraju se zahtev ili zatvori ili spoji.

Note
Ne samo forkovi

Važno je primetiti da možete i da otvorite zahtev za povlačenjem između dve grane u istom repozitorijumu. Ako radite na nečemu s nekim i oboje imate pristup za pisanje projektu, možete da gurnete tematsku granu na repozitorijum i otvorite zahtev za povlačenjem u master granu tog istog projekta da biste pokrenuli pregled koda i diskusiju. Nema potrebe za forkovanjem.

Napredni zahtevi za povlačenjem

Sad kad smo pokrili osnove kontribuiranja projektu na GitHub-u, hajde da pogledamo nekoliko zanimljivih saveta i trikova o zahtevima za povlačenjem i kako možete da budete efikasniji dok ih koristite.

Zahtevi za povlačenjem kao zakrpe

Važno je da shvatite da mnogi projekti ne gledaju na zahteve za povlačenjem kao na seriju savršenih zakrpa koje treba da se primene tim redom, kao što to radi većina projekata baziranih na spisku adresa. Većina GitHub projekata gleda na grane za koje se zahteva povlačenje kao iterativne konverzacije o predloženoj promeni, koje kulminiraju u jedinstvenu razliku koja se prihvata spajanjem.

Ovo je važna razlika, jer se u opštem slučaju promene predlažu pre nego što se za kôd smatra da je savršen, što je mnogo ređi slučaj sa doprinosom baziranom na seriji zakrpa sa spiska adresa. Ovo omogućava da se najpre razgovara sa održavaocima tako da je dolazak dobrog rešenja uglavnom plod timskog rada zajednice. Kada se kôd predloži zahtevom za povlačenjem i održavaoci ili zajednica predloži promenu, serija zakrpa se generalno ne odmotava ponovo, već se razlika gurne kao novi komit na grani.

Na primer, ako se vratite nazad i opet pogledate Konačni zahtev za povlačenjem, primetićete da održavalac nije rebazirao svoj komit i poslao još jedan zahtev za povlačenjem. Umesto toga, dodao je nove komitove i gurnuo ih na postojeću granu. Na ovaj način, ako se vratite nazad i pogledate ovaj zahtev za povlačenjem u budućnosti, moći ćete lako da nađete kontekst zbog koga su odluke napravljene. Ako kliknite na dugme Merge na sajtu, namerno se pravi spojni komit koji referncira na zahtev za povlačenjem kako bi bilo lako da se vratite nazad i istražite originalnu diskusiju, ako to bude bilo potrebno.

Kako održati korak sa uzvodnim granama

Ako vaš zahtev za povlačenjem postane zastarao ili se iz nekog drugog razloga ne spaja glatko, treba da popravite to da bi održavalac mogao lako da načini spoj. GitHub će vam ovo testirati i obavestiće vas o tome na dnu svakog zahteva za povlačenjem da li je spoj trivijalan ili ne.

Zahtev za povlačenjem se ne spaja glatko.
Figure 97. Zahtev za povlačenjem se ne spaja glatko.

Ako vidite nešto kao Zahtev za povlačenjem se ne spaja glatko., treba da popravite svoju granu tako da se pretvori u zeleno i da održavalac ne mora da radi višak posla.

Imate dva glavna izbora da uradite ovo. Možete ili da rebazirte svoju granu na vrh koje god grane da je odredišna (obično master grana repozitorijuma koji ste forkovali) ili da spojite odredišnu granu u svoju granu.

Većina developera na GtHub-u će izabrati drugu opciju, iz istih razloga koje smo prešli u prethodnom odeljku. Ono što je važno je istorija i konačni spoj, tako da vam rebaziranje ne daje mnogo toga sem nešto čistije istorije, a mnogo je podložnije greškama i teže.

Ako želite da se spojite u odredišnu granu da bi vaš zahtev za povlačenjem bio spojiv, treba da dodate prvobitni repozitorijum kao novi rimout, pribavite (fetch) podatke sa njega, spojite glavnu granu tog repozitorijuma u svoju tematsku granu, sredite sve ako dođe do problema i na kraju gurnete to nazad na istu granu za koju ste otvorili zahtev za povlačenjem.

Na primer, recimo da u primeru tinychacon koji smo koristili malopre, prvobini autor napravi promenu koja stvara konflikt sa zahtevom za povlačenjem. Hajde da prođemo kroz te korake.

$ git remote add upstream https://github.com/schacon/blink (1)

$ git fetch upstream (2)
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (3/3), done.
Unpacking objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
From https://github.com/schacon/blink
 * [new branch]      master     -> upstream/master

$ git merge upstream/master (3)
Auto-merging blink.ino
CONFLICT (content): Merge conflict in blink.ino
Automatic merge failed; fix conflicts and then commit the result.

$ vim blink.ino (4)
$ git add blink.ino
$ git commit
[slow-blink 3c8d735] Merge remote-tracking branch 'upstream/master' \
    into slower-blink

$ git push origin slow-blink (5)
Counting objects: 6, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 682 bytes | 0 bytes/s, done.
Total 6 (delta 2), reused 0 (delta 0)
To https://github.com/tonychacon/blink
   ef4725c..3c8d735  slower-blink -> slow-blink
  1. Dodaje prvobitni repozitorijum kao rimout sa imenom upstream

  2. Pribavlja najnoviji rad sa tog rimouta

  3. Spaja glavnu granu u vašu tematsku granu

  4. Rešava konflikte koji su nastali

  5. Gura nazad na istu tematsku granu

Kada to uradite, zahtev za povlačenjem će automatski biti ažuriran i ponovo proveren da bi se ustanovilo da li se glatko spaja.

Zahtev za povlačenjem se sada spaja glatko.
Figure 98. Zahtev za povlačenjem se sada spaja glatko.

Jedna od odličinih stvari kod Gita je to što ovakve stvari možete da radite konstantno. Ako imate veoma dugi projekat, možete jednostavno da spajate sa odredišnih grana iznova i iznova a da samo treba da se bavite konfliktima koji nastaju od trenutka kada ste poslednji put spojili, što čini proces veoma podesnim za rukovanje.

Ako apsolutno morate da rebazirate granu da biste je počistili, naravno, to možete uraditi, ali se strogo preporučuje da ne forsirate guranje preko grane na kojoj je zahtev za povlačenjem već otvoren. Ako su ga drugi ljudi povukli i radili nešto nad njim, dolazite do gomile problema koji su opisani u Opasnosti prilikom rebaziranja. Umesto toga, gurnite rebaziranu granu na novu granu na GitHub-u i otvorite potpuno novi zahtev za spajanjem koji referencira stari, a onda zatvorite prvobitni.

Reference

Vaše sledeće pitanje je s pravom "Kako da referenciram stari zahtev za povlačenjem?". Ispostavlja se da ima ogroman broj načina da referencirate skoro sve što pišete na GitHub-u.

Počnimo od toga kako da referencirate drugi zahtev za povlačenjem ili tiket. Svi zahtevi za povlačenjem i tiketi imaju svoje brojeve i jedinstveni su u sklopu projekta. Na primer, ne možete imati zahtev za povlačenjem #3 i tiket #3. Ako želite da referencirate zahtev za povlačenjem ili tiket sa bilo kog drugog, možete jednostavno da stavite #<broj> u bilo kom komentaru ili opisu. Možete i da budete specifičniji ako tiket ili zahtev za povlačenjem živi negde drugde; pišite korisničko-ime#<broj> ako referencirate tiket ili zahtev za povlačenjem u forku repozitorijuma koga se nalazite, ili korisničko-ime/repozitorijum#<broj> da referencirate nešto iz drugog repozitorijuma.

Pogledajmo primer. Recimo da samo rebazirali granu u prethodnom primeru, napravili novi zahtev za povlačenjem za nju, i sada želimo da referenciramo stari zahtev za povlačenjem sa novog. Takođe želimo da referenciramo tiket u forku repozitojuma i tiket u potpuno drugom projektu. Možemo da popunimo opis baš kao što je to učinjeno u Reference u zahtevu za povlačenjem..

Reference u zahtevu za povlačenjem.
Figure 99. Reference u zahtevu za povlačenjem.

Kada pošaljemo ovaj zahtev za povlačenjem, videćemo da se sve to renderovalo kao Cross references rendered in a Pull Request..

PR references rendered
Figure 100. Cross references rendered in a Pull Request.

Primetite da je pun GitHub URL koji smo uneli smanjen samo na neophodne informacije.

Ako se sada Toni vrati nazad i zatvori prvobitni zahtev za povlačenjem, vidimo to da njegovim pominjanjem u novom, Git automatski kreira trekbek događaj (trackback event) u vremenskoj liniji zahteva za povlačenjem. Ovo znači da će svako ko poseti ovaj zahtev za povlačenjem i vidi da je zatvoren lako moći da dođe do onog kojim je zaenjen. Link će izgledati nekako kao na Cross references rendered in a Pull Request..

PR closed
Figure 101. Cross references rendered in a Pull Request.

Pored brojeva tiketa, možete da referencirate i specifičan komit pomoću SHA-1. Morate da specificirate ceo SHA-1 sa 40 karaktera, ali ako GitHub vidi to u komentaru, linkovaće ga direktno na komit. Opet, možete da referncirate komitove u forkovima ili drugim repozitorijuma na isti način kao sa tiketima.

Markdaun

Linkovanje drugih tiketa je samo početak zanimljivih stvari koje možete da radite sa skoro svakim tekstualnim poljem na GitHub-u. U opisima tiketa i zahtevima za spaanjem, komentarima, komentarima u kôdu i na mnogim drugim mestima, možete da koristite nešto što se zove Makrdaun sa ukusom GitHub-a (GitHub Flavored Markdown). Markdaun je kao pisanje običnog teksta koji se zatim renderuje sa stilovima.

Pogledajte Primer Markdauna kako je napisan i kako je renderovan. za primer kako se komentari ili tekst mogu napisati a onda renderovati Markdaunom.

Primer Markdauna kako je napisan i kako je renderovan.
Figure 102. Primer Markdauna kako je napisan i kako je renderovan.

Markdaun sa ukusom GitHub-a

Markdaun sa ukusom GitHub-a dodaje još stvari koje možete da uradite pored osnovne Markdaun sintakse. Svi oni mogu biti veoma korisni kada pravite komentare ili opise za zahteve za povlačenjem ili tikete.

Lista zadataka

Prva veoma korisna odlika GitHub-ovog specifičnog Markdauna, pogotovo kod zahteva za povlačenjem, jeste lista zadataka. Lista zadataka je lista čekboksova stvari koje želite da budu urađene. Kada ih stavite u tiket ili zahtev za povlačenjem, to obično znači da želite da sve to bude urađeno pre nego što ih obeležite kao gotove.

Možete da napravite listu zadataka ovako:

- [X] Write the code
- [ ] Write all the tests
- [ ] Document the code

Ako ovo uključimo u opis na zahtevu za povlačenjem ili u opis tiketa, videćemo da se renderuje kao na Lista zadataka renderovana u Markdaun komentaru..

Lista zadataka renderovana u Markdaun komentaru.
Figure 103. Lista zadataka renderovana u Markdaun komentaru.

Ovo se često koristi u zahtevima za povlačenjem radi ukazivanja na sve ono što biste želeli da se obavi na grani pre nego što zahtev za povlačenjem bude spreman za spoj. Ono što je ovde stvarno super je to što možete lako da kliknete na čekboksove da apdejtujete komentar — ne morate da editujete Markdaun direktno da biste obeležili zadatke kao obavljene.

Štaviše, GitHub će potražiti liste zadataka na tiketima i zahtevima za povlačenjem i pokazati ih kao metapodatke na stranicama koje ih izlistavaju. Na primer, ako imate zahtev za povlačenjem sa zadacima i bacite pogled na stranicu koja predstavlja listu svih zahteva za povlačenjem, videćete dokle se stiglo sa radom. Ovo pomaže ljudima da razbiju zahteve za povlačenjem u manje zadatke i pomaže drugim ljudima da prate napredovanje grane. Primer ovoga vidi se na Sažetak liste zadataka u listi zahteva za povlačenjem..

Sažetak liste zadataka u listi zahteva za povlačenjem.
Figure 104. Sažetak liste zadataka u listi zahteva za povlačenjem.

Ovo je neverovatno korisno kada otvorite zahtev za povlačenjem rano i koristite ga da pratite napredak kroz implementaciju.

Isečci koda

Možete da dodate i isečke koda u komentare. Ovo je posebno korisno kada želite da predstavite nešto što možete da probate da uradite pre nego što ga stvarno implementirate kao komit na grani. Ovo se takođe često koristi da se doda primer koda koji ne radi ili šta bi sve ovaj zahtev za povlačenjem mogao da implementira.

Da biste dodali isečak koda, treba da ga ograničite u kontra-apostrofima (```).

```java
for(int i=0 ; i < 5 ; i++)
{
   System.out.println("i is : " + i);
}
```

Ako dodate ime jezika kao što smo gore učinili sa java, GitHub će probati i da sintaksički oboji isečak. U slučaju gornjeg primera, render će izgledati kao na Renderovan isečak koda..

Renderovan isečak koda.
Figure 105. Renderovan isečak koda.
Citirnje

Ako odgovarate na manji deo većeg komentara, možete da selektivno citirate komentar tako što ćete linije početi karakterom >. Zapravo, ovo je toliko korisno i toliko često da postoji prečica sa tastature. Ako obeležite tekst u komentaru na koji želite da direktno odgovorite i pritisnite dirku r, u oblasti za kucanje komentara će se automatski dodati taj tekst, citiran.

Citati izgledaju nekako ovako:

> Whether 'tis Nobler in the mind to suffer
> The Slings and Arrows of outrageous Fortune,

How big are these slings and in particular, these arrows?

Kada se renderuje, komentar će izgledai kao na Primer renderovanog citata..

Primer renderovanog citata.
Figure 106. Primer renderovanog citata.
Emođi

Za kraj, možete da koristite i emođije u komentarima. Ovo se zapravo često koristi u komentarima koje vidite na mnogim GitHub-ovim tiketima i zahtevima za povlačenjem. Postoji čak i pomoćnik za emođije na GitHub-u. Ako kucate komentar i počnete sa karakterom :, autokomplit će vam pomoći da nađete ono što tražite.

Autokomplit za emođije u akciji.
Figure 107. Autokomplit za emođije u akciji.

Emođiji imaju oblik :<ime>: bilo gde u komentaru. Na primer, možete da napišete nešto ovako:

I :eyes: that :bug: and I :cold_sweat:.

:trophy: for :microscope: it.

:+1: and :sparkles: on this :ship:, it's :fire::poop:!

:clap::tada::panda_face:

Kada se renderuje, izgledaće otprilike kao na Komentar sa puno emođija..

Komentar sa puno emođija.
Figure 108. Komentar sa puno emođija.

Ovo nije nešto mnogo korisno, ali dodaje element zabave i emocije medijumu na kome je inače teško iskazati emocije.

Note

Zapravo postoji veliki broj veb servisa koji koriste emođi karaktere ovih dana. Odličan spisak na koji se možete pozvati da nađete emođi koji oslikava ono što želite da kažete nalazi se na:

Slike

Ovo tehnički nije Markdaun sa ukusom GitHub-a, ali je neverovatno korisno. Pored dodavanja linkova ka slikama u Markdaun komentarima, što možete biti teško prilikom nalaženja i embedovanja URL-ova, GitHub vam omogućava i da prevučete i pustite slike na oblasti za tekst i da ih tako embedujete.

Prevucite i pustite slike da biste ih aploudovali i automatski embedovali.
Figure 109. Prevucite i pustite slike da biste ih aploudovali i automatski embedovali.

Ako pogledate Reference u zahtevu za povlačenjem., videćete mali tekst Parsed as Markdown. Klikom na to će vam se otvoriti veliki pano sa svime što možete uraditi sa Markdaunom na GitHub-u.